Я хочу настроить haproxy привязать к tcp
так же как tcp6
сокет на всех интерфейсах (т.е. 0.0.0.0:80
и :::80
).
Мне удалось достичь этой цели со следующими настройками:
listen web
bind :80 v4v6
bind :::80 v6only
Есть ли путь короче этого?
Хотя я ожидаю, что он будет вести себя иначе, v4v6
ключевое слово делает haproxy привязать только к сокету v4.
Чтобы прослушивать один и тот же порт для IPv6 и IPv4, используйте это:
bind :::80 v4v6
По общему признанию, это было интуитивное предположение, которое, похоже, было правильным ... но вместо того, чтобы просто опубликовать "счастливое" предположение в качестве ответа, даже если оно работает, мне кажется, что я должен его оправдать.
ключевое слово v4v6 заставляет haproxy связываться только с сокетом v4.
Моя первая интуиция заключалась в том, что это не v4v6
а скорее использование :80
(или, точнее, использование вообще без IP-адреса, только номер порта), что заставляет этот сокет прослушивать только IPv4.
Кажется, это подтверждается в документации для bind
:
address
не является обязательным и может быть именем хоста, IPv4-адресом, IPv6-адресом или'*'
. Он обозначает адрес, который будет прослушивать веб-интерфейс. Если не задано, будут прослушиваться все IPv4-адреса системы. То же самое относится и к'*'
или специальный адрес системы "0.0.0.0
". Эквивалент IPv6 - "::".http://cbonte.github.io/haproxy-dconv/configuration-1.6.html#4.2-bind (курсив мой)
Таким образом, следующие три формы эквивалентны и все интерпретируются HAProxy как IPv4:
bind :80
bind *:80
bind 0.0.0.0:80
Далее в документации есть одно предложение для v4v6
можно читать отдельно, чтобы указать, что v4v6
может быть использовано для расширения одного из приведенных выше операторов связывания для прослушивания IPv6 ...
v4v6
Он используется для привязки сокета к IPv4 и IPv6, когда он использует адрес по умолчанию.
... хммм, но я подозреваю, что это на самом деле означает "адрес по умолчанию v6" (::
) ...
Иногда это необходимо в системах, которые привязаны к IPv6 только по умолчанию.
... а теперь подозреваю даже больше ...
Он не влияет на сокеты, не поддерживающие IPv6, и отменяется
v6only
вариант.http://cbonte.github.io/haproxy-dconv/configuration-1.6.html#5.1
Итак, получается, что v4v6
только изменяет bind
директивы, которые определяют адрес прослушивания IPv6 по умолчанию, который ::
(3-й :
является разделителем между адресом и портом) и игнорируется для других.
Принятый ответ у меня не работает, по крайней мере, с haproxy-1.6.11p0 на OpenBSD. Также TL; DR. Просто сделать:
bind 0.0.0.0:80
bind :::80
и он будет работать:
# netstat -an|grep "*.80"
tcp 0 0 *.80 *.* LISTEN
tcp6 0 0 *.80 *.* LISTEN