web-dev-qa-db-ja.com

haproxy-tcpモードで元の/リモートIPを渡す

PerpraクラスターのロードバランシングとIPフェイルオーバーのためにkeepalivedでhaproxyをセットアップしました。それがうまく機能するので、別のサービス/デーモンに同じlb /フェイルオーバーを使用したいと思います。

私はこのようにhaproxyを設定しました:

listen my_service 0.0.0.0:4567
    mode tcp
    balance leastconn
    option tcpka
    contimeout      500000
    clitimeout      500000
    srvtimeout      500000

    server Host1 xxx.xxx.xxx.xx1:4567 check port 4567 inter 5000 rise 3 fall 3
    server Host2 xxx.xxx.xxx.xx2:4567 check port 4567 inter 5000 rise 3 fall 3

ロードバランシングは正常に機能しますが、サービスはクライアントの実際のIPではなく、ロードバランサーのIPを認識します。 httpモードでは、リモートIPに沿ってhaproxyを渡すのは非常に簡単ですが、tcpモードではどうすればよいですか?これは、負荷分散する必要のあるサービスの性質上重要です。

ありがとう!ヴィート

8
Vito Botta

将来の参考までに、keepalivedはロードバランシングではなくフェイルオーバーのソリューションです(おそらくLVSを意味しますか?)。 HAProxyの透過プロキシモードは、元のIPを送信する特別な方法とは何の関係もありません。これは、標準のHTTPヘッダーを使用できる通常の非透過HTTPモードです。

私の意見では、元の質問に対する正解は次のとおりです。TPROXY対応のLinuxカーネルのHAProxyで透過プロキシサポートをコンパイルできます。これと適切なTPROXYサポートバージョン+同じマシン上のiptablesの構成により、実際に完全に透過的なTCPプロキシサポートが可能になります。つまり、バックエンドサーバーには特別な設定は必要ありません。

これは実際にはHAProxyの推奨セットアップではなく、どうしても必要な場合にのみ使用してください。

3
Robbert

Haproxyには、私が今まで見たことがない、または何もしたくない、ある種の「トランスペアレント」モードがあるようです。それ以外の場合は、バックエンドサービスが元のIP( "PROXY blahblah")を送信するhaproxyの特別な方法について教えて、サービスから元のIPを引き出す必要があります。

なぜあなたはhaproxyに悩まされているのですか?キープアライブはすでに用意されており、適切な透過的な負荷分散も行います。

2
womble

構成で(サーバーごとに)send-proxyを使用すると、TCP=モードでも、受信サーバー側で元のソースIPが提供されます。これにはHAProxy 1.5以降が必要です。

HAProxy DocumentationProxy Protocol に関する詳細情報を見つけることができます。

listen my_service 0.0.0.0:4567
mode tcp
balance leastconn
option tcpka
contimeout      500000
clitimeout      500000
srvtimeout      500000

server Host1 xxx.xxx.xxx.xx1:4567 send-proxy check port 4567 inter 5000 rise 3 fall 3
server Host2 xxx.xxx.xxx.xx2:4567 send-proxy check port 4567 inter 5000 rise 3 fall 3
2
Nils Schmidt

HAProxyをNATモードとして設定できます。これは、レイヤー4でTCPモードを使用しますが、IPを透過的にします。

HAProxyレイヤー4ロードバランシングNATモード


一方、HAPorxyトランスペアレントモードはレイヤー7でHTTPモードを使用します。これは、HTTPモードにforwardforオプションがすでにあるため、問題になりません。

HAProxyレイヤー7負荷分散透過プロキシモード

2
Nick Tsai