すべてのインターフェイス(つまり、tcp6
および0.0.0.0:80
)の:::80
ソケットだけでなく、tcp
にもバインドするように haproxy を構成したいと思います。
次の設定でこの目標を達成することができました。
listen web
bind :80 v4v6
bind :::80 v6only
これより短い方法はありますか?
動作が異なると思いますが、v4v6
キーワードを使用すると、haproxyがv4ソケットのみにバインドされます。
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番目の:
は、アドレスとポート)、その他の場合は無視されます。
受け入れられた回答は、少なくとも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