100K+ IP 的端口转发

100K+ IP 的端口转发

我需要在我的 Linux ( Debian 8) 上进行端口转发来拦截通过机器的数据包。

它需要基于源IP,因此不同的IP需要不同的端口。

我曾考虑过使用iptablesex。

iptables -t nat -A PREROUTING -s 10.1.10.78/32 -j REDIRECT --to-port 4321
iptables -t nat -A PREROUTING -s 10.1.10.31/32 -j REDIRECT --to-port 4444
iptables -t nat -A PREROUTING -s 10.1.10.79/32 -j REDIRECT --to-port 4321
iptables -t nat -A PREROUTING -s 10.1.10.21/32 -j REDIRECT --to-port 5000

但是,如果规则超过 20K+,机器似乎会变得太慢,iptables 可能是正确的解决方案。我现在可以扩展机器,但是除了iptables这个“简单”的挑战之外,还有其他更好的解决方案吗?

答案1

我手头没有可以模拟您场景的基础设施,但我认为使用自定义 iptables 链可能会有所帮助。这些可以用来级联规则并摆脱庞大的整体PREROUTING链。

你需要考虑如何将 IP 地址分配给不同的链。在这个小例子中,我将使用 IP 子网。

# Create custom chains
iptables -t nat -N chain-net-192.168.1.0/24
iptables -t nat -N chain-net-192.168.2.0/24
iptables -t nat -N chain-net-192.168.3.0/24

# Let appropriate connection jump to proper custom chains
iptables -t nat -A PREROUTING -s 192.168.1.0/255.255.255.0 -j chain-net-192.168.1.0/24
iptables -t nat -A PREROUTING -s 192.168.2.0/255.255.255.0 -j chain-net-192.168.2.0/24
iptables -t nat -A PREROUTING -s 192.168.3.0/255.255.255.0 -j chain-net-192.168.3.0/24

# Inside chain-net-192.168.1.0/24 perform actions
iptables -t nat -A PREROUTING -s 192.168.1.15/32 -j REDIRECT --to-port 4321
iptables -t nat -A PREROUTING -s 192.168.1.25/32 -j REDIRECT --to-port 4321
iptables -t nat -A PREROUTING -s 192.168.1.35/32 -j REDIRECT --to-port 4321

# Inside chain-net-192.168.2.0/24 perform actions
iptables -t nat -A PREROUTING -s 192.168.2.15/32 -j REDIRECT --to-port 4321
iptables -t nat -A PREROUTING -s 192.168.2.25/32 -j REDIRECT --to-port 4321
iptables -t nat -A PREROUTING -s 192.168.2.35/32 -j REDIRECT --to-port 4321

# Inside chain-net-192.168.3.0/24 perform actions
iptables -t nat -A PREROUTING -s 192.168.3.15/32 -j REDIRECT --to-port 4321
iptables -t nat -A PREROUTING -s 192.168.3.25/32 -j REDIRECT --to-port 4321
iptables -t nat -A PREROUTING -s 192.168.3.35/32 -j REDIRECT --to-port 4321

有关自定义 iptables 链的更多参考,请参阅O'Reilly 的 Linux 服务器黑客攻击

答案2

也许值得研究一下nftables。在很多情况下,它的表现都优于netfilter/ 。iptables

根据https://wiki.debian.org/nftables

相关内容