ฉันมีกรณีการใช้งานแปลก ๆ ซึ่งพ็อดที่ทำงานใน Azure Kubernetes จำเป็นต้องกำหนดเส้นทางทราฟฟิกจากพอร์ตเฉพาะไปยังเป้าหมายเฉพาะผ่านอุโมงค์ VPN เฉพาะ แต่เป้าหมายเหล่านั้นเป็น IP ส่วนตัว ดังนั้นจึงสามารถมี IP เดียวกันสำหรับเป้าหมายที่แตกต่างกัน พ็อดนอกเหนือจากการกำหนดเส้นทางยังเป็นเซิร์ฟเวอร์ OpenVPN ที่เป้าหมายเชื่อมต่อด้วย ตัวอย่าง:
การสื่อสารที่มาถึงพอร์ต 10 จะถูกส่งไปยัง IP 10.0.0.4:80 ผ่าน VPN IP 10.118.0.2
และในเวลาเดียวกัน เราสามารถมี:
การสื่อสารที่มาถึงพอร์ต 20 จะถูกส่งไปยัง IP 10.0.0.4:80 ผ่าน VPN IP 10.118.0.3
แม้ว่า IP เป้าหมายจะเหมือนกัน แต่เป็นคนละเครื่องกัน ดังนั้นเพื่อให้บรรลุเป้าหมายนี้ ฉันจึงคิดวิธีแก้ปัญหาที่เป็นไปได้นี้:
/sbin/iptables --table mangle --insert PREROUTING --destination "192.168.0.100" -i eth0 -p tcp --dport "10" --jump MARK --set-mark "10"
/sbin/iptables --table nat --insert PREROUTING --destination "192.168.0.100" -i eth0 -p tcp --dport "10" --jump DNAT --to-destination "10.0.0.4:80"
/sbin/ip rule เพิ่ม prio "10" จากทั้งหมด fwmark "10" ค้นหา "10"
/sbin/ip เส้นทางเพิ่ม "10.0.0.4" ผ่าน "10.118.0.2" ตาราง 10
สิ่งนี้จะช่วยให้การสื่อสารทั้งสองทำงานพร้อมกันโดยที่ทราฟฟิกถูกส่งไปยังเครื่องที่ถูกต้อง แต่สิ่งที่ฉันเห็นคือมีการทำเครื่องหมายแพ็กเก็ตในตาราง mangle แต่ไปไม่ถึงตาราง NAT ฉันพบว่ามันเกี่ยวข้องกับ rt_filter เพิ่มเติมเกี่ยวกับด้านล่าง ตามที่เป็นอยู่ในขณะนี้และใช้งานได้ดังนี้:
/sbin/iptables --table nat --insert PREROUTING --destination "192.168.0.100" -i eth0 -p tcp --dport "10" --jump DNAT --to-destination "10.0.0.4:80"
เส้นทาง /sbin/ip เพิ่ม "10.0.0.4" ผ่าน "10.118.0.2"
อย่างไรก็ตาม หากมีการสร้างเส้นทางที่สอง เช่นในตัวอย่างแรก คำสั่งจะมีลักษณะดังนี้:
/sbin/iptables --table nat --insert PREROUTING --destination "192.168.0.100" -i eth0 -p tcp --dport "20" --jump DNAT --to-destination "10.0.0.4:80"
/sbin/ip เส้นทางเพิ่ม "10.0.0.4" ผ่าน "10.118.0.3"
สิ่งนี้จะสร้างเส้นทางอื่นในตารางเส้นทางหลักสำหรับเป้าหมายเดียวกัน แต่ผู้ใช้เมื่อเข้าถึง 192.168.0.100 อาจได้รับการกำหนดเส้นทางไปยังเครื่องที่เชื่อมต่อกับ 10.118.0.3 หรือ 10.118.0.2
นอกจากกฎนี้แล้ว สำหรับกฎทั้งหมดนี้มีการเปิดใช้งานเสมอเพื่อให้การรับส่งข้อมูลกลับไปที่อินเทอร์เฟซ tap0 ที่ซึ่งการสื่อสารไปยัง 10.118.0.X ไป:
iptables -t nat -A โพสต์ -o tap0 -j MASQUERADE
ขออภัย ฉันไม่สามารถทราบ IP ต้นทางของผู้ใช้ได้ ไม่เช่นนั้นจะแก้ปัญหาได้ง่ายๆ IP ต้นทางสำหรับการสื่อสารใดๆ ที่มาถึงพอร์ตนี้จะเหมือนกันเสมอ เนื่องจากการสื่อสารจำเป็นต้องผ่านบริการอื่นซึ่งปิดบัง IP ต้นทางจริง
ฉันเห็นหัวข้ออื่นๆ ในการทำเครื่องหมายแพ็กเก็ตขาเข้าในคอนเทนเนอร์/พ็อด ฉันต้องปิดใช้งาน rt_filter แต่ฉันทำไม่ได้ มันบอกว่ามันเป็นระบบไฟล์แบบอ่านอย่างเดียว และฉันไม่รู้ว่ามันเป็นไปได้ที่จะเปลี่ยนสิ่งนั้นใน Azure Kubernetes Clusters หรือไม่
มีวิธีอื่นนอกเหนือจากการทำเครื่องหมายแพ็คเก็ตหรือไม่? หรือมีอย่างอื่นที่ขาดหายไปเกี่ยวกับการทำเครื่องหมายแพ็คเก็ต?