มันคือ การกำหนดเส้นทาง ปัญหา. iptables ไม่ได้กำหนดเส้นทาง แต่การกำหนดเส้นทางอาจได้รับผลกระทบจากที่อยู่ที่สามารถเปลี่ยนแปลงได้ และนั่นคือสาเหตุ iptables มักถูกสันนิษฐานว่าทำการกำหนดเส้นทางอย่างผิดพลาด เพราะเหตุนี้ iptables ไม่สามารถ เดอะ วิธีแก้ไขปัญหา (แต่บางครั้งอาจเป็นส่วนหนึ่งของวิธีแก้ปัญหาดังกล่าว)
ยิ่งกว่านั้นความพยายามที่จะเปลี่ยนแปลงก ตอบ แพ็กเก็ตที่ใช้ NAT ของ Netfilter/iptables จะถูกละเว้น: the แนท ตารางจะถูกเรียกใช้สำหรับแพ็กเก็ตแรกของโฟลว์เท่านั้น ไม่ใช่สำหรับการตอบกลับ: iptables -t nat -A OUTPUT -p tcp --match multiport --sports 8443,8080 -j DNAT --to 172.24.248.201 จะไม่ตรงกัน และถ้าสามารถจับคู่ได้ สิ่งนี้จะไม่ทำงาน เนื่องจากปลายทางของการตอบกลับจะต้องเป็นต้นทางของข้อความค้นหาเริ่มต้นที่เซิร์ฟเวอร์จริงเห็น: ที่อยู่ IP ของไคลเอ็นต์ระยะไกลจริง ไม่ใช่ L3 LB
ด้านล่างนี้เป็นวิธีการง่ายๆ ในการดำเนินการอย่างถูกต้องบนเซิร์ฟเวอร์จริง: ด้วย การกำหนดเส้นทางนโยบาย.
ในปัญหาเฉพาะและคำตอบนี้ฉันจะถือว่า เคอร์เนลลินุกซ์ >= 4.17 สำหรับ "ขยายการสนับสนุนการจับคู่กฎ fib เพื่อรวมการแข่งขันกีฬา dport และ ip proto" ซึ่งหลีกเลี่ยงการใช้ที่ซับซ้อนของ iptables เพื่อทำเครื่องหมายแพ็คเก็ต (แต่ยังคงต้องมีการกำหนดเส้นทางนโยบายอยู่ดี)
เราต้องแน่ใจว่าพอร์ตเฉพาะของเซิร์ฟเวอร์จริงไม่สามารถทับซ้อนกับช่วงพอร์ตไดนามิกของเซิร์ฟเวอร์จริง (ใช้เมื่อเซิร์ฟเวอร์เป็นไคลเอ็นต์ เช่น สำหรับการสืบค้น DNS หรือการอัปเกรดระบบ):
# sysctl net.ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 32768 60999
ตรวจสอบให้แน่ใจว่าพอร์ตด้านล่างอยู่เหนือพอร์ตสูงสุดของเซิร์ฟเวอร์จริงที่ใช้สำหรับบริการ ที่นี่: 32768 > 8443 ก็ดีพอ
เพิ่มตารางเส้นทางสำหรับทราฟฟิกเฉพาะที่ต้องการใช้ L3 LB เป็นเกตเวย์ ตาราง 248201 เป็นค่าที่เลือกโดยพลการ ฉันสมมติว่าชื่ออินเทอร์เฟซของเซิร์ฟเวอร์จริง eth0โปรดดัดแปลง:
เส้นทาง ip เพิ่มค่าเริ่มต้นผ่าน 172.24.248.201 dev eth0 ตาราง 248201
เพิ่มตัวเลือก: หนึ่งรายการต่อช่วงพอร์ต อาจเป็นช่วงเดียวที่กว้าง (ตราบใดที่ไม่มีการโต้ตอบกับพอร์ตไดนามิก ก็ไม่เกี่ยว) หรือกฎ X สำหรับ X ที่แตกต่างกัน สำหรับช่วงเดียว:
กฎ ip เพิ่ม iif lo ipproto tcp sport 8000-8443 ค้นหา 248201
ที่ไหน ไอฟ โล เป็นไวยากรณ์พิเศษสำหรับทราฟฟิกขาออกที่เริ่มต้นในเครื่อง และไม่เกี่ยวกับ แท้จริง อินเตอร์เฟซ.
ตอนนี้ทราฟฟิกขากลับที่ตั้งใจไว้ทั้งหมดจะถูกกำหนดเส้นทางโดยใช้ L3 LB เป็นเกตเวย์ การรับส่งข้อมูลอื่น ๆ จะใช้เกตเวย์เริ่มต้นตามปกติหากจำเป็น
ฉันไม่คิดว่า สพร ควรเป็นปัญหาหากเปิดใช้งาน เว้นแต่ว่าเกตเวย์เริ่มต้นตามปกติของเซิร์ฟเวอร์จะใช้อินเทอร์เฟซอื่น ถ้านี่เป็นปัญหาก็เป็นไปได้ ตั้งเป็นโหมด Loose แทน.
จะทำเฉพาะในกรณีที่ไม่ได้ผล (และถึงอย่างนั้น eth0 อาจจะเพียงพอแทน ทั้งหมด ด้านล่าง):
sysctl -w net.ipv4.conf.all.rp_filter=2