我在远程服务器 ( x.x.x.x
) 上运行 StatsD 守护程序8125
。我想转发127.0.0.1:8125
到x.x.x.x:8125
。
我已经尝试在 localhost 上运行以下命令
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -p udp --dport 8125 -j DNAT --to x.x.x.x:8125
iptables -t nat -A OUTPUT -p udp --dport 8125 -j DNAT --to-destination x.x.x.x:8125
iptables -t nat -A POSTROUTING -d x.x.x.x -j MASQUERADE
但它没有正确转发。
echo "test.test.test:1|c" | nc -w 1 -u localhost 8125
失败并出现错误 nc:写入错误:连接被拒绝
echo "test.test.test:1|c" | nc -w 1 -u 127.0.0.1 8125
失败没有任何错误
echo "test.test.test:1|c" | nc -w 1 -u x.x.x.x 8125
正常工作
另外,这样的端口转发会导致任何安全问题吗?
那是不可能的。
本地进程生成的数据包不参与转发计划。
因此,您将无法使用
PREROUTING
和FORWARD
链表本地生成的数据包将通过,但只有OUTPUT
(raw/mangle/nat/filter
表中)和POSTROUTING
(mangle/nat
表中)链,而路由决策已经做出并且您无法更改它。实际上,在您当前的 iptables 设置中,考虑到您的用例,您的规则将执行以下操作:
x.x.x.x
环回接口。所以结果是:本地数据包将尝试到达
x.x.x.x:8125
您的环回接口。这个网络过滤器图可以帮助您了解本地生成的数据包在全局流中的位置。