web-dev-qa-db-ja.com

プロキシを使用してTCPトラフィックを複製する

1台のマシン(ポート)から2台の異なるマシン(ポート)にトラフィックを送信(複製)する必要があります。 TCPセッションも処理する必要があります。

最初は em-proxy を使用しましたが、オーバーヘッドが非常に大きいようです(CPUの50%を超えています)。次に、 haproxy をインストールし、トラフィックをリダイレクトすることができました(重複しないように)。オーバーヘッドは妥当です(5%未満)。

問題は、haproxy設定ファイルで次のように言うことができなかったことです。
-特定のアドレス:ポートと、2つの異なるマシン:ポートで送信されたものをリッスンし、そのうちの1つからの回答を破棄します。

このためのEmプロキシコードは非常に単純ですが、EventMachineは多くのオーバーヘッドを生成するように思われます。

Haproxyコードを掘り下げて変更(トラフィックの重複)を試みる前に、似たようなものはありますか?

ありがとう。

26
ufffffff

この目的のためだけにプロキシを作成しました。

https://github.com/chrislusf/teeproxy

使用法

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

tee-proxyはリバースプロキシです。着信リクエストごとに、リクエストを2つに複製してから、2つのサーバーに転送します。サーバーaからの結果は通常どおり返されますが、サーバーbからの結果は無視されます。

tee-proxyは、GETPOST、およびその他のHTTPメソッドの両方を処理します。

23
chrislusf

Iptablesの実験はどうですかROUTE target?トラフィックをミラーリングするための「ティー」オプションがあります。

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

これにより、次のようなものでトラフィックをミラーリングできます。

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

2番目のマシンは同じサブネット上にある必要があり、ターゲットIPアドレスでリッスンする(arpsに応答しない)か、無差別にリッスンする必要があります。

9
MattH

https://github.com/agnoster/duplicator を試してください。

teeproxy を試しましたが、GET以外のリクエストで奇妙な結果が得られました。

3
rsilva4

Node.jsを使用して、同様の目的でリバースプロキシ/ロードバランサーも作成しました(これは単なる楽しみであり、現時点では本番環境に対応していません)。

https://github.com/losnir/ampel

それは非常に意見があり、現在サポートしています:

  • GETラウンドロビン選択の使用(1:1)
  • POSTリクエスト分割を使用します。 「マスター」と「シャドウ」の概念はありません。最初に応答するバックエンドはクライアント要求を処理するバックエンドであり、その後、他のすべての応答は破棄されます。

誰かがそれが役に立つと思うなら、私はそれをより柔軟になるように改善することができます。

0
losnir

TCPトラフィックもティーすることができるものが必要でしたが、邪魔にならないため、たとえばリバースプロキシとして間に何かを置くことができませんでした。

私がやったことは基本的に、tcpdump/Wiresharkロジック(パケットスニッフィング)を使用して、いくつかのことを実行するように構成できるGoプロセスでラップすることです。

コードが役立つ場合があります: https://github.com/RobinUS2/teecp

0
RobinUS2