多網路卡 配置多閘道器

redrobot發表於2024-05-31

來自:

在具有多網路卡和多閘道器的計算機系統中進行配置,可以透過以下步驟實現。配置的具體步驟和方法可能會因作業系統的不同而有所不同。這裡主要以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

shell
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檔案中新增:

shell
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,新增兩條自定義路由表:

shell
1 rt1 2 rt2

配置網路卡eth0的路由

shell
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的路由

shell
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命令來配置路由規則:

shell
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 並新增以下內容:

shell
#!/bin/sh -e # 配置網路卡 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 # 配置路由規則 ip rule add from 192.168.1.2/32 table rt1 ip rule add from 10.0.0.2/32 table rt2 exit 0

6. 重啟網路服務

最後,重啟網路服務以使配置生效:

shell
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.10192.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-XXXXroute-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就可以實現自動的配置了。

==============================================

相關文章