เป็นไปได้หรือไม่ที่จะมีเกตเวย์เริ่มต้นหลายรายการสำหรับการเชื่อมต่อขาออก?


15

ฉันต้องการมี NIC หลายตัว (eth0 และ wlan0) ในซับเน็ตเดียวกันและทำหน้าที่เป็นข้อมูลสำรองสำหรับแอปพลิเคชันบนโฮสต์หาก NIC ตัวใดตัวหนึ่งล้มเหลว ด้วยเหตุนี้ฉันจึงสร้างตารางเส้นทางเพิ่มเติม นี่คือ/etc/network/interfacesลักษณะที่:

iface eth0 inet static
address 192.168.178.2
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
    post-up ip route add 192.168.178.0/24 dev eth0 src 192.168.178.2
    post-up ip route add default via 192.168.178.1 dev eth0
    post-up ip rule add from 192.168.178.2/32
    post-up ip rule add to 192.168.178.2/32

iface wlan0 inet static
wpa-conf /etc/wpa_supplicant.conf
wireless-essid xyz
address 192.168.178.3
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
    post-up ip route add 192.168.178.0/24 dev wlan0 src 192.168.178.3 table rt2
    post-up ip route add default via 192.168.178.1 dev wlan0 table rt2
    post-up ip rule add from 192.168.178.3/32 table rt2
    post-up ip rule add to 192.168.178.3/32 table rt2

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

ฉันค้นคว้าหัวข้อนั้นแล้วและพบข้อมูลที่น่าสนใจต่อไปนี้:

เมื่อโปรแกรมเริ่มต้นการเชื่อมต่อขาออกมันเป็นเรื่องปกติที่จะใช้ที่อยู่แหล่งตัวแทน (0.0.0.0) เพื่อระบุว่าไม่มีการกำหนดลักษณะที่จะใช้อินเทอร์เฟซใด ๆ หากสามารถเข้าถึงที่อยู่ปลายทางที่เกี่ยวข้องได้ สิ่งนี้จะไม่ถูกแทนที่ด้วยแหล่งที่อยู่เฉพาะจนกว่าจะมีการตัดสินใจเกี่ยวกับการกำหนดเส้นทาง ทราฟฟิกที่เชื่อมโยงกับการเชื่อมต่อดังกล่าวจะไม่ตรงกับกฎนโยบายข้างต้นอย่างใดอย่างหนึ่งและจะไม่ถูกนำไปยังตารางเส้นทางที่เพิ่มเข้ามาใหม่อย่างใดอย่างหนึ่ง สมมติว่าการกำหนดค่าปกติเป็นอย่างอื่นมันจะตกไปที่ตารางเส้นทางหลักแทน http://www.microhowto.info/howto/ensure_symmetric_routing_on_a_server_with_multiple_default_gateways.html

สิ่งที่ฉันต้องการสำหรับตารางเส้นทางหลักที่จะมีเกตเวย์เริ่มต้นมากกว่าหนึ่ง (หนึ่งในeth0และหนึ่งในwlan0) และเพื่อไปที่เกตเวย์เริ่มต้นผ่านeth0โดยค่าเริ่มต้นและผ่านwlan0ถ้าeth0ไม่ทำงาน

เป็นไปได้ไหม ฉันต้องทำอะไรเพื่อให้บรรลุหน้าที่ดังกล่าว


สั้นมาก: เส้นทางเริ่มต้นหลายเส้นทางจะเลือกหนึ่งอินเตอร์เฟสโดยการสุ่มซึ่งนำไปสู่ปัญหาเนื่องจาก IP ที่กำหนดแตกต่างกัน สิ่งที่คุณต้องการคือmultihomingหรือbundlingซึ่งเป็นเรื่องยากที่จะทำดูเช่นที่นี่
dirkt

1
คุณสามารถใช้failover แบบไดนามิกที่มีพันธะ ไม่จำเป็นต้องเล่นซอกับเส้นทางเริ่มต้น
Ingo

คำตอบ:


17

