我有以下 iptables 规则。
将来自 1.2.3.4 和 5.6.7.8(源)的数据包转发到端口 10000 上的外部 socks5 服务器 10.10.10.10:1080。服务器 IP 为 50.50.50.50
如果源数量不高,同时外部 socks5 数量也不高,则此模式运行良好。一旦我有 50 个源和 30k 个外部 socks - iptables 就会卡住并且没有数据包转发,所以我怀疑 iptables 性能存在限制。有人可以告诉我 nftables 是否更强大吗?如果是的话 - 如何将我的规则转换为 nftables?
*nat
:PREROUTING ACCEPT [1:40]
:INPUT ACCEPT [1:40]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING -s 1.2.3.4,5.6.7.8 -p tcp -m tcp --dport 10000 -j DNAT --to-destination 10.10.10.10:1080
-A POSTROUTING -d 10.10.10.10/32 -p tcp -m tcp --dport 1080 -j SNAT --to-source 50.50.50.50
COMMIT
*filter
:INPUT ACCEPT [15:1012]
:FORWARD ACCEPT [26:1348]
:OUTPUT ACCEPT [9:932]
COMMIT
答案1
以下是对可能出现的问题的粗略解释。
之前iptables规则:
X(OP 的起始示例中 X=2)个源 IP 地址,具有 2^16 个可能的源端口和 1 个目标地址和端口:
X * 2^16 种可能的连接。
之后iptables规则:X 个源被压缩为一个源
1 * 2^16 种可能的连接。
X * 2^16 个连接无法容纳在仅有 2^16 个连接中。源端口冲突将越来越频繁地发生,可以通过更改源端口来解决,但找到一个不与其他流冲突的空闲源端口将变得越来越困难:性能下降开始加剧,甚至可能开始出现丢包的情况。
如果发生这种情况,情况会有所不同吗?iptables被替换为nftables不。在这两种情况下,它们都不是解决冲突的部分。此解决是在同一个通用 Netfilter 后端中完成的:内核nf_nat
模块如果需要的话可能会迭代多次甚至放弃(即放弃新的连接跟踪条目和数据包已触发其试探性创建)。
原因是当只有一个可能的目的地(服务器)时完成源 NAT:应该避免这种情况。
可能的解决方法:
不要使用源 NAT。应设置适当的路由(即使这需要多宿主或隧道),以便 10.10.10.10 不必看到单个 50.50.50.50 源。问题没有解释为什么需要此 SNAT,因此无法进一步详细说明。
有多个源地址进行负载平衡并分散源端口压力。这可以通过以下方式实现iptables使用
statistic
模块对多个SNAT
目标进行负载平衡。
切换到nftables通常是一种改进,但对于这种情况,这似乎不是解决方案。