现象:
当linux系统下有多个网络接口时,变更网络接口配置文件,可能会导致网关优先级改变,从而导致服务进程无法接收到外网请求(下面进行wireshark抓包实验)。解决办法
实验测试:
环境为Debian12带桌面环境,其中有2个网络接口,ens33为连通外网的网络接口(192.168.1.0/24),ens37为私有内网的网络接口(192.168.2.0/24不与外网连通)。有公网ip的主路由把内网中Debian12主机的服务端口映射到外网。
过程复现:
手动切换网络接口配置(手动点击切换“代理”,再点击切换“直连”),触发网关优先级改变
然后使用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私有内网网关了,理论上解决了问题
这时使用外网主机访问测试:
结果:正常访问,解决问题