如何使用iptables劫持stream量到一个端口

我有一个应用程序侦听端口2000.我想代理所有stream量到这个端口(本地发起)到不同的端口,如4000。

现在我正在做这样的事情。

iptables -t nat -A OUTPUT -p tcp --dport 2000 -d 127.0.0.1 -j DNAT --to-destination 127.0.0.1:4000 

只要在2000年没有任何东西在监听,就可以工作。如果我telnet到2000,stream量按预期路由到4000。 但是如果在2000年有某些事情正在监听,那么这个stream量就不会被劫持/代理。 有没有办法做到这一点?

它看起来像你使用的nc版本默认使用IPv6。 当您在端口2000上监听nc ,客户端连接到绕过您的仅限IPv4的DNAT规则。

当没有监听端口2000时,它仍然尝试连接到使用IPv6的端口但是失败,然后回退到IPv4,DNAT规则将把它发送到监听4000端口的实例。

目前我能想到的最好的解决scheme是简单地为IPv4和IPv6创build等价的规则:

 iptables -t nat -A OUTPUT -p tcp --dport 2000 -d 127.0.0.1 -j DNAT --to-destination 127.0.0.1:4000 ip6tables -t nat -I OUTPUT -p tcp --dport 2000 -d ::1 -j DNAT --to-destination '[::1]:4000'