背景
Windows 建立的虛擬機器只能透過 NAT 上網(橋接需要過認證),但需要橋接到內網供外部訪問。
此場景使用的兩張網路卡會同時被設定為預設閘道器,出口流量有機率從橋接網路卡出口導致無法訪問。
路由表基礎操作
檢視路由策略
[root@localhost ~]# ip rule
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
檢視路由表
[root@localhost ~]# ip route list
default via 172.21.208.1 dev eth0 proto dhcp metric 101
10.60.20.0/24 dev eth1 proto kernel scope link src 10.60.20.12 metric 100
172.21.208.0/20 dev eth0 proto kernel scope link src 172.21.219.71 metric 101
新增預設路由
[root@localhost ~]# ip route add default via 10.60.20.254 dev eth1
刪除預設路由
[root@localhost ~]# ip route del default via 10.60.20.254 dev eth1
多網口出口配置
一般配置多網路卡時,兩張網路卡都會被配置為預設路由,使用 ip route list
檢視能看到類似如下配置
[root@localhost ~]# ip route list
default via 10.60.20.254 dev eth1 proto dhcp metric 100
default via 172.21.208.1 dev eth0 proto dhcp metric 101
10.60.20.0/24 dev eth1 proto kernel scope link src 10.60.20.12 metric 100
172.21.208.0/20 dev eth0 proto kernel scope link src 172.21.219.71 metric 101
對於 default via 10.60.20.254 dev eth1 proto dhcp metric 100
- default 表示預設路由
- via 10.60.20.254 表示資料包將發往 10.60.20.254 這個目標 IP 地址
- dev eth1 指定資料包將從 eth1 介面傳送
- proto dhcp 表示該路由規則是透過 DHCP 協議動態分配的
- metric 100 表示優先順序度量值(越小優先順序越高)
對於 10.60.20.0/24 dev eth1 proto kernel scope link src 10.60.20.12 metric 100
- 這是一個具體的子網路由規則,用於指定資料包如何到達 10.60.20.0/24 子網。
- 10.60.20.0/24 表示目標子網地址範圍
- dev eth1 指定資料包將從 eth1 介面傳送
- proto kernel 表示該路由規則由核心自動生成
- scope link 表示這是一個本地連結,即目標 IP 地址與本機直接相連
- src 10.60.20.12 表示源 IP 地址,即從 10.60.20.12 傳送到目標子網
- metric 100 表示優先順序度量值(越小優先順序越高)
如果不希望訪問外網時透過 10.60.20.254
閘道器,只需將第一條路由刪除即可,執行
[root@localhost ~]# ip route del default via 10.60.20.254 dev eth1
驗證除了 10.60.20.0/24 的地址,都會走 eth0 網路卡
[root@localhost ~]# ip route get 10.60.20.10
10.60.20.10 dev eth1 src 10.60.20.12
cache
[root@localhost ~]# ip route get 1.1.1.1
1.1.1.1 via 172.21.208.1 dev eth0 src 172.21.219.71
cache
[root@localhost ~]# ip route get 8.8.8.8
8.8.8.8 via 172.21.208.1 dev eth0 src 172.21.219.71
cache
儲存設定
以上路由會在重啟後被清理,應使用 ip route save
儲存資訊
sudo ip route save table main > /var/opt/route-main.rules
使用 ip route restore
恢復
sudo ip route flush table main
sudo ip route restore table main < /var/opt/route-main.rules
也可以將其寫為 systemd 指令碼,當網路卡準備完成後執行