双NAT场景下如何从主路由器访问二级路由器子网?附问题排查与解决方案
我的网络拓扑与初始问题
我家里的网络是这样的:ISP提供的主路由器R1网关是192.168.0.1,二级路由器R2(型号是Archer C20)通过WAN口接R1的LAN口,R1给R2分配的WAN口IP是192.168.0.2。R2自己的局域网是192.168.5.0/24,网关是192.168.5.1。
目前的情况是:从R2的子网里能正常访问R1的LAN,但反过来,从R1的LAN里却没法访问R2的子网。我查了不少相关问题,但还是没搞清楚原因,也不知道有没有解决办法。
我原本以为,在R1的设备上执行sudo ip route add 192.168.5.0/24 via 192.168.0.2这条命令,就能ping通192.168.5.1了——毕竟R2肯定认识自己的子网啊,但实际操作后完全没效果。
我的实际需求与初步调整
其实我做这个网络配置有三个核心目标:
- 隔离两个网络,避免互相访问
- 只让R1上的VPN服务能访问R2的子网(用来远程唤醒设备)
- 用R2的子网避开VPN的子网冲突,同时不改动ISP路由器R1的LAN设置
但很快我发现,R2的子网还是能访问R1的主网络,因为R2的默认网关就是R1,这完全达不到我想要的“保护主网络”的效果。那时候我甚至考虑把R2改成AP模式,只给VPN服务限制访问特定设备。
问题根源:防火墙限制
后来终于找到问题所在了!正如@user1686指出的,是R2的防火墙在搞鬼。我之前没注意到R2的安全设置里有个“Enable SPI Firewall”选项,把它关闭之后,之前加的静态路由立刻生效了!
具体操作步骤
如果要让R1的设备能访问R2子网,可以这么做:
- 在需要访问的设备上添加静态路由:
sudo ip route add 192.168.5.0/24 via 192.168.0.2(如果是无线连接的话,可能需要加上dev wlan0) - 用
route -n或者ip route get 192.168.5.12命令验证路由是否正确添加 - 用ping测试能不能通R2子网内的设备
- 要是想让路由设置持久化,可以把命令写到
/etc/dhcpcd.exit-hook文件里
不过这里有个小插曲:虽然能ping通R2子网里的设备,但没法通过浏览器访问R2的管理后台192.168.5.1,这是路由器默认的访问限制,属于正常情况。
关于双NAT的利弊分析
正如@harrymc和@davidgo提到的,我这种配置其实是典型的双NAT场景:
- 对大部分普通用户来说,双NAT可能没什么明显影响,但在游戏主机联网、对外暴露服务时,就会带来额外的麻烦。比如如果我在R2子网里放了一个网页服务,要么得做两次端口映射(PAT),要么把R2设为DMZ,或者在R1里添加静态路由(前提是R1支持)。
- 更关键的是,我原本想隔离主网络的目标根本没法实现——因为R2的默认网关指向R1,所以R2子网的设备还是能访问主网络,而且路由管理起来也很复杂。所以用双NAT来做防火墙隔离是个糟糕的选择,网络安全最终还是得靠端口限制、服务配置和强密码来保障。
最终推荐解决方案
经过这次折腾,我总结出两个更合理的方案:
方案一:将R2改为AP模式
把R2切换成AP模式,关闭它的DHCP服务,让R1统一管理所有设备的IP地址。推荐用R2的LAN口接R1的LAN口,就算是AP模式下LAN接WAN也可以。如果需要用VPN,记得调整网络设置解决子网冲突的问题。
方案二:把R1改为桥接模式,让R2做主路由器
如果想要对网络有完全的管理权限,可以把ISP提供的R1改成桥接模式,让R2作为整个网络的主路由器,所有设备都由R2来管理。
备注:内容来源于stack exchange,提问作者Rodrigo




