You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

双NAT场景下如何从主路由器访问二级路由器子网?附问题排查与解决方案

双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

火山引擎 最新活动