我需要在我的 Linux ( Debian 8
) 上进行端口转发来拦截通过机器的数据包。
它需要基于源IP,因此不同的IP需要不同的端口。
我曾考虑过使用iptables
ex。
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