我在 CentOS (7) 机器上运行了一个守护进程,它接受原始 TCP(而非 HTTP)连接,我想通过互联网从远程机器连接到该守护进程。问题是守护进程只接受来自本地主机的连接。
此外,我无法改变守护进程处理通信的方式,因此任何解决方案都必须“欺骗”它,让它认为外部连接源自本地特定端口。
我目前的想法是,我应该能够使用 iptables 代理到守护进程的外部连接,但我还没有找到完成任务的正确防火墙规则/指令组合。我也考虑过将 Nginx 添加到方程式中,但据我所知,仅使用 iptables 就足够了。
我有中级 Linux 系统管理员经验,但对 iptables 还很陌生……
所以,我的问题是:
- 设置此配置的最佳/最简单的方法是什么(是否使用 iptables)?
- 如果 iptables 是最佳方法,那么从命令行测试连接是否正常的最佳方法是什么?
谢谢!
编辑: 我认为这对任何愿意帮助我的好心人都会有帮助。我尝试了以下规则的各种排列组合,但没有成功:
先决条件
- echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
- sudo sysctl -w net.ipv4.conf.eth0.route_localnet=1
防火墙规则
# Setup basic forwarding
sudo iptables --append FORWARD -i eth0 -p tcp --dport 9876 -j ACCEPT
# Route all incoming packets at external interface (eth0) on port 9876 to localhost 9876
# -- OR --
sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 9876 -j DNAT --to-destination 127.0.0.1:9876
# -- OR --
#sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 9876 -j REDIRECT --to-port 9876
# Make sure packets leaving the external interface have the external address of that interface
#sudo iptables -A POSTROUTING -t nat -o eth0 -p tcp --dport 9876 -d 127.0.0.1 -j SNAT --to-source 127.0.0.1
# -- OR --
sudo iptables -A POSTROUTING -t nat -s 127.0.0.1 -j SNAT –to-source XX.XX.XX.XX
# -- OR --
#iptables -A POSTROUTING -t nat -p tcp -d XX.XX.XX.XX --dport 9876 -j MASQUERADE