ผูกกับอินเตอร์เฟสทั้งหมดสำหรับ IPv4 และ IPv6 ใน haproxy


13

ฉันต้องการกำหนดค่าhaproxyให้เชื่อมต่อtcpกับtcp6ซ็อกเก็ตบนอินเตอร์เฟสทั้งหมด (เช่น0.0.0.0:80และ:::80)

ฉันสามารถบรรลุเป้าหมายนี้ด้วยการตั้งค่าต่อไปนี้:

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

มีวิธีที่สั้นกว่านี้ไหม?

ในขณะที่ฉันคาดว่ามันจะทำงานแตกต่างกันv4v6คำหลักทำให้haproxyผูกกับซ็อกเก็ต v4 เท่านั้น


3
เกี่ยวกับbind :::80 v4v6อะไร
Michael - 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 เมื่อมันใช้ที่อยู่เริ่มต้น

... hmmm แต่ฉันสงสัยว่านี่หมายถึง "ที่อยู่เริ่มต้น 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.