Я хочу настроить haproxy для привязки к a, tcp
а также к tcp6
сокету на всех интерфейсах (т.е. 0.0.0.0:80
и :::80
).
Мне удалось достичь этой цели с помощью следующих настроек:
listen web
bind :80 v4v6
bind :::80 v6only
Есть ли более короткий путь, чем этот?
Хотя я ожидаю, что он будет вести себя по-другому, v4v6
ключевое слово заставляет haproxy связываться только с сокетом v4.
bind :::80 v4v6
?Ответы:
Чтобы прослушивать один и тот же порт для IPv6 и IPv4, используйте это:
По общему признанию, это было интуитивное предположение, которое, кажется, было правильным ... но вместо того, чтобы просто опубликовать «счастливое» предположение в качестве ответа, даже если оно работает, кажется, что я должен оправдать его.
Моя первая интуиция заключалась в том, что это не
v4v6
использование:80
(или, точнее, использование вообще никакого IP-адреса, а просто номера порта), которое заставляет этот сокет прослушивать только IPv4.Это подтверждается в документах для
bind
:Таким образом, следующие три формы все эквивалентны, и все интерпретируются как IPv4 HAProxy:
Далее, в документах есть одно предложение, которое
v4v6
можно прочитать изолированно, чтобы указать, что егоv4v6
можно использовать для расширения одного из приведенных выше операторов связывания для прослушивания IPv6 ...... хм, но я подозреваю, что это на самом деле означает "адрес по умолчанию v6" (
::
) ...... а теперь я подозреваю, что это еще больше ...
Таким образом, кажется, что
v4v6
изменяются толькоbind
директивы, которые задают адрес прослушивания по умолчанию для IPv6, который является::
(3-й:
- это разделитель между адресом и портом) и игнорируется для других.источник
Принятый ответ не работает для меня, по крайней мере, с haproxy-1.6.11p0 на OpenBSD. Также TL; DR. Просто сделать:
и это будет работать:
источник