在家庭环境中,多个路由器串联使用时,常会遇到「不同子网之间无法互通」的问题。比如:

  • 路由器 A:默认网关:192.168.1.1,子网 192.168.1.0/24,wan口地址:10.247.239.218/16
  • 路由器 B:默认网关:192.168.31.1,子网 192.168.31.0/24,wan口地址:10.247.71.145/16

本文记录一次排查并成功打通双向通信的完整过程。
网络扩扑图如下:

192.168.1.0/24(路由器A)
         |
         |———> 10.247.x.x 网络(上层交换机)
         |
192.168.31.0/24(路由器B)

设置静态路由

在路由器后台中找到静态路由,如果路由器中没有静态路由就需要开启路由器的ssh连接然后通过ssh连接来设置静态路由。
我这边两台小米路由器,分别是刷了openwrt系统的小米路由器4A千兆版(路由器A)和原版固件的小米AIoT路由器 AX3600(R3600)(路由器B)。因为后续还需要修改防火墙配置,这里直接用ssh连接两台路由器进行演示。(AX3600开启ssh
通过ssh登录路由器A和路由器B,分别为两台路由器添加静态路由
命令解析
ip route add <目标子网> via <目标wan口地址> dev <接口>
路由器A

ip route add 192.168.31.0/24 via 10.247.71.145 dev wan proto static

路由器B

ip route add 192.168.1.0/24 via 10.247.239.218 dev eth1

使用命令ip route show查看是否添加成功
路由器A

root@A211-2:~# ip route show
default via 10.247.254.254 dev wan proto static src 10.247.239.218
10.247.0.0/16 dev wan proto kernel scope link src 10.247.239.218
192.168.1.0/24 dev br-lan proto kernel scope link src 192.168.1.1
192.168.31.0/24 via 10.247.71.145 dev wan proto static  #添加的静态路由

路由器B

root@XiaoQiang:~# ip route show
default via 10.247.254.254 dev eth1  proto static  src 10.247.71.145
default via 10.247.254.254 dev eth1  metric 50
10.247.0.0/16 dev eth1  proto kernel  scope link  src 10.247.71.145
192.168.1.0/24 via 10.247.239.218 dev eth1  #添加的静态路由
192.168.31.0/24 dev br-lan  proto kernel  scope link  src 192.168.31.1

做到这步后应该可以实现A路由到B路由的相互通信(通过ping命令检查)

root@XiaoQiang:~# ping 192.168.1.1
PING 192.168.1.1 (192.168.1.1): 56 data bytes
64 bytes from 192.168.1.1: seq=0 ttl=64 time=0.843 ms
64 bytes from 192.168.1.1: seq=1 ttl=64 time=0.675 ms
64 bytes from 192.168.1.1: seq=2 ttl=64 time=0.728 ms
64 bytes from 192.168.1.1: seq=3 ttl=64 time=0.802 ms
^C
--- 192.168.1.1 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.675/0.762/0.843 ms
root@A211-2:~# ping 192.168.31.1
PING 192.168.31.1 (192.168.31.1): 56 data bytes
64 bytes from 192.168.31.1: seq=0 ttl=64 time=1.051 ms
64 bytes from 192.168.31.1: seq=1 ttl=64 time=0.870 ms
64 bytes from 192.168.31.1: seq=2 ttl=64 time=0.812 ms
64 bytes from 192.168.31.1: seq=3 ttl=64 time=0.659 ms
64 bytes from 192.168.31.1: seq=4 ttl=64 time=0.737 ms
64 bytes from 192.168.31.1: seq=5 ttl=64 time=0.815 ms
^C
--- 192.168.31.1 ping statistics ---
6 packets transmitted, 6 packets received, 0% packet loss
round-trip min/avg/max = 0.659/0.824/1.051 ms

但是当我们使用A路由访问B路由下的子设备(如:192.168.31.39)或者B路由访问A路由下的子设备时(如:192.168.1.172)会发现并没有返回数据包,这是因为路由器本身防火墙的阻止了转发,接下来我们来配置防火墙。

配置防火墙

编辑防火墙配置文件

vi /etc/config/firewall

在配置文件中找到如下字段,如果你看到的是 REJECTDROP,就需要改为 ACCEPT 并在下方添加 forwarding 配置。

config zone
    option name 'wan'
    option input 'ACCEPT'
    option forward 'ACCEPT'
    option output 'ACCEPT'
    
config forwarding
    option src 'wan'
    option dest 'lan'

两个路由器上的都需要修改,修改完后保存并重新启动防火墙

/etc/init.d/firewall restart

完成配置后测试下能否访问路由下的子设备(通过traceroute命令检查)
如果traceroute后出来的内容与下方的不符需要根据实际情况定位问题。
路由器A

root@A211-2:~# traceroute 192.168.31.39
traceroute to 192.168.31.39 (192.168.31.39), 30 hops max, 46 byte packets
 1  10.247.71.145 (10.247.71.145)  0.777 ms  0.747 ms  0.636 ms
 2  192.168.31.39 (192.168.31.39)  1.895 ms  6.824 ms  5.916 ms

从输出命令中可以看到,路由器A对192.168.31.39这个IP的请求如下:

 路由器A(192.168.1.1)→路由器B(10.247.71.145)→路由器B下的子设备(192.168.31.39)

路由器B

root@XiaoQiang:~# traceroute 192.168.1.172
traceroute to 192.168.1.172 (192.168.1.172), 30 hops max, 46 byte packets
 1  10.247.239.218 (10.247.239.218)  0.949 ms  1.195 ms  0.623 ms
 2  192.168.1.172 (192.168.1.172)  1.337 ms
  *  0.861 ms

从输出命令中可以看到,路由器A对192.168.31.39这个IP的请求如下:

路由器B(192.168.31.1)→路由器A(10.247.239.218)→路由A下的子设备(192.168.1.172) 

至此就实现了两个路由器相互通信!

总结

遇到多路由器组网问题时,很多“明明能互 ping 网关,却互访不了设备”的问题,80% 是路由和防火墙配置问题。

这次实战更清晰地理解了:

  • 静态路由设置了就生效但重启会恢复;
  • 防火墙默认 REJECT 时,要显式开放跨网段通信规则,修改防火墙配置后需重启或重载防火墙;
  • traceroute 是定位问题的利器!

补充

为防止静态路由重启丢失,建议直接把这个路由规则写到network文件中。
如果你是在openwrt或者路由器后台添加静态路由不需要在此处修改,因为在后台添加了静态路由后会自动写入到network文件中。
编辑network文件

vi /etc/config/network

路由器A

config route
	option interface 'wan'
	option target '192.168.31.0/24'
	option gateway '10.247.71.145'

路由器B

config route
	option interface 'wan'
	option target '192.168.1.0'
	option netmask '255.255.255.0'
	option gateway '10.247.239.218'
  • option interface这里用逻辑接口名,不是物理设备名,所以这边使用的是wan而不是eth1,可用 uci show network 看绑定关系。
  • option target目标地址,不能写CIDR,需要 target + netmask 分开(路由器A中使用的是CIDR,我是直接在openwrt后台配置的静态路由,这个配置是由openwrt自动添加进来的,但是我在路由器B手动设置时效仿它使用CIDR会报错,将IP和子网掩码分开后便没问题了,不清楚具体原因 )
  • option netmask子网掩码
  • option gateway下一跳地址(wan口的地址)