แก้ไขได้ด้วยตัวเอง ดูเหมือนว่ามีข้อมูลน้อยมากเกี่ยวกับสิ่งที่เกี่ยวกับระบบเครือข่ายที่คุณสามารถทำกับ Linux ได้ดังนั้นฉันจึงตัดสินใจจัดทำเอกสารและอธิบายวิธีแก้ไขปัญหาโดยละเอียด นี่คือการตั้งค่าสุดท้ายของฉัน:

  • 3 NICs: eth0 (สาย), wlan0 (wifi ในตัว, อ่อนแอ), wlan1 (อะแดปเตอร์ไร้สาย usb usb, สัญญาณแรงกว่า wlan0)
  • พวกเขาทั้งหมดในซับเน็ตเดียวแต่ละคนมีที่อยู่ IP ของตัวเอง
  • ควรใช้ eth0 สำหรับการรับส่งข้อมูลทั้งขาเข้าและขาออก
  • หาก eth0 ล้มเหลวควรใช้ wlan1
  • หาก wlan1 ล้มเหลวควรใช้ wlan0

ขั้นตอนแรก : /etc/iproute2/rt_tablesสร้างตารางเส้นทางใหม่สำหรับทุกคนในอินเตอร์เฟซ ลองเรียกพวกมันว่า rt1, rt2 และ rt3

#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
#1  inr.ruhep
1 rt1
2 rt2
3 rt3

ขั้นตอนที่สอง : /etc/network/interfacesการกำหนดค่าเครือข่ายใน นี่คือส่วนหลักและฉันจะพยายามอธิบายให้มากที่สุด:

auto eth0 wlan0
allow-hotplug wlan1

iface lo inet loopback

iface eth0 inet static
address 192.168.178.99
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
    post-up ip route add 192.168.178.0/24 dev eth0 src 192.168.178.99 table rt1
    post-up ip route add default via 192.168.178.1 dev eth0 table rt1
    post-up ip rule add from 192.168.178.99/32 table rt1
    post-up ip rule add to 192.168.178.99/32 table rt1
    post-up ip route add default via 192.168.178.1 metric 100 dev eth0
    post-down ip rule del from 0/0 to 0/0 table rt1
    post-down ip rule del from 0/0 to 0/0 table rt1

iface wlan0 inet static
wpa-conf /etc/wpa_supplicant.conf
wireless-essid xyz
address 192.168.178.97
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
    post-up ip route add 192.168.178.0/24 dev wlan0 src 192.168.178.97 table rt2
    post-up ip route add default via 192.168.178.1 dev wlan0 table rt2
    post-up ip rule add from 192.168.178.97/32 table rt2
    post-up ip rule add to 192.168.178.97/32 table rt2
    post-up ip route add default via 192.168.178.1 metric 102 dev wlan0
    post-down ip rule del from 0/0 to 0/0 table rt2
    post-down ip rule del from 0/0 to 0/0 table rt2

iface wlan1 inet static
wpa-conf /etc/wpa_supplicant.conf
wireless-essid xyz
address 192.168.178.98
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
    post-up ip route add 192.168.178.0/24 dev wlan1 src 192.168.178.98 table rt3
    post-up ip route add default via 192.168.178.1 dev wlan1 table rt3
    post-up ip rule add from 192.168.178.98/32 table rt3
    post-up ip rule add to 192.168.178.98/32 table rt3
    post-up ip route add default via 192.168.178.1 metric 101 dev wlan1
    post-down ip rule del from 0/0 to 0/0 table rt3
    post-down ip rule del from 0/0 to 0/0 table rt3

หากคุณพิมพ์ip rule showคุณควรเห็นสิ่งต่อไปนี้:

0:  from all lookup local 
32756:  from all to 192.168.178.98 lookup rt3 
32757:  from 192.168.178.98 lookup rt3 
32758:  from all to 192.168.178.99 lookup rt1 
32759:  from 192.168.178.99 lookup rt1 
32762:  from all to 192.168.178.97 lookup rt2 
32763:  from 192.168.178.97 lookup rt2 
32766:  from all lookup main 
32767:  from all lookup default 

สิ่งนี้บอกเราว่าการรับส่งข้อมูลขาเข้าหรือขาออกจากที่อยู่ IP "192.168.178.99" จะใช้ตารางเส้นทาง rt1 จนถึงตอนนี้ดีมาก แต่การรับส่งข้อมูลที่สร้างขึ้นในเครื่อง (ตัวอย่างเช่นคุณต้องการ ping หรือ ssh จากเครื่องไปยังที่อื่น) ต้องได้รับการดูแลเป็นพิเศษ (ดูเครื่องหมายคำพูดใหญ่ในคำถาม)

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

