Щоб слухати один і той же порт для IPv6 та IPv4, використовуйте це:
bind :::80 v4v6
Справді, це було інтуїтивно зрозумілим здогадком, яке, здається, було правильним ... але замість того, щоб просто опублікувати "щасливий" здогад як відповідь, хоча це працює, схоже, я мушу це виправдати.
ключове слово v4v6 змушує хапрокси прив'язуватися лише до 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-й :
- це роздільник між адресою та портом), і ігнорується для інших.
bind :::80 v4v6
?