Linux

是否可以為出站連接設置多個預設網關?

  • November 27, 2018

我想在同一個子網中有多個 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

我想要的是主路由表有多個預設網關(一個 oneth0和一個 on ),並通過預設和if關閉wlan0進入預設網關。eth0``wlan0``eth0

那可能嗎?我需要做什麼才能實現這樣的功能?

自己解決了。關於可以使用 Linux 進行的網路工作的資訊似乎很少,因此我決定詳細記錄並解釋我的解決方案。這是我的最終設置:

  • 3個網卡:eth0(有線),wlan0(內置wifi,弱),wlan1(usb wifi適配器,信號比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

請注意,我們沒有為這條 post-up 行指定路由表。如果不指定路由表,資訊將保存在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啟動就將使用它。如果eth0出現故障,傳出流量將切換到wlan1.

使用此設置,我們可以ping 8.8.8.8在一個終端和ifdown eth0另一個終端中輸入。ping應該仍然可以工作,因為ifdown eth0將刪除相關的預設路由eth0,傳出流量將切換到wlan1.

post-down 行確保ip rule show當介面關閉時相關的路由表從路由策略數據庫 () 中刪除,以保持一切整潔。

剩下的問題是,當您從eth0預設路由中拔出插頭時,eth0仍然存在並且傳出流量失敗。我們需要一些東西來監控我們的介面,並ifdown eth0在介面出現問題時執行(即 NIC 故障或有人拔掉插頭)。

最後一步:輸入ifplugdifup/ifdown如果您拔下插頭或 wifi 連接有問題,這是一個監視介面並執行的守護程序/etc/default/ifplugd

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

您現在可以拔下插頭eth0,傳出流量將切換到wlan1,如果您重新插入外掛,傳出流量將切換回eth0。**只要三個介面中的任何一個正常工作,您的伺服器就會保持線上狀態。**要連接到您的伺服器,您可以使用 eth0 的 IP 地址,如果失敗,請使用 wlan1 或 wlan0 的 IP 地址。

引用自:https://unix.stackexchange.com/questions/345862