web-dev-qa-db-ja.com

HAProxyからPROXYプロトコルヘッダーを送信する

私はおそらくこの主題に関する大量のドキュメントで迷子になっていますが、 http://www.haproxy.org/download/)で説明されているように、PROProxyプロトコルヘッダーを送信するようにHAProxyプロセスを構成しようとしています。 1.8/doc/proxy-protocol.txt 。これは、PROXYプロトコルのサポートをC++サーバーに書き込んで(クライアントのIP /ポートにアクセスできるようにするため)、コードがPROXYヘッダーの解析で適切に機能することをテストしたいためです。

これが私の最小限の設定ファイルです:

global
   maxconn 4096

defaults
   log   global
   mode   http
   retries   3
   option redispatch
   maxconn   2000
   timeout connect 5000
   timeout client  50000
   timeout server  50000

frontend TestServerTest
    bind 10.6.186.24:54781
    mode tcp
    default_backend TestServernodes

backend TestServernodes
    mode tcp
    # Note there is no 'check' after the below line unlike the others as we don't want to send the
    # healthcheck ("OPTIONS / HTTP/1.0"...) string to the TestServer as it doesn't understand it!
    server TestServer01 10.6.186.24:48080

HAProxyを起動して54781に接続すると、TestServerが48080で受信する最初のデータは、クライアントから送信されたデータであることがわかりました。私が投稿したリンクに記載されているPROXYヘッダーはではありません

誰かが私の構成に欠けているものを教えてくれますか?それにより、PROXYヘッダーがバックエンドサーバーに送信されません。

2
Wad

HAProxyメーリングリスト([email protected])に投稿した後、どちらかを追加する必要があるという回答を得ましたsend-proxyまたはsend-proxy-v2を私のバックエンドserver定義に。

私の更新された設定ファイルには次の行があります:

サーバーTestServer01 10.6.186.24:48080 send-proxy

... PROXYプロトコルのバージョン1を送信します。

バージョン2を送信するには、これを

サーバーTestServer01 10.6.186.24:48080 send-proxy-v2

5
Wad

リンクしたドキュメントごとに、完全な構成ではいくつかのコンポーネントを構成する必要があります。

実際のバックエンドの前にhaproxyインスタンスがある場合、accept-proxyを適用する必要があるかもしれません:

"accept-proxy"設定が "bind"キーワードに渡されると、待機ソケットはプロトコルを受け入れます。このようなリスナーで受け入れられた接続は、ソースが実際にプロトコルでアドバタイズされたものであるかのように動作します。これは、ロギング、ACL、コンテンツフィルタリング、透過プロキシなどに当てはまります。

これはあなたが答えで見つけた部分です、バックエンドサーバーはsend-proxyで設定する必要があります:

「サーバー」行に「送信プロキシ」設定が存在する場合、プロトコルはサーバーへの接続に使用できます。これはサーバーごとに有効になるため、リモートサーバーに対してのみ有効にしても、ローカルサーバーで異なる動作をさせることができます。着信接続が「accept-proxy」で受け入れられた場合、中継される情報は、この接続のPROXY行で通知されたものです。

そして、これは私がv2で見つけることができるものと同じです:

Haproxy 1.5は、PROXYプロトコルのバージョン2を送信側として実装しています。さらに、制限されたオプションのSSL情報を持つTLVが追加されました。

1