如何解决非对称路由问题?
如何解决非对称路由问题?
兄弟,我看你遇上的这个SSH掉线问题,妥妥的非对称路由坑!先帮你捋清楚来龙去脉,再给你几个实用的解决办法。
先明确你的网络场景
你的网络环境大概是这样的:
- PfSense路由器,带一个未标记的主网段
10.1.0.0/23,还有个标记为VLAN40的子网10.1.40.0/24 - 无线电脑连主网段,IP是
10.1.0.11 - Linux服务器插了两块网卡,分别通过路由器DHCP拿到主网段的
10.1.0.200和VLAN40的10.1.40.200
问题根源拆解
你遇到的情况是:连服务器主网IP完全稳定,但连VLAN40的IP时,SSH刚连上20-40秒就掉线,还能在PfSense日志里看到默认拒绝规则的记录——这本质是非对称路由在搞鬼!
我给你拆解下数据包的走向:
- 无线电脑(
10.1.0.11)发请求到服务器的10.1.40.200,数据包走主网到PfSense,再转发到VLAN40,这一步符合路由器规则,所以日志里会出现那条允许的记录。 - 服务器收到请求后,因为它本身有主网的网卡,而且主网的默认路由优先级更高,回包时直接从主网卡发回给
10.1.0.11,根本没走VLAN40的网卡回PfSense。 - PfSense的状态检测机制就懵了:我只记录了「从
10.1.0.11到10.1.40.200」的会话状态,现在突然收到「从10.1.0.200到10.1.0.11」的回包,这不在我记录的会话里啊!直接触发默认拒绝规则丢包,你的SSH连接自然就断了。
实用解决方案
方案1:给Linux服务器加静态路由(推荐,最灵活)
你需要在服务器上配置一条静态路由,让所有来自10.1.0.0/23网段的回包,都走VLAN40的网卡发回PfSense。
假设服务器上VLAN40的网卡叫eth1(用ip a命令可以查实际网卡名),先执行临时生效的命令:
ip route add 10.1.0.0/23 via 10.1.40.1 dev eth1
这里的10.1.40.1是VLAN40网段的网关(也就是PfSense上VLAN40接口的IP),记得换成你实际的网关地址。
要永久生效的话,不同发行版配置方式不一样:
- Ubuntu/Debian:编辑
/etc/netplan/00-installer-config.yaml(或你的netplan配置文件),添加对应路由配置 - CentOS/RHEL:编辑
/etc/sysconfig/network-scripts/ifcfg-eth1,添加网关和静态路由条目,或者单独编辑/etc/sysconfig/network-scripts/route-eth1文件
方案2:修改PfSense的状态检测设置(不推荐,影响安全性)
如果你不想改服务器配置,可以关闭PfSense针对该会话的状态检测,但这会降低防火墙安全性,因为会绕过部分状态检查机制。
操作步骤:
- 登录PfSense后台,进入防火墙 > 规则 > LAN
- 编辑那条「Default allow LAN to any rule」,找到「状态类型」选项,把默认的
状态改成无状态 - 保存应用即可,但这个方案谨慎选择,毕竟会削弱LAN侧的防护能力。
方案3:调整服务器的默认路由
如果服务器大部分流量都在VLAN40网段,可以把默认路由改成VLAN40的网关,这样所有回包都会走VLAN40网卡。但这会影响服务器访问主网外的资源,需要同时配置主网的静态路由,适合特定场景。
临时修改默认路由的命令:
ip route del default ip route add default via 10.1.40.1 dev eth1
永久生效同样需要修改对应发行版的网络配置文件。
备注:内容来源于stack exchange,提问作者KevDog




