ตอบบนอินเทอร์เฟซเดียวกันกับขาเข้าหรือไม่


50

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

คำตอบ:


60
echo 200 isp2 >> /etc/iproute2/rt_tables
ip rule add from <interface_IP> dev <interface> table isp2
ip route add default via <gateway_IP> dev <interface> table isp2

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


7
ว้าวนี่คือสิ่งที่ฉันกำลังมองหา ในกรณีที่ใคร ๆ กำลังมองหา distros แบบ RH คุณสามารถใส่กฎและคำสั่งเส้นทางที่เกี่ยวข้องในไฟล์ชื่อ 'rule-eth0' หรือ 'route-eth0' (ตัวอย่าง) ซึ่งจะถูกเพิ่มหรือลบออกใน ifup / ifdown วางไฟล์เหล่านี้ไว้ข้างๆไฟล์ ifcfg-eth0 สำหรับ IPv6 มีฟังก์ชั่น 'route6-eth0' อยู่แล้ว แต่ยังไม่มี 'rule6-eth0' ในตัว (แต่)
Kyle Brantley

18
สำหรับฉันมันใช้งานได้เฉพาะเมื่อฉันทิ้งdevparam ไว้ในip ruleคำสั่งเท่านั้นดังนั้นให้รันip rule add from <interface_IP> table isp2
cdauth

2
คุณสามารถสร้างสิ่งเหล่านี้ได้เมื่ออินเทอร์เฟซเกิดขึ้นโดยการเพิ่มup ip rule add from <interface_IP> table isp2และup ip route add default via <gateway_IP> dev ppp0 table isp2/ etc / network / interfaces ของคุณภายใต้อินเทอร์เฟซที่เกี่ยวข้อง
g.rocket

4
ฉันต้องลบออกdev <interface>จากip ruleเพื่อนำไปใช้งานในกล่องของฉัน ถ้าฉันเข้าใจถูกต้องการdev <interface>กรองแพ็กเก็ตซึ่งตั้งอยู่บนอินเตอร์เฟสที่ไม่ถูกต้องซึ่งต้องถูกส่งไปยังอินเตอร์เฟสที่ถูกต้องโดยเส้นทางที่เขียนทับ แต่การกรองกฎโดยอินเตอร์เฟสได้ป้องกันไม่ให้เกิดขึ้น
binki

2
เช่นเดียวกับคนอื่น ๆ ส่วนใหญ่ฉันต้องลบออกdev <interface>จากip ruleคำสั่งเพื่อให้ทำงานได้ โปรดอัปเดตคำตอบ! ยกเว้นรายละเอียดนั้นมันใช้งานได้อย่างมีเสน่ห์ ขอบคุณมาก @ Peter!
MoonSweep

6

