现象:

当linux系统下有多个网络接口时,变更网络接口配置文件,可能会导致网关优先级改变,从而导致服务进程无法接收到外网请求(下面进行wireshark抓包实验)。解决办法

实验测试:

环境为Debian12带桌面环境,其中有2个网络接口,ens33为连通外网的网络接口(192.168.1.0/24),ens37为私有内网的网络接口(192.168.2.0/24不与外网连通)。有公网ip的主路由把内网中Debian12主机的服务端口映射到外网。

过程复现:

i-sdyy.webp

手动切换网络接口配置(手动点击切换“代理”,再点击切换“直连”),触发网关优先级改变

然后使用python自带的http文件服务器作为连通性测试

python -m http.server 50001

测试1:同一内网主机使用内网ip访问

测试结果:正常

测试2:同一内网主机使用公网ip访问

测试结果:正常

测试3:外网主机使用公网ip访问

同时使用wireshark抓包

测试结果:可观察到,图一中python文件服务器没有访问记录,图二中wireshark有抓到tcp请求,但没有看到tcp响应,tcp握手没有成功,客户端也访问失败。

这时查看网关优先级:

发现ens37私有内网网关(192.168.2.1)的优先级(度量值116)大于ens33外网网关(192.168.1.1)的优先级(度量值117)【度量值越小优先级越高】

解决办法:更改网关优先级

可以通过切换另一个网络接口(ens37)配置或者使用命令来更改ens37的网关优先级

删除ens37接口上的192.168.2.1网关

sudo ip route del default via 192.168.2.1 dev ens37

重新在ens37接口上添加192.168.2.1网关,并设置度量值为200

sudo ip route add default via 192.168.2.1 dev ens37 metric 200

然后查看网关优先级:

发现ens33外网网关网关的优先级已经大于ens37私有内网网关了,理论上解决了问题

这时使用外网主机访问测试:

结果:正常访问,解决问题

枯死的灌木!