双ISP多LAN环境下子网主机无法互通的问题求助(Ubuntu/NFTables)
看起来你已经把双WAN的流量分流逻辑跑通了,各个子网的机器能按NFTables规则选ISP上网,这点做得挺棒的!不过子网间连ping都不通的问题,确实是多LAN路由场景里很常见的“隐形坑”,我来给你梳理几个最可能的解决方向,你可以一步步排查:
1. 先确认内核IP转发是不是真的全局生效了
虽然你能正常上网,说明WAN方向的转发是开的,但有时候可能是针对特定接口开的,全局转发没完全放开。你可以先跑个命令验证:
sysctl net.ipv4.ip_forward
如果输出是net.ipv4.ip_forward = 0,那得把它改成1:
sysctl -w net.ipv4.ip_forward=1
要让这个设置重启后也生效,就编辑/etc/sysctl.conf或者/etc/sysctl.d/99-routing.conf,加一行:
net.ipv4.ip_forward=1
然后执行sysctl -p加载配置。
2. 检查NFTables的Forward规则是否拦住了LAN间流量
这大概率是核心问题!你的NFTables规则应该是重点配置了WAN的分流和出站转发,但默认Forward链可能设了DROP策略,又没加允许LAN子网互访的规则。
假设你的LAN子网分别是192.168.1.0/24、192.168.2.0/24、192.168.3.0/24、192.168.4.0/24(你没贴LAN的Netplan配置,得换成你实际的子网段),你需要在NFTables的filter表Forward链里,在DROP规则之前加一条允许LAN互访的规则:
add rule ip filter forward ip saddr {192.168.1.0/24, 192.168.2.0/24, 192.168.3.0/24, 192.168.4.0/24} ip daddr {192.168.1.0/24, 192.168.2.0/24, 192.168.3.0/24, 192.168.4.0/24} accept
如果你的LAN接口是明确的(比如lan1、lan2这类),也可以用接口来匹配,更灵活:
add rule ip filter forward iifname {lan1, lan2, lan3, lan4} oifname {lan1, lan2, lan3, lan4} accept
注意规则的顺序很重要,这条允许规则一定要放在所有DROP或者拒绝规则的前面,不然会被后面的规则覆盖。
3. 检查反向路径过滤(rp_filter)的设置
Linux的反向路径过滤机制,有时候会把LAN间的转发流量当成“异常流量”拦截掉,特别是当你有两个默认路由(双WAN)的时候。你可以先查看当前的rp_filter设置:
sysctl net.ipv4.conf.all.rp_filter
如果输出是1(严格模式),建议改成2(宽松模式),这样路由器会允许来自非默认路由接口的合法内网流量:
sysctl -w net.ipv4.conf.all.rp_filter=2
同样,要永久生效的话,把这行加到sysctl的配置文件里,再执行sysctl -p。
4. 核对Netplan的LAN接口配置
你只贴了WAN1的配置,LAN接口的配置也得确认下:
- 每个LAN接口必须配置对应子网的网关IP(比如lan1设
192.168.1.1/24,lan2设192.168.2.1/24) - LAN接口不要设置默认网关(默认网关只给WAN接口)
- 子网内的主机,默认网关必须设成对应LAN接口的IP,这样主机的跨子网流量才会先发到路由器
举个LAN接口的Netplan配置示例(你要换成自己的实际接口名和子网):
network: ethernets: wan1: # 你的WAN1现有配置 wan2: # 你的WAN2配置(另一个ISP的地址段) lan1: addresses: [192.168.1.1/24] lan2: addresses: [192.168.2.1/24] lan3: addresses: [192.168.3.1/24] lan4: addresses: [192.168.4.1/24] version: 2
5. 检查NFTables的NAT规则是否“画蛇添足”
如果你给LAN间的流量也加了SNAT/MASQUERADE,那会导致流量异常——内网主机之间的转发根本不需要地址转换,只需要纯路由转发。你要确保NAT表的postrouting链里,只有发往WAN接口的流量才做地址转换,比如:
add rule ip nat postrouting oifname {wan1, wan2} masquerade
绝对不要把LAN接口包含在这条规则里。
你可以按这个顺序一步步排查,大概率在第2步就能解决问题。如果还是不行,可以把你的NFTables完整规则贴出来,我再帮你细化分析。
备注:内容来源于stack exchange,提问作者Crazy Polenta