post-up ip r add default via 192.168.178.1 metric 100 dev eth0

สังเกตว่าเรายังไม่ได้ระบุตารางเส้นทางสำหรับสายการโพสต์อัพนี้ หากคุณไม่ได้ระบุตารางเส้นทางข้อมูลจะถูกบันทึกไว้ในตารางเส้นทางที่เราเห็นในmain ip rule showบรรทัดการโพสต์นี้วางเส้นทางเริ่มต้นในตารางเส้นทาง "หลัก" ที่ใช้สำหรับการรับส่งข้อมูลที่สร้างขึ้นภายในเครื่องซึ่งไม่ตอบสนองต่อการรับส่งข้อมูลขาเข้า (ตัวอย่างเช่น MTA บนเซิร์ฟเวอร์ของคุณพยายามส่งอีเมล)

อินเทอร์เฟซสามทั้งหมดใส่เส้นทางเริ่มต้นในตารางเส้นทางหลักแม้ว่าจะมีตัวชี้วัดที่แตกต่างกัน ลองดูmainตารางเส้นทางด้วยip route show:

default via 192.168.178.1 dev eth0  metric 100 
default via 192.168.178.1 dev wlan1  metric 101 
default via 192.168.178.1 dev wlan0  metric 102 
192.168.178.0/24 dev wlan0  proto kernel  scope link  src 192.168.178.97 
192.168.178.0/24 dev eth0  proto kernel  scope link  src 192.168.178.99 
192.168.178.0/24 dev wlan1  proto kernel  scope link  src 192.168.178.98

เราจะเห็นว่าตารางเส้นทางหลักมีเส้นทางเริ่มต้นสามเส้นทางแม้ว่าจะมีเมตริกที่แตกต่างกัน ลำดับความสำคัญสูงสุดคือ eth0 จากนั้น wlan1 และ wlan0 เพราะตัวเลขเมตริกที่ต่ำกว่าแสดงว่ามีลำดับความสำคัญสูงกว่า เนื่องจากeth0มีตัวชี้วัดที่ต่ำที่สุดนี่คือเส้นทางเริ่มต้นที่จะถูกใช้เป็นระยะเวลานานeth0ขึ้น ถ้าไปลงการจราจรขาออกจะเปลี่ยนไปeth0wlan1

ด้วยการตั้งค่านี้เราสามารถพิมพ์ping 8.8.8.8ในเครื่องหนึ่งและifdown eth0อีกเครื่องหนึ่ง pingจะยังคงทำงานเพราะเนื่องจากifdown eth0จะลบเส้นทางเริ่มต้นที่เกี่ยวข้องกับการจราจรขาออกจะเปลี่ยนไปeth0wlan1

เส้นหลังลงให้แน่ใจว่าตารางเส้นทางที่เกี่ยวข้องถูกลบออกจากฐานข้อมูลนโยบายการกำหนดเส้นทาง ( ip rule show) เมื่ออินเตอร์เฟสหยุดทำงานเพื่อรักษาความเรียบร้อยทุกอย่าง

ปัญหาที่เหลือคือเมื่อคุณดึงปลั๊กจากeth0เส้นทางเริ่มต้นสำหรับeth0ยังคงมีและการรับส่งข้อมูลขาออกล้มเหลว เราต้องการบางสิ่งบางอย่างเพื่อตรวจสอบอินเทอร์เฟซของเราและดำเนินการifdown eth0หากมีปัญหากับอินเทอร์เฟซ (เช่น NIC ล้มเหลวหรือมีคนดึงปลั๊ก)

ขั้นตอนสุดท้าย : ifplugdใส่ นั่นคือภูตที่เฝ้าดูอินเตอร์เฟสและดำเนินการifup/ifdownถ้าคุณดึงปลั๊กหรือหากมีปัญหากับการเชื่อมต่อ wifi /etc/default/ifplugd:

INTERFACES="eth0 wlan0 wlan1"
HOTPLUG_INTERFACES=""
ARGS="-q -f -u0 -d10 -w -I"
SUSPEND_ACTION="stop"

