![两个内部网卡上的路由工作方式不同](https://linux22.com/image/1073002/%E4%B8%A4%E4%B8%AA%E5%86%85%E9%83%A8%E7%BD%91%E5%8D%A1%E4%B8%8A%E7%9A%84%E8%B7%AF%E7%94%B1%E5%B7%A5%E4%BD%9C%E6%96%B9%E5%BC%8F%E4%B8%8D%E5%90%8C.png)
在一台 Ubuntu 22.04 服务器上,我有两个内部网卡和一个外部网卡连接到互联网。我使用 Netplan 定义了以下接口:
network:
ethernets:
eno1:
dhcp4: true
dhcp4-overrides:
route-metric: 100
enp2s0:
addresses:
- 172.16.1.1/24
nameservers:
addresses:
- 127.0.0.53
- 8.8.8.8
search:
- wombats.org
routes:
- to: default
via: 192.168.0.254
- to: 172.16.1.0/24
via: 172.16.1.1
metric: 200
table: 101
routing-policy:
- from: 172.16.1.0/24
table: 101
wlp8s0:
dhcp4: no
addresses:
- 172.16.2.1/24
routes:
- to: 172.16.2.0/24
via: 172.16.2.1
metric: 20
table: 102
routing-policy:
- from: 172.16.2.0/24
table: 102
version: 2
连接到 enp2s0 的计算机可以完美地路由到互联网和内部。当同一台计算机通过 wlp8s0 连接时,它甚至无法到达由 enp2s0 (172.16.1.1/24) 管理的网络。以下是通过 enp2s0 连接的两个路由表:
ip r
default via 172.16.1.1 dev enxf8e43b9d4867 proto dhcp metric 100
169.254.0.0/16 dev enxf8e43b9d4867 scope link metric 1000
172.16.1.0/24 dev enxf8e43b9d4867 proto kernel scope link src 172.16.1.3 metric 100
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
通过wlp8s0连接:
ip r
default via 172.16.2.1 dev wlp0s20f3 proto dhcp metric 20600
169.254.0.0/16 dev wlp0s20f3 scope link metric 1000
172.16.2.0/24 dev wlp0s20f3 proto kernel scope link src 172.16.2.4 metric 600
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
显著的区别是两种配置中默认路由的度量。这不是来自 DHCP 服务器,因为两个子网的配置相同。我尝试禁用 ufw 并尝试添加 iptables。但所有这些都没有改变结果。
我不明白为什么我无法路由 wlp8s0 的流量!一个 NIC 是电缆而另一个是 wifi 这一事实能解释两者的区别吗?不应该,因为它们以相同的方式获得服务 IP。
谢谢你的帮助。Jan
答案1
这个问题的解决方案有两个方面:首先,需要在两个接口(子网)上进行伪装:
-A POSTROUTING -s 172.16.1.0/24 -o eno1 -j MASQUERADE
-A POSTROUTING -s 172.16.2.0/24 -o eno1 -j MASQUERADE
然后同样重要的是,接口是否通过运营商启动。这在 /etc/netplan/00-installer-config.yaml 中使用以下行完成:
enp2s0:
ignore-carrier: true
wlp8s0 也一样。如果你没有