是否可以為出站連接設置多個預設網關?
我想在同一個子網中有多個 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
我想要的是主路由表有多個預設網關(一個 on
eth0
和一個 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 故障或有人拔掉插頭)。最後一步:輸入
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
,如果您重新插入外掛,傳出流量將切換回eth0
。**只要三個介面中的任何一個正常工作,您的伺服器就會保持線上狀態。**要連接到您的伺服器,您可以使用 eth0 的 IP 地址,如果失敗,請使用 wlan1 或 wlan0 的 IP 地址。