Привязка ко всем интерфейсам для IPv4 и IPv6 в haproxy

13

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

Мне удалось достичь этой цели с помощью следующих настроек:

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

Есть ли более короткий путь, чем этот?

Хотя я ожидаю, что он будет вести себя по-другому, v4v6ключевое слово заставляет haproxy связываться только с сокетом v4.

Стивен Кинг
источник
3
Как насчет bind :::80 v4v6?
Майкл - sqlbot
На самом деле, это работает. Благодарность! Можете ли вы подать его как ответ, пожалуйста, чтобы я мог дать вам кредит?
StephenKing

Ответы:

25

Чтобы прослушивать один и тот же порт для 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 (выделение добавлено)

Таким образом, следующие три формы все эквивалентны, и все интерпретируются как IPv4 HAProxy:

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-й :- это разделитель между адресом и портом) и игнорируется для других.

Майкл - sqlbot
источник
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
Foobar
источник