Щоб слухати один і той же порт для 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?