Tráfico TCP duplicado con un proxy
duplicates traffic (4)
Necesito enviar (duplicar) el tráfico de una máquina (puerto) y a dos máquinas diferentes (puertos). También tengo que ocuparme de la sesión TCP.
Al principio usé em-proxy , pero me parece que la sobrecarga es bastante grande (supera el 50% de la CPU). Luego instalé haproxy y logré redirigir el tráfico (no duplicar). Los gastos generales son razonables (menos del 5%).
El problema es que no pude decir en el archivo de configuración de haproxy lo siguiente:
- escuche en una dirección específica: puerto y lo que encuentre enviar en las dos máquinas diferentes: puertos y descarte las respuestas de una de ellas.
El código Em-proxy para esto es bastante simple, pero me parece que EventMachine genera muchos gastos generales.
Antes de ingresar el código haproxy e intentar cambiar (duplicar el tráfico), me gustaría saber si hay algo similar por ahí.
Gracias.
¿Qué tal el ROUTE target
la ruta experimental de iptables? Tiene una opción "tee" para reflejar el tráfico:
http://www.netfilter.org/projects/patch-o-matic/pom-external.html#pom-external-ROUTE
Lo que te permitiría reflejar el tráfico con algo como:
iptables -A PREROUTING -t mangle -p tcp --dport 80 -j ROUTE --gw 1.2.3.4 --tee iptables -A POSTROUTING -t mangle -p tcp --sport 80 -j ROUTE --gw 1.2.3.4 --tee
La segunda máquina debería estar en la misma subred y debería escuchar en la dirección IP de destino (y no responder a arps) o escuchar de forma promiscua.
He creado un proxy sólo para este propósito.
https://github.com/chrislusf/teeproxy
Uso
./teeProxy -l :8888 -a localhost:9000 -b localhost:9001
tee-proxy es un proxy inverso. Para cada solicitud entrante, clona la solicitud en 2 y luego las reenvía a 2 servidores. Los resultados del servidor a
se devuelven como de costumbre, pero los resultados del servidor b
se ignoran.
tee-proxy maneja los métodos GET
, POST
y otros métodos HTTP.
Pruebe https://github.com/agnoster/duplicator .
Intenté https://github.com/chrislusf/teeproxy pero obtuve resultados extraños con algunas solicitudes distintas a las de GET.
También he escrito un proxy inverso / equilibrador de carga para un propósito similar con Node.js (es solo por diversión, no listo para producción en este momento).
https://github.com/losnir/ampel
Es muy criticado, y actualmente apoya:
-
GET
uso de la selección de round-robin (1: 1) -
POST
Usando la división de solicitudes. No hay un concepto de "maestro" y "sombra": el primer backend que responde es el que atenderá la solicitud del cliente, y luego se descartarán todas las demás respuestas.
Si alguien lo encuentra útil, puedo mejorarlo para que sea más flexible.