คำสั่งต่อไปนี้สร้างตารางเส้นทางที่เป็นทางเลือกeth1สำหรับแพ็คเก็ตที่มีเครื่องหมาย 1 (ยกเว้นแพ็กเก็ตไปยัง localhost) ipคำสั่งจากiproute2ห้องสวีท (Ubuntu: iproute ติดตั้ง iproute http://bit.ly/software-small , iproute-doc ติดตั้ง iproute-doc http://bit.ly/software-small )

ip rule add fwmark 1 table 1
ip route add 127.0.0.0/0 table 1 dev lo
ip route add 0.0.0.0/0 table 1 dev eth1

อีกครึ่งหนึ่งของงานกำลังรับรู้แพ็กเก็ตที่ต้องได้รับเครื่องหมาย 1; จากนั้นใช้iptables -t mangle -A OUTPUT … -j MARK --set-mark 1บนแพ็กเก็ตเหล่านี้เพื่อให้พวกเขาส่งผ่านตารางเส้นทาง 1 ฉันคิดว่าต่อไปนี้ควรทำ (แทนที่ 1.2.3.4 โดยที่อยู่ของอินเตอร์เฟสที่ไม่ใช่เส้นทางเริ่มต้น):

iptables -t mangle -A OUTPUT -m conntrack --ctorigdst 1.2.3.4 -j MARK --set-mark 1

ฉันไม่แน่ใจว่าเพียงพอแล้วอาจต้องใช้กฎอื่นในแพ็กเก็ตที่เข้ามาเพื่อแจ้งให้โมดูลควบคุมเพื่อติดตามพวกเขา


ดี ฉันลืมทุกอย่างเกี่ยวกับการทำเครื่องหมาย ที่ควรได้รับฉันมี
Shawn J. Goff

5

ฉันมีปัญหากับแพ็กเก็ตที่สร้างขึ้นภายในเครื่องพร้อมโซลูชันที่ Peter แนะนำฉันพบว่าสิ่งต่อไปนี้แก้ไขได้:

echo 200 isp2 >> /etc/iproute2/rt_tables
ip rule add from <interface_IP> table isp2 priority 900
ip rule add from dev <interface> table isp2 priority 1000
ip route add default via <gateway_IP> dev <interface> table isp2
ip route add <interface_prefix> dev <interface> proto static scope link src <interface_IP> table isp2

หมายเหตุ:คุณอาจพบปัญหาเกี่ยวกับไวยากรณ์ของบรรทัดที่ 4 ด้านบน ในกรณีเช่นนี้ไวยากรณ์สำหรับคำสั่งที่ 4 อาจเป็นตอนนี้:

ip rule add iif <interface> table isp2 priority 1000

พยายามมาก แต่ไม่มีอะไรทำงานในสถานการณ์ของฉันยกเว้นเรื่องนี้ .. ขอบคุณมาก
agaggi

3

ฉันสมมติว่าคุณกำลังใช้งาน Linux และยิ่งไปกว่านั้นคุณกำลังใช้การกระจายแบบ RedHat / CentOS Unix อื่น ๆ และดิสทริบิวชันจะต้องใช้ขั้นตอนที่คล้ายกัน - แต่รายละเอียดจะแตกต่างกัน


เริ่มต้นด้วยการทดสอบ (โปรดทราบว่านี่คล้ายกับคำตอบของ @ Peter มากฉันถือว่าต่อไปนี้:

  • eno0 คือ isp0 และมีเกตเวย์เริ่มต้นโดยรวม
  • eno1 คือ isp1 และมี IP / พิสัย 192.168.1.2/24 พร้อมเกตเวย์ 192.168.1.1

คำสั่งมีดังนี้:

$ echo 200 isp1 >> /etc/iproute2/rt_tables
$ ip rule add from eno1 table isp1
$ ip route add default via 192.168.1.1 dev eno1 table isp1

ไฟร์วอลล์ไม่ได้มีส่วนเกี่ยวข้อง แต่อย่างใด แพ็คเก็ตตอบกลับจะถูกส่งจาก IP ที่ถูกต้องเสมอ - แต่ก่อนหน้านี้มีการส่งผ่านทางอินเตอร์เฟซที่ไม่ถูกต้อง ตอนนี้แพ็กเก็ตเหล่านี้จาก IP ที่ถูกต้องจะถูกส่งผ่านอินเตอร์เฟซที่ถูกต้อง


สมมติว่าคุณทำงานด้านบนได้ในขณะนี้คุณสามารถเปลี่ยนแปลงกฎและเส้นทางได้อย่างถาวร ขึ้นอยู่กับว่าคุณใช้ Unix เวอร์ชั่นใด ก่อนหน้านี้ฉันสมมติว่ามีการกระจาย Linux ที่ใช้ RH / CentOS

$ echo "from eno1 table isp1" > /etc/sysconfig/network-scripts/rule-eno1
$ echo "default via 192.168.1.1 dev eno1 table isp1" > /etc/sysconfig/network-scripts/route-eno1

ทดสอบว่าการเปลี่ยนแปลงเครือข่ายเป็นสิ่งที่ถาวร:

$ ifdown eno1 ; ifup eno1

หากวิธีนี้ใช้ไม่ได้ผลใน RH / CentOS เวอร์ชันใหม่กว่าคุณต้องเลือกหนึ่งในสองตัวเลือก:

  • อย่าใช้ค่าเริ่มต้นNetworkManager.service ; ใช้network.serviceแทน ฉันไม่ได้สำรวจขั้นตอนที่แน่นอนที่จำเป็นสำหรับสิ่งนี้ ฉันคิดว่ามันเกี่ยวข้องกับคำสั่งchkconfigหรือsystemctlมาตรฐานเพื่อเปิด / ปิดการใช้งานบริการ
  • ติดตั้งแพคเกจ NetworkManager-dispatcher-routing-rules

โดยส่วนตัวฉันชอบติดตั้งกฎเกณฑ์มากขึ้นเพราะเป็นวิธีที่ง่ายกว่าที่สนับสนุนมากขึ้น:

$ yum install NetworkManager-dispatcher-routing-rules

ข้อเสนอแนะที่แข็งแกร่งอีกประการหนึ่งคือการเปิดใช้งานการกรอง arp เพื่อป้องกันปัญหาอื่น ๆ ที่เกี่ยวข้องกับการกำหนดค่าเครือข่ายคู่ ด้วย RH / CentOS ให้เพิ่มเนื้อหาต่อไปนี้ในไฟล์ /etc/sysctl.conf:

net.ipv4.conf.default.arp_filter=1
net.ipv4.conf.all.arp_filter=1
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.