ขณะนี้คุณสามารถดึงปลั๊กในeth0การจราจรขาออกจะเปลี่ยนไปและถ้าคุณใส่ด้านหลังเสียบจราจรขาออกจะสลับกลับไปwlan1 เซิร์ฟเวอร์ของคุณจะออนไลน์อยู่ตราบใดที่อินเทอร์เฟซสามตัวนั้นทำงาน สำหรับการเชื่อมต่อกับเซิร์ฟเวอร์ของคุณคุณสามารถใช้ที่อยู่ ip ของ eth0 และหากล้มเหลวนั้นที่อยู่ ip ของ wlan1 หรือ wlan0eth0


ลองทำการเชื่อมต่อที่ใช้เวลานานขึ้น (เช่น scp ไฟล์ขนาดใหญ่) ดูว่าส่วนต่อประสานเครือข่ายใดใช้ปิดการใช้งานส่วนต่อประสานนั้นและดูว่าเกิดอะไรขึ้น
dirkt

scpเซสชั่นจะแตกเพราะการเปลี่ยนแปลงที่อยู่ IP คุณสามารถลองใช้withsctpเพื่อให้การเชื่อมต่อยังคงอยู่ในกรณีดังกล่าวหรือใช้rsyncแทนscpการ จำกัด การถ่ายโอนจากจุดที่หยุด
rosix

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

1
"อะไรคือข้อดีของการตั้งค่าที่ซับซ้อนของคุณที่มีเพียงแค่เส้นทางเริ่มต้นเดียวพูดบนอินเทอร์เฟซเครือข่ายที่เร็วที่สุดในตอนนี้?" >> นั่นคือสิ่งที่การตั้งค่าของฉันทำ จะใช้เฉพาะเส้นทางเริ่มต้นที่เร็วที่สุด (eth0) ไม่เป็นไร
rosix

11

Linux มอบวิธีแก้ปัญหาที่ดีกว่าวิธีแก้ปัญหาสคริปต์ของคุณนั่นคือการเชื่อมโยงแบบ active-backup

วิธีนี้เครื่องของคุณจะมีเพียงหนึ่งที่อยู่ IP (และที่อยู่ MAC หนึ่ง) และอัตโนมัติและโปร่งใสสลับอินเตอร์เฟซถ้าอินเตอร์เฟซที่ใช้งานไม่ได้จะกลายเป็นหนึ่ง ไม่มีการหยุดชะงักของการเชื่อมต่อ TCP (ทั้งภายใน LAN และอินเทอร์เน็ต)

ฉันใช้การตั้งค่านี้ด้วยตนเองเพื่อ failover โดยอัตโนมัติจาก eth0 ถึง wlan0 บนแล็ปท็อปเดเบียนเมื่อฉันตัดการเชื่อมต่อแล็ปท็อปของฉันจากแท่นวาง

My / etc / network / interfaces:

# The primary network interface
allow-hotplug eth0
iface eth0 inet manual
        bond-master bond0
        bond-primary eth0

# The secondary network interface
allow-hotplug wlan0
iface wlan0 inet manual
        pre-up sleep 5
        wpa-conf /etc/wpa_supplicant.conf
        bond-master bond0
        bond-primary eth0

# The bonding interface
allow-hotplug bond0
iface bond0 inet dhcp
        bond-slaves eth0 wlan0
        bond-primary eth0
        bond-mode active-backup
        bond-miimon 10
        bond_downdelay 10
        bond_updelay 4000

คุณสามารถขยายการตั้งค่านี้เพื่อรวมอุปกรณ์ wlan หลายเครื่องได้อย่างง่ายดาย การตั้งค่า primary_reselectตัวเลือกเป็นbetter(เลือกลิงค์ที่เร็วที่สุดโดยอัตโนมัติ) น่าจะช่วยได้ที่นี่

สำหรับข้อมูลเพิ่มเติมโปรดดูที่https://wiki.linuxfoundation.org/networking/bondingและhttps://wiki.debian.org/Bonding

และ (แน่นอน) เอกสารประกอบเคอร์เนล linux ที่https://www.kernel.org/doc/Documentation/networking/bonding.txt

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