我有一个盒子B
(比如说1.2.3.4
),我只能从另一个盒子 ssh 到A
。但是 上的某个开发工具192.168.0.1
只允许我指定 ssh 服务器的主机和端口,而不能指定比这更复杂的内容,所以我计划在 上设置一个端口A
来自动将 ssh 流量转发到B
。
我尝试了以下方法,但总是出现Connection timed out
。我该怎么做?
sudo iptables -t nat -A PREROUTING -p tcp --dport 2222 -j DNAT --to-destination 1.2.3.4:22
sudo iptables -t nat -A POSTROUTING -p tcp -d 1.2.3.4 --dport 22 -j SNAT --to-source 192.168.0.1
答案1
你的SNAT
规则是错误的。假设:
iptables
你在机器上运行这些命令A
,并且- 事实上,那台机器
A
并不是192.168.0.1
那么参数的值--to-source
应该是的 IP 地址A
,而不是您想要允许连接的机器的地址。
您可能还需要添加一些其他防火墙规则以允许端口 2222 流量流动;NAT 规则无法绕过过滤规则。
如果这些更改之后事情仍然没有进展,通过tcpdump
机器捕获的数据包A
可能会揭示出问题所在。
答案2
以下是我最终得到的结果:
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P FORWARD DROP
iptables -A FORWARD -i vpn0 -p tcp -s 1.2.3.4 --sport 22 -j ACCEPT
iptables -A FORWARD -i ens192 -p tcp -d 1.2.3.4 --dport 22 -j ACCEPT
iptables -t nat -I PREROUTING -p tcp -i ens192 --dport 2222 -j DNAT --to 1.2.3.4:22
iptables -t nat -A POSTROUTING -p tcp -d 1.2.3.4 --dport 22 -j MASQUERADE