有问题的网络基本上是这样的:
/----Inet1
/
H1---[111.0/24]---GW1---[99.0/24]
\----GW2-----Inet2
设备说明
- H1:IP 为 192.168.111.47 的主机
- GW1:具有 IP 192.168.111.1 和 192.168.99.2 的 Linux 机器,以及它自己的互联网路由。
- GW2:IP 为 192.168.99.1 的通用无线路由器,它有自己的互联网路由。
- Inet1 和 Inet2:两条可能的互联网路径
简而言之:H 有不止一条可能的互联网路径。
H 应该只在该链接打开时通过 GW2 访问互联网,因此 GW1 有一些专门针对 H1 的基于策略的路由:
ip rule add from 192.168.111.47 table 991
ip route add default via 192.168.99.1 table 991
虽然只要 GW2 与 Internet 有直接链接就可以工作,但当该链接断开时就会出现问题。然后发生的是 GW2 将数据包转发回 GW1,GW1 再次转发回 GW2,从而形成无限循环的 TCP-pingpong。首选结果是数据包刚刚被丢弃。
GW1 上的 iptables 是否可以做些什么来防止这种情况发生?基本上, “如果数据包来自 GW2,但源自 H1,则丢弃它”的 iptables 友好版本
- 注意 1:最好不要更改 GW2 上的任何内容。
- 注 2:H1 需要能够同时与 GW1 和 GW2 通信,反之亦然,但只有 GW2 应该通向互联网
TLDR; H1 应该只允许通过 GW2 访问互联网,但仍然需要能够与 GW1 和 GW2 通信。
编辑: GW1 的接口是“99”网络的 br0.105 和“111”网络的 br0.111。解决方案可能非常简单,也可能不简单,但我自己无法生成正确的 iptables 语法,因此非常感谢您的帮助。
PS:这是这个问题的后续问题
如果可能的话,你真的应该修复你的路由
GW2
。如果不是,您可以设置一个解决方法。让:
然后添加规则
将导致发送到的 ICMP 目标无法到达的消息
<ip-h1>
,如果数据包从<ip-h1>
返回GW2
到GW1
。这里的想法是按 MAC 地址进行过滤,因为您似乎有几条通过此接口到不同路由器的路由,并且您需要区分始发路由器。您可以通过查看其接口配置来获取 MAC 地址
GW2
,或者,如果您无权访问它,则可以通过查看 ARP 缓存表来获取它的 MAC 地址GW1
- 只需运行arp -n
以查看缓存中的当前条目。请注意,如果
GW1
对通过的流量进行 NAT,<int2>
则<ip-h1>
需要是 的 IP 地址<int2>
,而不是H1
.当您要求一种通配符 MAC 地址的方法时 - 没有,iptables mac 模块需要完全匹配。但是您显然可以编写脚本(快速且肮脏,在投入生产之前添加满足您的偏执程度的检查):
由于 G1 是一个 linux 机器,为什么不直接用 ping 测试 G2 的外部接口并在它没有响应时更改默认路由?哎呀,如果你做对了,你可以在 ping 再次开始工作时自动恢复。