我的网络拓扑如下所示:
互联网--------------------防火墙------------------------服务器
0.0.0.0/0-----172.8.45.140 & 192.168.1.1-----192.168.1.2
我需要使用 iptables 配置防火墙,将传入的 ssh 连接从远程客户端(在 Internet 上)转发到服务器(在 192.168.1.2 上)。本质上是在客户端上执行以远程访问 192.168.1.2 上的服务器。ssh [email protected]
防火墙有两个 NIC 进行通信:
172.8.45.140(公共)位于接口 ens33 上
192.168.1.1(专用)位于接口 ens37 上
服务器的私有 IP 为 192.168.1.2,并已配置为使用 54045 端口进行 SSH,而不是默认的 22。
防火墙上的 iptables 已配置,链 INPUT 和 FORWARD 均已更改为策略 DROP,链 OUTPUT 仍具有默认策略 ACCEPT。
Chain INPUT (policy DROP)
target prot opt source destination
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
我在网上看到了一些指南,详细介绍了如何将 Web 请求转发到防火墙后面的 Web 服务器,请参阅:
https://www.systutorials.com/port-forwarding-using-iptables/
https://wikileaks.org/ciav7p1/cms/page_16384684.html
按照这些教程,我通过 /etc/sysctl.conf 文件在防火墙上启用了端口转发,并尝试了以下规则:
第一次尝试
输入和转发策略丢弃,输出策略接受。
sudo iptables -A PREROUTING -t nat -i ens33 -p tcp --dport 22 -j DNAT --to 192.168.1.2:54045
sudo iptables -A FORWARD -p tcp -d 192.168.1.2 --dport 54045 -j ACCEPT
结果:SSH 操作超时。也累了INPUT和FORWARD策略ACCEPT仍然操作超时。
第二次尝试
输入和转发策略丢弃,输出策略接受。
sudo iptables -A FORWARD -i ens33 -o ens37 -p tcp --syn --dport 22 -m conntrack --ctstate NEW -j ACCEPT
sudo iptables -A FORWARD -i ens33 -o ens37 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A FORWARD -i ens37 -o ens33 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -t nat -A PREROUTING -i ens33 -p tcp --dport 54045 -j DNAT --to-destination 192.168.1.2
sudo iptables -t nat -A POSTROUTING -o ens37 -p tcp -d 192.168.1.2 -j SNAT --to-source 192.168.1.1
结果:SSH 操作超时。还累INPUT和FORWARD策略ACCEPT连接被拒绝。
第三次尝试
输入、转发和输出策略接受。
sudo iptables -t nat -A PREROUTING -p tcp --dport 22 -j DNAT --to-destination 192.168.1.2:54045
sudo iptables -t nat -A POSTROUTING -j MASQUERADE
结果:这确实有效,但前提是链 FORWARD 的策略为 ACCEPT。这是我唯一一次通过防火墙获得连接。当我将链 FORWARD 更改为 DROP 时,SSH 连接将再次超时。
我猜测这与它被伪装有关,或者与 FORWARD 策略 DROP 有关。
我的问题是我忽略了什么?这可能是我一直以来都怀念的东西,正盯着我。请善待并感谢您的帮助。
答案1
所有你需要的是目标 NAT。摆脱所有破坏的规则,只需使用这两个规则即可。它应该工作正常。祝你好运!
$ sudo iptables -t nat -A PREROUTING -p tcp -i ens33 --dport 22 -j DNAT --to-destination 192.168.1.2:54045
$ sudo iptables -t nat -A POSTROUTING -j MASQUERADE