iptables Masquerade 遗漏了一些本地数据包?

iptables Masquerade 遗漏了一些本地数据包?

在 openwrt 中,我已启用配置lan转发。我的局域网是.当某些电脑 ping 其他网络 IP(例如:192.168.1.15)时,tcpdump 会在 wan 中获取一些本地数据包,这会导致 wan 关闭。 (我的WAN是3G调制解调器)。wanmasq192.168.100.0/24

openwrt防火墙配置:

config defaults
    option syn_flood '1'
    option input 'DROP'
    option output 'DROP'
    option forward 'DROP'

config zone
    option name 'lan'
    list network 'lan'
    option input 'ACCEPT'
    option forward 'DROP'
    option output 'ACCEPT'

config zone
    option name 'cellular'
    list network 'cellular'
    option input 'DROP'
    option forward 'DROP'
    option output 'ACCEPT'
    option masq '1'
    option mtu_fix '1'

config forwarding
    option src 'lan'
    option dest 'cellular'

当电脑在局域网中执行时:

 ping -I 192.168.1.15 114.114.114.114

我可以在 ppp 中捕获一些无效数据包

 tcpdump -i 3g-cellular -s 0 -w a.pcap

在此输入图像描述

iptables -t nat -L -v:

Chain POSTROUTING (policy ACCEPT 119 packets, 7439 bytes)
 pkts bytes target     prot opt in     out     source               destination         
 337 24011 zone_wan_postrouting  all  --  any    3g-cellular  anywhere             anywhere             /* !fw3 */

Chain zone_wan_postrouting
 pkts bytes target     prot opt in     out     source               destination         
  337 24011 MASQUERADE  all  --  any    any     anywhere             anywhere             /* !fw3 */

答案1

换句话说,openwrt防火墙似乎只对来自自己局域网的数据包进行NAT。所以该iptables规则可能对来源有额外的限制。

您可以通过检查iptables当前防火墙配置生成的所有规则(等等iptables -S)来验证这一点

作为解决方法,您可以将iptablesNAT 规则直接修改为不使用源过滤器的变体。

我不知道如何更改 openwrt 防火墙配置,以便它生成iptables您想要的规则。也许 OpenWRT 社区会知道。

编辑

zone_wan_postrouting现有 OpenWRT 防火墙配置中并非所有数据包最终都会到达 的情况示例:

# iptables -S -t nat
...
-A POSTROUTING -j delegate_postrouting
-A delegate_postrouting -m comment --comment "user chain for postrouting" -j postrouting_rule
-A delegate_postrouting -o br-wan -j zone_wan_postrouting
-A delegate_postrouting -o br-client -j zone_client_postrouting
-A delegate_postrouting -o local-node -j zone_local_node_postrouting
...
-A zone_wan_postrouting -m comment --comment "user chain for postrouting" -j postrouting_wan_rule
-A zone_wan_postrouting -j MASQUERADE
...

正如您所看到的,链POSTROUTING跳转 ( -j) 到delegate_postrouting,在那里它检查数据包是否具有 的传出接口br-wan,在这种情况下它会跳转到zone_wan_postrouting,在那里它无条件地伪装该数据包。其他出接口(br-client, local-node)转发到不同的链。

所以条件是的出接口br-wan。很容易添加其他条件,例如某些源或目标范围:

-A delegate_postrouting -o br-wan -s 192.168.100.0/24 -j zone_wan_postrouting

或者甚至更复杂的数据包标记、协议、端口和许多其他内容。

所以实际上没有看着你所有的 iptables 规则,我们都不会知道。也许确实所有数据包都是这样走的,而问题出在其他地方。也许还有一个没有出现在 中的额外条件iptables -L。也许不会。

相关内容