web-dev-qa-db-fra.com

Dupliquer TCP trafic avec un proxy

J'ai besoin d'envoyer (dupliquer) le trafic d'une machine (port) et à deux machines différentes (ports). Je dois aussi m'occuper de TCP session.

Au début, j’utilisais em-proxy , mais il me semble que les frais généraux sont assez importants (plus de 50% du cpu). Puis j’ai installé haproxy et j’ai réussi rediriger le trafic (ne pas dupliquer). Les frais généraux sont raisonnables (moins de 5%).

Le problème est que je ne pourrais pas dire dans le fichier de configuration haproxy:
- écoutez une adresse spécifique: port et tout ce que vous trouvez, envoyez-le sur les deux [] machines: ports et supprimez les réponses de l'une d'entre elles.

Le code Em-proxy pour cela est assez simple, mais il me semble que EventMachine génère Beaucoup d’overhead.

Avant de creuser dans le code haproxy et d’essayer de modifier (trafic en double), je voudrais que Sache qu’il existe quelque chose de similaire.

Merci.

25
ufffffff

J'ai créé un proxy juste à cette fin.

https://github.com/chrislusf/teeproxy

Utilisation

./teeProxy -l :8888 -a localhost:9000 -b localhost:9001

tee-proxy est un proxy inverse. Pour chaque demande entrante, il clone la demande en 2 puis les transmet à 2 serveurs. Les résultats du serveur a sont renvoyés comme d'habitude, mais les résultats du serveur b sont ignorés.

tee-proxy gère les méthodes GET, POST et les autres méthodes HTTP.

22
chrislusf

Qu'en est-il du ROUTE target expérimental iptables? Il a une option "tee" pour refléter le trafic:

http://www.netfilter.org/projects/patch-o-matic/pom-external.html#pom-external-ROUTE

Ce qui vous permettrait de refléter le trafic avec quelque chose comme:

iptables -A PREROUTING -t mangle -p tcp --dport 80 -j ROUTE --gw 1.2.3.4 --tee 
 iptables -A mannequin -p mangle -p tcp --sport 80 -j ROUTE - gw 1.2.3.4 --tee

Le deuxième ordinateur devrait être sur le même sous-réseau et devrait soit écouter sur l'adresse IP cible (et ne pas répondre aux arps), soit écouter à la lueur.

9
MattH

Essayez https://github.com/agnoster/duplicator .

J'ai essayé teeproxy mais j'ai obtenu des résultats étranges avec certaines demandes autres que GET.

3
rsilva4

J'ai également écrit un équilibreur proxy/charge inverse dans un but similaire avec Node.js (c'est juste pour le plaisir, pas pour la production en ce moment).

https://github.com/losnir/ampel

Il est très avisé et supporte actuellement:

  • GET Utilisation de la sélection à tour de rôle (1: 1)
  • POST Utilisation du fractionnement de demande. Il n'y a pas de concept de "maître" ni d '"ombre" - le premier système qui répond est celui qui servira la demande du client, puis toutes les autres réponses seront ignorées.

Si quelqu'un le trouve utile, je peux l'améliorer pour qu'il soit plus flexible.

0
losnir

J'avais besoin de quelque chose qui puisse aussi toucher le trafic TCP, mais sans être intrusif et ne pas pouvoir mettre quelque chose entre les deux comme un proxy inverse par exemple.

Ce que j’ai fait, c’est essentiellement d’utiliser la logique tcpdump/Wirehark (renifleur de paquets) dans un processus Go que vous pouvez configurer pour effectuer certaines tâches. 

Pour qui cela peut être utile, le code peut être trouvé ici: https://github.com/RobinUS2/teecp

0
RobinUS2