![IPTables nat 在满足多条规则时会限制 TCP SYN](https://linux22.com/image/704407/IPTables%20nat%20%E5%9C%A8%E6%BB%A1%E8%B6%B3%E5%A4%9A%E6%9D%A1%E8%A7%84%E5%88%99%E6%97%B6%E4%BC%9A%E9%99%90%E5%88%B6%20TCP%20SYN.png)
Linux内核是4.9.17-8.31
我打开了许多映射到单个内部端口的外部端口。原因是每个客户组都有自己的端口,这允许使用 tc 进行上游计费。
规则如下:
iptables -t nat -A PREROUTING -i eth0 -p tcp --match multiport --dports 3000,3032,3064,3096,3128,3160,3192,3224,3256,3288 -j REDIRECT --to-port 54321 iptables -t nat -A PREROUTING -i eth0 -p tcp --match multiport --dports 3330,3352,3384,3416,3448,3480,3512,3544,3576,3608 -j REDIRECT --to-port 54321 iptables -t nat -A PREROUTING -i eth0 -p tcp --match multiport --dports 3640,3672,3704,3736,3768,3800,3832,3864,3896,3928 -j REDIRECT --to-port 54321 iptables -t nat -A PREROUTING -i eth0 -p tcp --match multiport --dports 3960,3992,3024,3056,3088,3113,3152,3184,3216,3248 -j REDIRECT --to-port 54321
如果我测试 400 个连接,并满足其中一条规则,则所有连接都会顺利进行。
如果我测试 100 个连接,命中 4 条规则行中的每一条,我会看到 TCP SYN 数据包的超时和重新传输,我可以使用 tcpdump 捕获 TCP SYN 到达但尚未响应的 TCP SYN ACK 响应。
我找不到丢失或错误点,并且所有符合一条规则的连接都非常稳定。在我的测试场景中,所有 400 个连接都来自单个主机,不确定在更现实的场景中是否存在问题,因为连接将来自多个主机。
为了测试目的,我取消了 tc 的配置,并且可以仅使用 iptables 重现错误。
有兴趣看看过去是否观察到过这种行为。