私有IPV4地址如何通过iptables NAT(tcp RST,FIN)

我有一个路由器使用iptables iptables -t nat -o -j MASQUERADE执行简单的NAT转换

几乎所有的时间都可以正常工作,除了一些TCP RST和FIN数据包正在离开路由器的情况外。

在这种情况下,我设置了一个或两个客户端计算机streamFlashvideo(例如www.nasa.gov/ntv)在路由器,然后拆除并重新build立公共接口(这是一个调制解调器)正如预期的闪存stream熄灭。 连接重新build立后,我尝试刷新Flash页面,我看到一些TCP RST和[FIN,ACK]数据包离开公共接口(我假设Flash试图恢复其stream)。

我不知道这些数据包是如何离开路由器非NAT的

谢谢你的提示。 我正是我需要把我放在正确的轨道上。

根本原因是LAN和公共接口之间未经过滤的转发。 当公共接口被拆除时,它清除了conntrack条目。 然后客户试图恢复连接,最终发送RST和FIN数据包。 由于NAT仅在新build连接上build立,因此这些数据包将不加修改地离开路由器。

我不得不改变我的转发规则,只允许NEW,ESTABLISHED,RELATED包从私有局域网转发。

丢弃[RST,ACK][FIN,ACK]将不起作用。 有很多应用程序,如ftp上传,将无法完成FTP传输。 gscott的评论是正确的方法,但需要一个额外的要求。 你必须严格执行这项政策

iptables -P OUTPUT DROP iptables -P FORWARD DROP iptables -P INPUT DROP 

有了这个,你需要指定所有的规则,否则数据包将被丢弃。

这可能是iptables的MASQUERADE目标中的一个错误。 在你的情况下,似乎你有以下合作事件:

  • 数据包碰巧属于已经存在于状态表中的连接
  • 状态条目包括不再由系统拥有的NAT地址源

因此,伪装数据包的尝试可能会失败,因为要伪装成无效的地址,因此数据包没有改变。

MASQUERADE目标的预期行为是在接口closures或更改地址时清除相应的状态条目,所以这种情况不应该发生。 但是有一个为iptables报告的古老的bug ,听起来像是可能触发类似的行为。

要进一步排除故障,请记下路由器的公共IP地址,重现问题并使用egrep 12.34.56.78 /proc/net/ip_conntrack (其中12.34.56.78是您之前logging的IP地址)查看状态表)。 如果尽pipe公共接口地址已经改变,但仍旧使用旧的IP地址,那么您可能正在运行一个iptables错误 – 考虑更新您的内核/ iptables并将问题报告给netfilter团队。

FYI

另一种防止在公共networking中进行FIN,ACK和RST,ACK包的方法是在传出链中阻止它们

 iptables -I OUTPUT -s <internal net> -p tcp --tcp-flags ALL RST,ACK -j DROP iptables -I OUTPUT -s <internal net> -p tcp --tcp-flags ALL FIN,ACK -j DROP iptables -I OUTPUT -s <internal net> -p tcp --tcp-flags ALL FIN -j DROP iptables -I OUTPUT -s <internal net> -p tcp --tcp-flags ALL RST -j DROP 

这帮助我防止欺骗包裹。