สองอินเตอร์เฟสสองที่อยู่สองเกตเวย์?


15

ฉันมีระบบที่มีสองอินเตอร์เฟสเครือข่ายที่มีที่อยู่ IP ที่แตกต่างกันซึ่งทั้งสองอยู่ในช่วงที่อยู่สาธารณะ (แม้ว่าจะผ่าน NAT ในกรณีแรก) และทั้งคู่มีเกตเวย์ที่แตกต่างกัน (เรื่องยาวมันมีวัตถุประสงค์เพื่อการทดสอบ)

ปัญหาคือตอนนี้ถ้าฉันพยายาม ping ที่อยู่บนอินเทอร์เฟซที่สองเส้นทางเริ่มต้นจะชี้ให้เห็นผ่านทางอินเทอร์เฟซแรกและไม่เคยมาถึงอย่างถูกต้อง

เป็นไปได้หรือไม่ที่จะทำให้แน่ใจว่าคำตอบจะออกไปข้างนอกเสมอบนอินเทอร์เฟซเครือข่ายเดียวกัน (และมีแหล่ง IP เดียวกัน) เมื่อพวกเขาเข้ามา? และถ้าเป็นเช่นนั้นได้อย่างไร


1
อาจมีความแตกต่างบางประการเกี่ยวกับเรื่องนี้: unix.stackexchange.com/questions/4420/…
Shawn J. Goff

คำตอบ:


17

คุณเข้าใจผิดเกี่ยวกับปัญหา ไม่ใช่ทุกแพ็คเก็ตเป็นการตอบสนองและไม่ใช่ทุกแพ็คเก็ตที่สามารถจับคู่กับแพ็คเก็ตอื่น ๆ ได้เช่น "อินเทอร์เฟซเครือข่ายเดียวกันกับที่เข้ามา" สิ่งที่คุณต้องการทำคือเลือกเกตเวย์สำหรับแพ็กเก็ตตามที่อยู่ IP ต้นทาง

สิ่งนี้เรียกว่าการกำหนดเส้นทางตามแหล่งที่มาหรือการกำหนดเส้นทางนโยบาย คุณสามารถทำได้ด้วยกฎง่าย ๆiptablesแต่วิธีที่ดีที่สุดคือการตั้งค่าตารางเส้นทางสองตารางหนึ่งตารางสำหรับที่อยู่สาธารณะแต่ละแห่ง:

ขั้นแรกสร้างสองตาราง (แทนที่ <NAME1> และ <NAME2> ด้วยชื่อที่สมเหตุสมผลสำหรับผู้ให้บริการสองรายของคุณเช่นเดียวกับ IP1, DEV1 และอื่น ๆ ):

echo 200 <NAME1> >> /etc/iproute2/rt_tables
echo 201 <NAME2> >> /etc/iproute2/rt_tables

เพิ่มเกตเวย์ในแต่ละตารางเส้นทาง (ถ้าจำเป็น):

ip route add <NET1> dev <DEV1> src <SRC1> table <NAME1>
ip route add <NET2> dev <DEV2> src <SRC2> table <NAME2>

จากนั้นเป็นเส้นทางเริ่มต้น:

ip route add default via <IP1> table <NAME1>
ip route add default via <IP2> table <NAME2>

จากนั้นกฎในการเลือกตารางเส้นทางตามที่อยู่ต้นทาง:

ip rule add from <IP1> table <NAME1>
ip rule add from <IP2> table <NAME2>

ดูการกำหนดเส้นทางสำหรับอัปลิงค์ / ผู้ให้บริการหลายรายสำหรับรายละเอียดเพิ่มเติม


คุณเขียนว่า: 'ไม่ใช่ทุก ๆ แพ็คเก็ตเป็นการตอบสนองและไม่ใช่ทุก ๆ แพ็กเก็ตที่สามารถจับคู่กับแพ็คเก็ตอื่น ๆ เช่น "อินเทอร์เฟซเครือข่ายเดียวกับที่เข้ามา" 'คุณสามารถอธิบายเพิ่มเติมนี้ได้หรือไม่ ฉันเข้าใจว่าไม่ใช่ทุกแพ็คเก็ตเป็นการตอบสนองและไม่ใช่ทุกแพ็กเก็ตที่สามารถจับคู่กับแพ็คเก็ต "ต้นทาง" อื่นได้ หากเราแยกแพ็กเก็ตเหล่านี้ออกจากการพิจารณาเนื่องจากมันไม่ทำให้เกิดปัญหาใด ๆ ดังนั้นจึงไม่เกี่ยวข้องกับเราทำไมแพ็คเก็ตที่เหลืออยู่ไม่สามารถส่งไปที่ "อินเทอร์เฟซเครือข่ายเดียวกับที่เข้ามา"
Andrew Savinykh

