我有一个在端口 2000 上监听的应用程序。我想将所有到此端口的流量(源自本地)代理到另一个端口,比如 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 上没有任何监听,此方法就有效。如果我远程登录到 2000,流量将按预期路由到 4000。但如果 2000 上有监听,流量就不会被劫持/代理。有办法实现这一点吗?
答案1
看起来nc
您使用的版本默认使用 IPv6。当您nc
监听端口 2000 时,客户端会绕过仅 IPv4 的 DNAT 规则连接到该端口。
当没有任何内容监听端口 2000 时,它仍会尝试使用 IPv6 连接到该端口但会失败,然后回退到 IPv4,DNAT 规则会将其发送到监听端口 4000 的实例。
目前我能想到的最佳解决方案就是为 IPv4 和 IPv6 创建等效规则:
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'