![配置 iptables 以将 ssh 连接端口转发到服务器](https://linux22.com/image/1623078/%E9%85%8D%E7%BD%AE%20iptables%20%E4%BB%A5%E5%B0%86%20ssh%20%E8%BF%9E%E6%8E%A5%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E5%88%B0%E6%9C%8D%E5%8A%A1%E5%99%A8.png)
我有一个如下所示的网络拓扑:
互联网--------------------防火墙-------------------------服务器
0.0.0.0/0-----172.8.45.140 和 192.168.1.1-----192.168.1.2
我需要使用 iptables 配置防火墙,以便将来自远程客户端(在 Internet 上)的传入 ssh 连接端口转发到服务器(在 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,并且已配置为使用 SSH 端口 54045,而不是默认的 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 文件在防火墙上启用了端口转发,并尝试了以下规则:
第一次尝试
INPUT 和 FORWARD 策略为 DROP,OUTPUT 策略为 ACCEPT。
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 仍会导致操作超时。
第二次尝试
INPUT 和 FORWARD 策略为 DROP,OUTPUT 策略为 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
假设您依赖第二次尝试中的规则,--dport 22
这是错误的。在 DNAT / 离开 PREROUTING 链之后,您需要改为允许流量到达实际/新的目标端口,即54045
在 FORWARD 链中。
PS 和 都-j MASQUERADE
可以-o ens37 -j SNAT --to-source 192.168.1.1
正常工作,如果防火墙有静态 IP,则后者是首选。此外,如果192.168.1.1
是 的默认网关192.168.1.2
,则您甚至不需要使用它们中的任何一个。