@AndrewSavinykh ที่จะไม่แก้ปัญหาทั้งหมด โดยเฉพาะอย่างยิ่งมันจะแตกเมื่อใดก็ตามที่แพ็กเก็ตขาออกเกิดขึ้นในเครื่อง (เช่นคำขอส่ง Ping) ไปที่อินเตอร์เฟสที่ไม่ถูกต้องสำหรับที่อยู่ IP ต้นทางและถูกทิ้งโดยเกตเวย์ ปัญหาคือตามที่ฉันอธิบายจริง ๆ แล้วเกี่ยวกับการทำให้แน่ใจว่าแพ็คเก็ตออกเกตเวย์ที่สอดคล้องกับที่อยู่ IP ต้นทางของพวกเขา
David Schwartz

เดวิดฉันต้องการบรรลุสิ่งเดียวกันกับ OP แต่ฉันทำไม่ได้ ฉันได้โพสต์คำถามที่นี่: serverfault.com/questions/992624/…จะดีถ้าคุณสามารถดู
Housemd

6

คำตอบของ David Schwartz นั้นยอดเยี่ยม แต่คุณสามารถทำให้กฎการกำหนดเส้นทางง่ายขึ้นเล็กน้อยด้วยการเพิ่มตารางเพียงตารางเดียวและใช้เส้นทางเริ่มต้นสำหรับอีกอัน ฉันมีเซิร์ฟเวอร์ที่อยู่ด้านหลัง NAT สองเกตเวย์และเมื่อไม่นานมานี้ฉันได้ผ่านขั้นตอนการสร้างสถานการณ์จำลองขึ้นใหม่ระหว่าง VMs จำนวนมาก /etc/network/interfacesหน้าตาของฉันเป็นแบบนี้:

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
    address 192.168.13.13
    netmask 255.255.255.0
    up ip route add table optus default via 192.168.13.10
    up ip rule add from 192.168.13.213 table optus
    up ip route add default via 192.168.13.11

auto eth0:0
iface eth0:0 inet static
    address 192.168.13.213
    netmask 255.255.255.0

(นี่เป็นการตั้งค่าที่ ISP สองรายการคือ Optus และ iiNet ดังนั้นชื่อตารางของ 'optus')

สิ่งนี้รวมทั้งบรรทัดใน/etc/iproute2/rt_tablesการสร้างตารางควรเป็นสิ่งที่คุณต้องการ คุณจะมีที่อยู่ IP สองแห่ง ปริมาณการใช้งานจาก 192.168.13.13 จะออกผ่าน 192.168.13.11 และปริมาณการเข้าชมจาก 192.168.13.213 จะออกผ่าน 192.168.13.10 กำหนดค่าเกตเวย์ทั้งสองนี้เพื่อทำการส่งต่อพอร์ตอย่างเหมาะสม (192.168.13.11 ส่งต่อข้อมูลไปที่ 192.168.13.13 และ 192.168.13.10 ส่งต่อสิ่งที่ 192.168.13.213) และส่วนที่เหลือควรดูแลตัวเอง

คุณอาจต้องปรับแต่งสิ่งเล็กน้อยให้เข้ากับสถานการณ์ของคุณเนื่องจากคุณใช้ IP สาธารณะโดยตรง แต่สิ่งนี้ยังคงใช้ได้ นอกจากนี้ยังง่ายกว่ามากที่จะทำสิ่งเหล่านี้/etc/network/interfacesแล้วจัดการคอมไพล์ไฟล์นั้นแทนที่จะพยายามจำวิธีการตั้งค่าของคุณสองปีต่อมาเมื่อระบบรีบูต!


1

ตัวอย่างเครือข่ายคู่

ตัวอย่างนี้แสดงวิธีการเพิ่มเติมeth1กับ10.130.0.2netmask 255.255.255.255และเกตเวย์10.130.0.1สามารถให้บริการกับบริการที่ผูกกับมันping -I eth1 8.8.8.8

ในทางเทคนิคเรา:

  • การเพิ่มเกตเวย์อื่นที่มีเมตริกมากขึ้น
  • การเพิ่ม / ใช้ตาราง 100 และตั้งค่า
  • การเพิ่มกฎเพื่อกำหนดเส้นทางทราฟฟิกไปยัง / จาก eth1 ผ่านกฎ
ip addr add 10.130.0.2/32 broadcast 10.130.0.2 dev eth1
ip link set eth1 up
ip route add 10.130.0.1 src 10.130.0.2 dev eth1
ip route add 10.130.0.1 src 10.130.0.2 dev eth1 table 100
ip route add default via 10.130.0.1 dev eth1 metric 10
ip route add default via 10.130.0.1 dev eth1 table 100
ip rule add from 10.130.0.2/32 table 100
ip rule add to 10.130.0.2/32 table 100
curl --interface eth1 ifconfig.co
curl --interface eth0 ifconfig.co
ping -I eth1 8.8.8.8
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.