透明地将本地端口转发到远程服务器

StatsD守护进程在8125上运行在远程服务器( xxxx )上。 我想转发127.0.0.1:8125xxxx:8125

我已经尝试在本地主机上运行以下内容

 echo 1 > /proc/sys/net/ipv4/ip_forward iptables -t nat -A PREROUTING -p udp --dport 8125 -j DNAT --to xxxx:8125 iptables -t nat -A OUTPUT -p udp --dport 8125 -j DNAT --to-destination xxxx:8125 iptables -t nat -A POSTROUTING -d xxxx -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 xxxx 8125 

正常工作

另外,这样的端口转发是否会导致任何安全问题?

这是不可能的。

本地进程生成的数据包不包含在转发计划中。

因此,你将无法在表中使用PREROUTINGFORWARD链,本地生成的数据包将通过,但只有OUTPUT (在raw/mangle/nat/filter表中)和POSTROUTING (在mangle/nat表中) 路由决策已经完成,你不能改变它

实际上,对于你当前的iptables设置,你的规则将考虑你的用例来做以下事情:

  • 第一条规则:未达标
  • 第二条规则:DNAT在回送接口上将数据包本地生成为xxxx
  • 第三条规则:伪装数据包通过你的环回接口和你的环回接口的IP地址。

所以结果是:本地数据包将尝试达到您的回环接口上的xxxx:8125

这个netfilter图可以帮助您了解本地生成的数据包在全局stream中的位置。