web-dev-qa-db-ja.com

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

すべてのインターフェイス(つまり、tcp6および0.0.0.0:80)の:::80ソケットだけでなく、tcpにもバインドするように haproxy を構成したいと思います。

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

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

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

動作が異なると思いますが、v4v6キーワードを使用すると、haproxyがv4ソケットのみにバインドされます。

13
StephenKing

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

次に、v4v6のドキュメントに1文あり、v4v6は上記のバインドステートメントのいずれかを拡張してIPv6でリッスンするように拡張できることを示しています。

v4v6

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

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

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

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

これは非IPv6ソケットには影響せず、v6onlyオプションによってオーバーライドされます。

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

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

25

受け入れられた回答は、少なくとも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
5
foobar