Liên kết với tất cả các giao diện cho IPv4 và IPv6 trong haproxy


13

Tôi muốn cấu hình haproxy để liên kết với một ổ cắm tcpcũng như tcp6trên tất cả các giao diện (ví dụ, 0.0.0.0:80:::80).

Tôi đã có thể đạt được mục tiêu này với các cài đặt sau:

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

Có cách nào ngắn hơn thế này không?

Mặc dù tôi mong đợi nó hoạt động khác đi, nhưng v4v6từ khóa làm cho haproxy chỉ liên kết với một ổ cắm v4.


3
Thế còn bind :::80 v4v6?
Michael - sqlbot

Trên thực tế, điều này hoạt động. Cảm ơn! Bạn có thể gửi nó dưới dạng câu trả lời xin vui lòng để tôi có thể cung cấp cho bạn tín dụng?
StephenKing

Câu trả lời:


25

Để nghe trên cùng một cổng cho IPv6 và IPv4, hãy sử dụng:

bind :::80 v4v6

Phải thừa nhận rằng đây là một phỏng đoán trực quan có vẻ đúng ... nhưng thay vì chỉ đăng một phỏng đoán "may mắn" như câu trả lời, mặc dù nó hoạt động, có vẻ như tôi nên biện minh cho nó.

từ khóa v4v6 làm cho haproxy chỉ liên kết với ổ cắm v4.

Trực giác đầu tiên của tôi là không v4v6phải việc sử dụng :80(hay chính xác hơn là việc sử dụng không có địa chỉ IP nào cả, chỉ là số cổng) khiến ổ cắm này chỉ nghe trên IPv4.

Điều này dường như được xác nhận trong các tài liệu cho bind:

addresslà tùy chọn và có thể là tên máy chủ, địa chỉ IPv4, địa chỉ IPv6 hoặc '*'. Nó chỉ định địa chỉ mà frontend sẽ lắng nghe. Nếu không được đặt, tất cả các địa chỉ IPv4 của hệ thống sẽ được lắng nghe. Điều tương tự sẽ áp dụng cho '*'hoặc địa chỉ đặc biệt của hệ thống " 0.0.0.0". Tương đương IPv6 là '::'.

http://cbonte.github.io/haproxy-dconv/configuration-1.6.html#4.2-bind (nhấn mạnh thêm)

Vì vậy, ba hình thức sau đây đều tương đương nhau và tất cả đều được HAProxy hiểu là IPv4:

bind :80
bind *:80
bind 0.0.0.0:80

Tiếp theo, có một câu trong các tài liệu v4v6có thể được đọc tách biệt để chỉ ra rằng v4v6có thể sử dụng được để mở rộng một trong các câu lệnh liên kết ở trên để nghe trên IPv6 ...

v4v6

Nó được sử dụng để liên kết một ổ cắm với cả IPv4 và IPv6 khi nó sử dụng địa chỉ mặc định.

... hmmm, nhưng tôi nghi ngờ rằng điều này thực sự có nghĩa là "địa chỉ mặc định v6" ( ::) ...

Làm như vậy đôi khi cần thiết trên các hệ thống liên kết với IPv6 theo mặc định.

... và bây giờ, tôi nghi ngờ nó nhiều hơn nữa ...

Nó không có tác dụng đối với các socket không phải IPv6 và bị v6onlytùy chọn ghi đè .

http://cbonte.github.io/haproxy-dconv/configuration-1.6.html#5.1

Vì vậy, có vẻ như v4v6chỉ sửa đổi các bindchỉ thị chỉ định địa chỉ nghe mặc định IPv6, đó là ::(thứ 3 :là dấu phân cách giữa địa chỉ và cổng) và bị bỏ qua cho các địa chỉ khác.


4

Câu trả lời được chấp nhận không hoạt động đối với tôi, ít nhất là với haproxy-1.6.11p0 trên OpenBSD. Ngoài ra, TL; DR. Cứ làm đi:

bind 0.0.0.0:80
bind :::80

và nó sẽ hoạt động:

# netstat -an|grep "*.80"
tcp          0      0  *.80                   *.*                    LISTEN
tcp6         0      0  *.80                   *.*                    LISTEN
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.