Ikat semua antarmuka untuk IPv4 dan IPv6 di haproxy

13

Saya ingin mengkonfigurasi haproxy untuk mengikat ke soket tcpserta tcp6pada semua antarmuka (yaitu, 0.0.0.0:80dan :::80).

Saya dapat mencapai tujuan ini dengan pengaturan berikut:

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

Apakah ada cara yang lebih pendek dari ini?

Sementara saya berharap untuk berperilaku berbeda, v4v6kata kunci membuat haproxy mengikat ke soket v4 saja.

Stephen King
sumber
3
Bagaimana dengan bind :::80 v4v6?
Michael - sqlbot
Sebenarnya ini berhasil. Terima kasih! Bisakah Anda mengajukannya sebagai jawaban agar saya dapat memberi Anda kredit?
Stephen King

Jawaban:

25

Untuk mendengarkan pada port yang sama untuk IPv6 dan IPv4, gunakan ini:

bind :::80 v4v6

Memang, ini adalah dugaan intuitif yang tampaknya benar ... tetapi alih-alih hanya memposting tebakan "beruntung" sebagai jawabannya, meskipun berhasil, sepertinya saya harus membenarkannya.

kata kunci v4v6 membuat haproxy mengikat hanya ke soket v4.

Intuisi pertama saya adalah bahwa ini bukan v4v6hanya penggunaan :80(atau, lebih tepatnya, tidak menggunakan alamat IP sama sekali, hanya nomor port) yang menyebabkan soket ini hanya mendengarkan IPv4.

Ini tampaknya dikonfirmasi dalam dokumen untuk bind:

addressopsional dan dapat berupa nama host, alamat IPv4, alamat IPv6, atau '*'. Ini menunjuk alamat yang akan didengar oleh frontend. Jika tidak disetel, semua alamat IPv4 sistem akan didengarkan. Hal yang sama akan berlaku untuk '*'atau alamat khusus sistem " 0.0.0.0". Setara IPv6 adalah '::'.

http://cbonte.github.io/haproxy-dconv/configuration-1.6.html#4.2-bind (penekanan ditambahkan)

Jadi tiga bentuk berikut semuanya setara, dan semua ditafsirkan sebagai IPv4 oleh HAProxy:

bind :80
bind *:80
bind 0.0.0.0:80

Selanjutnya, ada satu kalimat dalam dokumen untuk v4v6dapat dibaca secara terpisah untuk menunjukkan bahwa v4v6mungkin dapat digunakan untuk memperpanjang salah satu pernyataan ikatan di atas untuk mendengarkan pada IPv6 ...

v4v6

Ini digunakan untuk mengikat socket ke IPv4 dan IPv6 ketika menggunakan alamat default.

... hmmm, tapi saya curiga ini sebenarnya berarti "alamat default v6" ( ::) ...

Melakukan hal itu kadang-kadang diperlukan pada sistem yang mengikat IPv6 hanya secara default.

... dan sekarang, saya curiga bahkan lebih ...

Ini tidak berpengaruh pada soket non-IPv6, dan diganti oleh v6onlyopsi.

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

Jadi, tampaknya v4v6hanya memodifikasi bindarahan yang menentukan alamat mendengarkan default IPv6, yaitu ::(yang ke-3 :adalah pemisah antara alamat dan port), dan diabaikan untuk orang lain.

Michael - sqlbot
sumber
5

Jawaban yang diterima tidak berfungsi untuk saya, setidaknya dengan haproxy-1.6.11p0 di OpenBSD. Juga, TL; DR. Lakukan saja:

bind 0.0.0.0:80
bind :::80

dan itu akan berhasil:

# netstat -an|grep "*.80"
tcp          0      0  *.80                   *.*                    LISTEN
tcp6         0      0  *.80                   *.*                    LISTEN
foobar
sumber