來自:
在具有多網路卡和多閘道器的計算機系統中進行配置,可以透過以下步驟實現。配置的具體步驟和方法可能會因作業系統的不同而有所不同。這裡主要以Linux系統為例,介紹如何配置多網路卡和多閘道器。
1. 確定網路卡介面和IP地址
假設我們有兩塊網路卡:
- 網路卡1 (
eth0
),連線到網路1 (192.168.1.0/24
),閘道器為192.168.1.1
。 - 網路卡2 (
eth1
),連線到網路2 (10.0.0.0/24
),閘道器為10.0.0.1
。
2. 配置網路卡IP地址
編輯網路配置檔案,給每個網路卡分配一個IP地址。
配置網路卡eth0
檔案路徑:/etc/network/interfaces
auto eth0 iface eth0 inet static address 192.168.1.2 netmask 255.255.255.0 gateway 192.168.1.1
配置網路卡eth1
同樣在/etc/network/interfaces
檔案中新增:
auto eth1 iface eth1 inet static address 10.0.0.2 netmask 255.255.255.0 gateway 10.0.0.1
3. 配置路由表
為了使用多閘道器,需要配置路由表。我們需要使用ip route
命令來配置策略路由。
建立路由表
編輯檔案 /etc/iproute2/rt_tables
,新增兩條自定義路由表:
1 rt1 2 rt2
配置網路卡eth0
的路由
ip route add 192.168.1.0/24 dev eth0 src 192.168.1.2 table rt1 ip route add default via 192.168.1.1 dev eth0 table rt1
配置網路卡eth1
的路由
ip route add 10.0.0.0/24 dev eth1 src 10.0.0.2 table rt2 ip route add default via 10.0.0.1 dev eth1 table rt2
4. 配置路由規則
使用ip rule
命令來配置路由規則:
ip rule add from 192.168.1.2/32 table rt1 ip rule add from 10.0.0.2/32 table rt2
5. 儲存配置
為了使這些配置在系統重啟後依然有效,可以將這些命令新增到系統啟動指令碼中。
編輯檔案 /etc/rc.local
並新增以下內容:
6. 重啟網路服務
最後,重啟網路服務以使配置生效:
sudo systemctl restart networking
透過上述步驟,可以在具有多網路卡和多閘道器的系統上實現正確的網路配置,從而確保流量根據不同的路由表進行路由。
==================================================
來自:https://www.ichenfu.com/2020/11/24/multi-nics-policy-routing/
多網路卡環境下利用策略路由實現網路流量同進同出
當一臺機器有超過1塊網路卡,並且配置的IP地址不在一個段裡的時候,會出現在外部只有一個IP地址能夠ping通的情況,舉個最簡單的例子:
一個有2塊網路卡的機器:
[root@test]# ip addr
2: enp24s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 11:11:11:11:11:11 brd ff:ff:ff:ff:ff:ff
inet 192.168.100.10/24 brd 192.168.100.255 scope global enp24s0f1
valid_lft forever preferred_lft forever
3: enp24s0f1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 22:22:22:22:22:22 brd ff:ff:ff:ff:ff:ff
inet 192.168.200.10/24 brd 192.168.200.255 scope global enp24s0f1
valid_lft forever preferred_lft forever
可以看到兩塊網路卡,分別配置了192.168.100.10
和192.168.200.10
這兩個IP,再看看機器的預設路由:
[root@test]# ip route
default via 192.168.100.1 dev enp24s0f0
192.168.100.0/24 dev enp24s0f0 proto kernel scope link src 192.168.100.10
192.168.200.0/24 dev enp24s0f1 proto kernel scope link src 192.168.200.10
從路由可以發現這機器的預設閘道器是192.168.100.1
,那麼,如果跨越閘道器去ping這臺機器的話,會出現只有192.168.100.10
能通的情況:
[root@test2]# ping 192.168.100.10 -c 2
PING 192.168.100.10 (192.168.100.10) 56(84) bytes of data.
64 bytes from 192.168.100.10: icmp_seq=1 ttl=56 time=1.84 ms
64 bytes from 192.168.100.10: icmp_seq=2 ttl=56 time=0.804 ms
--- 192.168.100.10 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.804/1.319/1.835/0.515 ms
[root@test2]# ping 192.168.200.10 -c 2
PING ping 192.168.200.10 (ping 192.168.200.10) 56(84) bytes of data.
^C
--- ping 192.168.200.10 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1062ms
可以看到只有第一個IP能通。那麼,如果想讓兩個IP都能通訊需要怎麼做呢?我們簡單分析一下:
假設ping的源主機IP地址是192.168.1.20
,那麼ping包會首先到達192.168.200.0/24
的閘道器,在這個場景是192.168.200.1
,然後閘道器把包轉發給機器的第二塊網路卡,從接收的這條鏈路來說,是沒有問題的。
那麼回包的鏈路呢?因為發起通訊的源IP不在同網段,所以會查詢路由表,會根據路由表發給預設閘道器,而測試機器的預設閘道器是192.168.100.1
,需要將流量從第一塊網路卡出去。
從回包的鏈路考慮就會有一些問題,相當於流量從一塊網路卡進來,但是又從另外網路卡出去。預設情況下,Linux會透過一個Reverse Path Filtering (rp_filter)的機制,限制這種情況發生。
那麼要修改也很簡單:
[root@test2]# echo "net.ipv4.conf.all.rp_filter = 0" >> /etc/sysctl.conf
[root@test2]# sysctl -p
配置rp_filter=0
之後,再去測試,發現第二塊網路卡已經可以正常被外部訪問了。
到這裡,網路通斷問題算是解決了,但是呢,流量路徑並不是最優解。目前這個情況,所有出去的流量全都走網路卡1,一方面網路卡2的出方向頻寬浪費了,另外一方面如果網路卡1出現一些問題導致中斷,那網路卡2的IP地址也無法訪問了,可用性並沒有提升。
針對兩塊網路卡的機器,一個很自然的想法,是不是可以某一塊網路卡進來的流量,也從同一塊網路卡出去呢?
這裡就需要策略路由的幫助了,其實這個問題,可以轉化成根據source地址選擇不同的路由,因為從這臺機器發出去的網路包,源地址不是192.168.100.10
,就是192.168.200.10
,那需求就很簡單了,如果發現源地址是192.168.100.10
,那就走網路卡1的預設路由出去,如果源地址是192.168.200.10
,那就走網路卡2的預設路由出去。這樣的話,相當於機器上有兩個預設路由了,這樣可以麼?
答案是可以的,不過需要將這兩個預設路由分到兩張不同的路由表上。根據這篇Routing Tables文章可以看到Linux支援很多張路由表,其實預設我們用ip route
命令操作的就是main
這張表。透過加表id或者名字的方式,可以讓ip命令操作不同的路由表。
[root@test]# ip route add default via 192.168.200.1 dev enp24s0f1 table 101
[root@test]# ip route show table 101
default via 192.168.200.1 dev enp24s0f1
這裡新增了一條新的預設路由default via 192.168.200.1 dev enp24s0f1
到編號為101的表裡。現在有了路由表,還需要一個策略,來讓對應源地址的流量查詢這張路由表就行了:
[root@test]# ip rule add from 192.168.200.0/24 table 101
[root@test]# ip rule show
0: from all lookup local
32765: from 192.168.200.0/24 lookup 101
32766: from all lookup main
32767: from all lookup default
這裡加了一條規則,如果源地址在192.168.200.0/24
內,就使用101這張路由表,而這張路由表就上面加的以網路卡2為出口的。這樣就實現了網路卡流量同進同出的需求。
其實可以透過ip rule show
看到,預設有幾條規則,優先順序最高的規則是local這張表,其次是剛新增的規則,然後是main這張表,最後是default這張表。
最後還有一個問題,這些配置怎麼持久化呢?參考紅帽的文件Networking Guide,可以在/etc/sysconfig/network-scripts
目錄下,新增rule-XXXX
和route-XXXX
檔案,實現配置持久化:
[root@test]# cat route-enp24s0f1
default via 192.168.200.1 dev eth1 table 101
[root@test]# cat rule-enp24s0f1
from 192.168.200.0/24 table 101
新增了配置檔案後,執行ifup enp24s0f1
就可以實現自動的配置了。
==============================================