Прив’язати до всіх інтерфейсів для IPv4 та IPv6 в haproxy


13

Я хочу налаштувати хапрокси для прив'язки до сокета, tcpа також tcp6сокета на всіх інтерфейсах (тобто, 0.0.0.0:80і :::80).

Мені вдалося досягти цієї мети за допомогою таких налаштувань:

listen web
  bind :80 v4v6
  bind :::80 v6only

Чи є коротший шлях від цього?

Хоча я очікую, що він поводиться по-різному, v4v6ключове слово змушує хапрокси прив'язуватися лише до v4-сокета.


3
Про що bind :::80 v4v6?
Michael - sqlbot

Власне, це працює. Дякую! Чи можете ви подати це як відповідь, будь ласка, щоб я міг дати вам кредит?
StephenKing

Відповіді:


25

Щоб слухати один і той же порт для 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-й :- це роздільник між адресою та портом), і ігнорується для інших.


5

Прийнята відповідь не працює для мене, принаймні, з 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.