เรามีเซิร์ฟเวอร์แบ็กเอนด์จำนวนมากในรูปแบบของอินสแตนซ์ EC2 ซึ่งอยู่ในซับเน็ตส่วนตัวใน AWS VPC ซึ่งจำเป็นต้องพูดคุยกับ API ของบุคคลที่สาม API นี้จำกัดคำขอที่เราสามารถส่งตามที่อยู่ IP ต้นทาง และในขณะที่ปรับขนาดการตั้งค่าของเรา เราได้เริ่มถึงขีดจำกัดบน IP ของเกตเวย์ NAT ที่ใช้สำหรับทราฟฟิกขาออกทั้งหมด
ดังนั้น ฉันจึงต้องการตั้งค่าพร็อกซีสำหรับทราฟฟิกขาออกโดยแนบ EIP หลายตัว สำหรับการทดสอบ ฉันกำลังใช้อินสแตนซ์ Amazon Linux 2 ที่มี ENI 2 ตัวพร้อมแนบ EIP 2 ตัวต่อตัวเซิร์ฟเวอร์ส่วนหลังเปิดอุโมงค์ SSH ไปยังพร็อกซีขาออกและแมป API ของบุคคลที่สามกับพอร์ตในเครื่อง รายการในไฟล์โฮสต์ของเซิร์ฟเวอร์เปลี่ยนเส้นทางการรับส่งข้อมูลทั้งหมดไปยังชื่อโฮสต์นั้นไปยัง localhost และการตั้งค่านี้ใช้งานได้ดีโดยทั่วไป แต่การรับส่งข้อมูลขาออกจาก พร็อกซีจะใช้เฉพาะ EIP แรกที่เกี่ยวข้องเสมอ
ดังนั้นการตั้งค่าของฉันจึงมีลักษณะดังนี้:
ENI1: eth0
IP1 ส่วนตัว: 10.0.11.81
IP2 ส่วนตัว: 10.0.11.82
ENI2: เอท1
IP3 ส่วนตัว: 10.0.11.52
IP4 ส่วนตัว: 10.0.11.53
ตารางเส้นทางเดิม:
ค่าเริ่มต้นผ่าน 10.0.11.1 dev eth0
ค่าเริ่มต้นผ่าน 10.0.11.1 dev eth1 metric 10001
10.0.11.0/24 dev eth0 ลิงก์ขอบเขตเคอร์เนลโปรโต src 10.0.11.81
10.0.11.0/24 dev eth1 ลิงก์ขอบเขตเคอร์เนลโปรโต src 10.0.11.52
169.254.169.254 พัฒนา eth0
ตอนนี้ฉันต้องการระบุเซิร์ฟเวอร์ส่วนหลังที่ใช้ EIP ใดเมื่อเรียก API ผ่านพร็อกซีขาออก การทดลองครั้งแรกของฉันมีดังต่อไปนี้:
- ตั้งค่าผู้ใช้ที่แตกต่างกัน 4 รายบนโฮสต์พร็อกซี
- เพิ่มกฎ iptable สำหรับผู้ใช้แต่ละคนดังนี้:
iptables -t nat -m เจ้าของ --uid-เจ้าของ user1 -A POSTROUTING -j SNAT --to IP1 เป็นต้น
- สิ่งนี้ใช้ได้กับ 2 IP ที่เชื่อมต่อกับ ENI หลัก (เช่น eth0 ในเครื่อง) แต่ใช้ไม่ได้กับ 2 IP ที่เชื่อมโยงกับ ENI ที่สอง (eth1)
- การเพิ่ม
-o eth1 คำสั่งไม่ได้ผลเช่นกัน
ความพยายามครั้งต่อไปของฉันคือการสร้างตารางเส้นทางที่กำหนดเองสำหรับแต่ละที่อยู่ IP และจับคู่กับกฎนโยบาย:
- สร้างตารางเส้นทางที่กำหนดเอง เช่น สำหรับ IP3:
ค่าเริ่มต้นผ่าน 10.0.11.1 dev eth1
10.0.11.0/24 dev eth1 ลิงก์ขอบเขตโปรโตสแตติก src 10.0.11.52
169.254.169.254 ลิงก์ขอบเขต eth1 dev
- สร้างกฎ iptables เพื่อทำเครื่องหมายการรับส่งข้อมูลที่มาจาก user3:
-A OUTPUT -m เจ้าของ --uid เจ้าของ 1003 -j MARK --set-xmark 0x3/0xffffffff
- สร้างกฎเพื่อใช้ตารางเส้นทางที่กำหนดเองสำหรับแพ็กเก็ตทั้งหมดที่มีเครื่องหมาย 3:
32763: จาก fwmark 0x3 ค้นหา ip3 ทั้งหมด
- สิ่งนี้ใช้ไม่ได้อีกครั้ง แพ็คเก็ตจะได้รับการปฏิบัติที่แตกต่างกัน ผู้ใช้ทั้งหมดสามารถสื่อสารกับโลกได้ ยกเว้นผู้ใช้ 3 ในตัวอย่างข้างต้น
ผมทำอะไรผิดหรือเปล่า? มีอะไรเล็กน้อยที่ฉันขาดหายไปหรือวิธีการทั้งหมดของฉันถึงวาระที่จะล้มเหลว? ฉันยินดีรับฟังข้อเสนอแนะ ทั้งเกี่ยวกับการทำให้การตั้งค่านี้ใช้งานได้ตลอดจนแนวทางอื่นๆ...
ขอบคุณมากในล่วงหน้า!