在我的服务器中,我有两个以太网卡:
enp0s17
, 本地 IP192.168.0.7
, 路由器的公共地址x.x.x.x
, 网络掩码255.255.255.255
enp0s18
, 本地 IP172.16.0.7
, 路由器的公共地址y.y.y.y
, 网络掩码255.255.255.0
在这两个网络上,两个公共 IP 的任何传入流量都将路由到服务器。因此,实际上任何 SSH、HTTP 等都x.x.x.x
应该被转发到192.168.0.7
,任何流量都y.y.y.y
应该被转发到172.16.0.7
.
不幸的是,这一次只适用于其中一个。有时(在断开服务器并重新连接到互联网后,例如重新启动后)这适用于enp0s17
有时适用于enp0s18
但从不同时适用于两者。(因此,两个路由器都正确路由,似乎是服务器的问题。)
同样的问题适用于使用curl --interface enp0s1X ...
.
另一方面,任何本地流量都在正确路由。在这两个网络中,服务器始终在其本地 IP 上可用。
有谁知道可能导致此问题的原因或如何解决?
出于测试目的,我完全禁用了防火墙,因此,这应该不是问题。
(这两个接口也都使用 IPv6 前缀委托,但我只是将其排除在外,因为它工作正常。)
两个路由器都是 Ubiquiti EdgeRouter。IP 由路由器上的 DHCP 服务器静态提供。网络配置是使用netplan
. 使用 Ubuntu 20.04。
我的netplan
配置:
network:
version: 2
renderer: networkd
ethernets:
enp0s17:
dhcp4: yes
dhcp6: yes
enp0s18:
dhcp4: yes
dhcp6: yes
默认路由:
default via 192.168.0.1 dev enp0s17 proto dhcp src 192.168.0.7 metric 100
default via 172.16.0.1 dev enp0s18 proto dhcp src 172.16.0.7 metric 100
172.16.0.0/16 dev enp0s18 proto kernel scope link src 172.16.0.7
172.16.0.1 dev enp0s18 proto dhcp scope link src 172.16.0.7 metric 100
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
172.18.0.0/16 dev br-b20299b5e473 proto kernel scope link src 172.18.0.1
172.19.0.0/16 dev br-ba582f6855c2 proto kernel scope link src 172.19.0.1
192.168.0.0/24 dev enp0s17 proto kernel scope link src 192.168.0.7
192.168.0.1 dev enp0s17 proto dhcp scope link src 192.168.0.7 metric 100
你的问题是你有两条默认路由——你只能有一条。您的传入数据很好。但是当您的服务器发送回复时,由于您有两个默认路由,服务器会在这两个路由之间交替。即,一半的数据包方向错误。
您需要为默认选择一个接口,并且需要为其他网络添加显式路由。