![SSH 防火墙穿透](https://linux22.com/image/1015664/SSH%20%E9%98%B2%E7%81%AB%E5%A2%99%E7%A9%BF%E9%80%8F.png)
下午好。我正在使用 Ubuntu 服务器开展一个项目,我设置了 3 个虚拟机。目前有防火墙、路由器和客户端 (1)。我目前能够使用 putty ssh 到防火墙,然后 ssh 到路由器,最后 ssh 到客户端并编写代码和编译。
我想知道的是,如何才能直接 ssh 到客户端,而不需要所有额外的 ssh?
谢谢你kbot
编辑:sudo iptables -t nat -v -x -n -L
防火墙上的输出:
Chain PREROUTING (policy ACCEPT 1217 packets, 108875 bytes)
pkts bytes target prot opt in out source destination
Chain INPUT (policy ACCEPT 2 packets, 136 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 11 packets, 783 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 6 packets, 406 bytes)
pkts bytes target prot opt in out source destination
35 2218 MASQUERADE all -- * eth0 0.0.0.0/0 0.0.0.0/0
答案1
首先,我建议您将防火墙和路由器服务器合并为一个服务器,因为防火墙已经实现了路由器功能。
假设您想保留通过 SSH 连接到防火墙的功能,但又想添加从外部直接通过 SSH 连接到客户端的功能。您需要为此使用不同的端口,因为这是您的 iptables 规则集确定您想要什么的唯一方法。我将使用端口 2222,但您可以使用任何您想要的空闲端口。
您将需要 nat 表中的 PREROUTING 规则:
sudo iptables -t nat -A PREROUTING -p tcp -i $EXTIF --dport 2222 -j DNAT --to $INTIP:22
其中:$EXTIF 是您的外部网络接口名称。我认为是 eth0。$INTIP 是您的内部 IP 地址。
您还需要允许流量通过您的 FORWARD 链,因为您的默认策略是 DROP,它应该是:
sudo iptables -A FORWARD -i $EXTIF -o $INTIF -p tcp --dport 2222 -d $INTIP -m state --state NEW -j LOG --log-prefix "PFNEW2222:" --log-level info
sudo iptables -A FORWARD -i $EXTIF -o $INTIF -p tcp --dport 2222 -d $INTIP -m state --state NEW -j ACCEPT
其中:$INTIF 是您的内部网络接口名称。我认为是 eth1。
请注意,还有一条日志记录规则。这只是一个建议。
你的返回路径应该没问题
其他建议:
您不需要当前的 OUTPUT 链规则,因为您的默认策略是 ACCEPT。
如果您知道外部 IP 地址(下面的 ($EXTIP)),请使用 SNAT 而不是 MASQURADE:
sudo iptables -t nat -A POSTROUTING -o $EXTIF -j SNAT --to $EXTIP
如果你不这样做,那么好吧
我假设您已经启用转发:
$ cat /proc/sys/net/ipv4/ip_forward
1