我想将本地端口 2221 转发到远程机器(192.168.2.100),其中 ssh 监听端口 2222。
连接远程机器的工作原理:
ssh -p 2222 192.168.2.100
[email protected]'s password:
我的 iptables 设置非常简单,只有一条规则:
sudo iptables -t nat -A PREROUTING -p tcp --dport 2221 -j DNAT --to-destination 192.168.2.100:2222
>sudo iptables -t raw -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
>sudo iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- anywhere anywhere tcp dpt:2221 to:192.168.2.100:2222
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
>sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
当我现在尝试连接到(大概是)转发端口上的 ssh 时,失败了:
>ssh -p 2221 127.0.0.1
ssh: connect to host 127.0.0.1 port 2221: Connection refused
我可能遗漏了一些基本知识。我该如何调试它?
更新: 根据https://www.debuntu.org/how-to-redirecting-network-traffic-to-a-new-ip-using-iptables/您需要添加伪装:
sudo iptables -t nat -A POSTROUTING -j MASQUERADE
并确保端口转发已启用:
echo "1" > sudo /proc/sys/net/ipv4/ip_forward
但是,它对我来说仍然不起作用。
如果有人可以解释如何获取进一步的调试信息,那就太好了。
答案1
我在这篇文章中找到了基于socat的解决方案:
https://superuser.com/a/536295/621970
因此,这是有效的:
sudo socat TCP-LISTEN:2221,su=nobody,fork,reuseaddr TCP-CONNECT:192.168.2.100:2222
它将本地主机上的端口 2221 连接到远程计算机 192.168.2.100 上的端口 2222
sudo 需要对 nobody 进行 su。
fork 选项意味着它将重新协商传入端口,以便它不会阻塞。