haproxyのIPv4およびIPv6のすべてのインターフェイスにバインドする


13

私には、configureにしたいhaproxyに結合するtcpだけでなく、tcp6すべてのインターフェイス上のソケット(すなわち、0.0.0.0:80:::80)。

次の設定でこの目標を達成できました。

listen web
  bind :80 v4v6
  bind :::80 v6only

これより短い方法はありますか?

私はそれが異なる振る舞いをすると予想しますが、v4v6キーワードはhaproxyをv4ソケットのみにバインドします。


3
どうbind :::80 v4v6
マイケル-sqlbot

実際、これは機能します。ありがとう!回答として提出してもらえますか?
StephenKing

回答:


25

同じポートでIPv6とIPv4をリッスンするには、次を使用します。

bind :::80 v4v6

確かに、これは正しいように思われる直感的な推測でした...しかし、単に「幸運な」推測を答えとして投稿するのではなく、うまくいくとしても、それを正当化する必要があるようです。

v4v6キーワードは、haproxyをv4ソケットのみにバインドします。

私の最初の直観は、このソケットがIPv4のみでリッスンする原因v4v6ではなく、むしろ:80(より正確には、IPアドレスをまったく使用せず、ポート番号のみを使用する)使用であるということでした。

これは、ドキュメントで確認されているようですbind

addressオプションであり、ホスト名、IPv4アドレス、IPv6アドレス、または'*'。フロントエンドがリッスンするアドレスを指定します。設定されていない場合、システムのすべてのIPv4アドレスがリスニングされます。同じことが適用される'*'か、システムの特別なアドレス「0.0.0.0」。同等のIPv6は「::」です。

http://cbonte.github.io/haproxy-dconv/configuration-1.6.html#4.2-bind(強調を追加)

したがって、次の3つの形式はすべて同等であり、すべてHAProxyによってIPv4として解釈されます。

bind :80
bind *:80
bind 0.0.0.0:80

次に、上記のバインドステートメントの1つを拡張してIPv6でリッスンするために使用できる可能性があることv4v6を示すために、ドキュメント内に1つの文を単独で読むことができv4v6ます...

v4v6

これは、デフォルトアドレスを使用するときに、ソケットをIPv4とIPv6の両方にバインドするために使用されます。

...うーん、しかし、これは実際には「v6のデフォルトアドレス」(::)を意味すると思う...

デフォルトでのみIPv6にバインドするシステムでは、そうすることが必要な場合があります。

...そして今、私はそれをさらに疑っています...

非IPv6ソケットには効果がなく、v6onlyオプションによってオーバーライドされます。

http://cbonte.github.io/haproxy-dconv/configuration-1.6.html#5.1

そのため、IPv6のデフォルトリスンアドレスを指定v4v6するbindディレクティブのみを変更しているように見えます。これは::(3番目:はアドレスとポートの間の区切り文字です)、他の場合は無視されます。


4

少なくともOpenBSDのhaproxy-1.6.11p0では、受け入れられた答えは私には機能しません。また、TL; DR。ただやる:

bind 0.0.0.0:80
bind :::80

そしてそれは動作します:

# netstat -an|grep "*.80"
tcp          0      0  *.80                   *.*                    LISTEN
tcp6         0      0  *.80                   *.*                    LISTEN
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.