我有两个网络和路由器 (均采用 Shibby 的 Advanced Tomato),布局如下:
- 备份路由器网络(192.168.1.1/24)
- 广域网——Xfinity
- LAN - 少量客户端。重要的是,主网络路由器是此网络上的客户端。
- 网络接口
- br0 - 本地。路由器的 IP 为 192.168.1.1
- eth0——Xfinity
- eth2 - 无线网络 - 这是备份网络作为无线客户端连接的网络
- 主路由器网络(192.168.2.1/24)
- 广域网 - 光纤
- LAN - 连接到网状网络接入点。家里的几乎所有设备都通过这些网状网络接入点连接到主网络。特别重要的是我的本地 NAS 和服务主机,例如 Plex、打印机和游戏桌面。
- 负载平衡 - 此路由器是备份网络路由器上的“无线客户端”,并启用了负载平衡的多 WAN。
- 网络接口
- br0 - 本地。路由器的 IP 为 192.168.2.1
- eth0——光纤
- eth2 - 备份网络上的客户端,IP 为 192.168.1.81
工作原理:只要客户端在主网络上,系统就可以正常工作。他们可以访问 NAS、打印机等。他们还可以访问和 ping 备份网络上的任何客户端。
问题:
当客户端位于备份网络上时,就会出现问题。备份网络上的客户端无法访问主网络上的 NAS、打印机等。
我尝试过的方法:我尝试允许备份路由器使其客户端能够访问主路由器网络。我找到了几篇提到这样做的文章,并执行了以下步骤:
- 我尝试将以下 iptables 转发添加到备份网络
iptables -I INPUT -i br0 -j ACCEPT
iptables -I FORWARD -i eth2 -d 192.168.2.0/24 -j ACCEPT
iptables -I FORWARD -i br0 -d 10.9.8.0/24 -j ACCEPT
在备份网络和主网络上启用 IP 数据包转发通过运行
echo 1 > /proc/sys/net/ipv4/ip_forward
添加 ip 路由
ip route add 192.168.2.0/24 via 192.168.1.81
问题
不幸的是,这不起作用。当我尝试从我的备份网络路由器 ping 192.168.2.1 时,我收到错误 - Unable to ping From 192.168.1.1 icmp_seq=1 Redirect Host (New nexthop 192.168.1.81)
。
我猜是 iptables 部分搞错了。我不完全明白我在那里做什么。如果有人能帮忙,我将不胜感激。
答案1
我尝试将以下 iptables 转发添加到备份网络
FORWARD 规则似乎与您的网络描述不匹配:
到达备份路由器 eth2 的数据包(即来自主路由器)将以 192.168.2.0/24 作为其来源,不是目的地;同样,发送到 192.168.2.0/24 的数据包将退出 eth2,而不是进入(即,如果那是
-d
,那么应该是-o eth2
)。如果你将两个方向上的数据包可视化,则应该会看到如下内容:
源地址 目标地址 输入接口 输出接口 192.168.1.0/24 192.168.2.0/24 →br0 eth2→ 192.168.2.0/24 192.168.1.0/24 →eth2 br0→ 你可以只用
-s
和-d
或接口等来添加规则。我建议查看 iptables 规则列表中的数据包计数器,以检查规则是否被匹配任何数据包。10.9.8.0/24 网络似乎没有涉及任何地方。
INPUT 规则并不相关,因为没有任何数据包“输入”到路由器 - 只有当你 ping 路由器的自己的地址。
例如,如果您正在 ping 主路由器,那么对于备份路由器来说,这属于“转发”,而对于主路由器来说,这属于“输入”。但是,如果您正在从另一个客户端 ping 一个客户端,那么对于所有相关路由器来说,这属于“转发”(而对于客户端本身来说,这属于“输入”)。
虽然这是必要的,但它通常应该在添加路由之后进行,而不是之前。请始终记住,IPtables 仅控制数据包是否允许向特定方向转发,但不控制在哪里它们应该被转发——路由表首先决定这一点,然后你根据这一点定制 iptables FORWARD 规则。
通过运行 echo 1 > /proc/sys/net/ipv4/ip_forward 在备份网络和主网络上启用 IP 数据包转发
它们是路由器 - Tomato 固件在出厂时已经启用了数据包转发功能,因为这基本上是路由器的用途,也是您现在访问互联网的方式。
当我尝试从备份网络路由器 ping 192.168.2.1 时,出现错误 - 无法从 192.168.1.1 ping icmp_seq=1 重定向主机(新下一跳 192.168.1.81)。
那不是错误。这是一条可选消息,其中备份路由器指示有更直接的路径可用(绕过路由器);您通常会看到它此外对通常的回应。
实际错误是没有回复,这很可能是由于“备份”路由器的或者“主”路由器的防火墙规则阻止了该方向的数据包。
使用 tcpdump ( tcpdump -n -i ... "icmp"
) 检查数据包到达和退出的位置:
- 他们是否达到了主要的路由器的 eth2 接口?
- 如果没有,则备份路由器不会转发它们(iptables 或路由表可能有误)。
- 如果可以的话:它们是否也能到达主路由器的 br0 接口?
- 如果没有,那么主路由器就不会转发它们(它已经有目的地的本地路由,因此其 iptables 规则不允许这样做)。
- 如果他们确实到达了 br0:客户端是否会尝试响应?
- 如果没有,那么客户端自己的防火墙可能阻止了它。