我使用以下命令在 Linux 笔记本电脑和远程服务器之间建立了反向 ssh 隧道:
ssh -4nNT -R 2222:localhost:22 somehost.com
也就是说,可以使用以下命令通过 ssh 访问防火墙后面的笔记本电脑:
ssh -p 2222 -l joe somehost.com
在 somehost.com 的 sshd_config 上,我已启用 Gatewayports=yes。
我很高兴地说所有这些都运行良好。然而,有一件事让我困惑:iptables
somehost.com 上运行着一个没有打开端口 2222 的程序。尽管这个隧道可以工作,但这怎么可能呢?远程 ssh 隧道在幕后是如何工作的?有人能解释一下吗?
以下是 iptables -L 的输出:
target prot opt source destination
ACCEPT icmp -- anywhere anywhere icmp destination-unreachable
ACCEPT icmp -- anywhere anywhere icmp time-exceeded
ACCEPT icmp -- anywhere anywhere icmp echo-request
ACCEPT icmp -- anywhere anywhere icmp echo-reply
DROP tcp -f anywhere anywhere
DROP tcp -- anywhere anywhere tcp flags:FIN,SYN,RST,PSH,ACK,URG/FIN,SYN,RST,PSH,ACK,URG
DROP tcp -- anywhere anywhere tcp flags:FIN,SYN,RST,PSH,ACK,URG/NONE
DROP tcp -- anywhere anywhere tcp flags:FIN,SYN/FIN,SYN
DROP tcp -- anywhere anywhere tcp flags:FIN,ACK/FIN
DROP tcp -- anywhere anywhere tcp flags:SYN,RST/SYN,RST
DROP tcp -- anywhere anywhere tcp flags:FIN,SYN,RST,PSH,ACK,URG/FIN,SYN,RST,ACK,URG
DROP udp -- anywhere anywhere udp spt:bootps dpt:bootpc
DROP tcp -- anywhere anywhere tcp dpt:kazaa
DROP udp -- anywhere anywhere udp dpt:kazaa
LOG tcp -- anywhere somehost.com tcp dpt:ssh state NEW LOG level warning tcp-options ip-options prefix "firewall-> ssh1: "
ACCEPT tcp -- anywhere somehost.com tcp dpt:ssh
LOG tcp -- anywhere somehost.com tcp dpt:2023 state NEW LOG level warning tcp-options ip-options prefix "firewall-> Check: "
ACCEPT tcp -- anywhere somehost.com tcp dpt:2023
LOG tcp -- anywhere somehost.com tcp dpt:http state NEW LOG level warning tcp-options ip-options prefix "firewall-> HTTP: "
ACCEPT tcp -- anywhere somehost.com tcp dpt:http
LOG tcp -- anywhere somehost.com tcp dpt:https state NEW LOG level warning tcp-options ip-options prefix "firewall-> HTTPS: "
ACCEPT tcp -- anywhere somehost.com tcp dpt:https
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp spt:http
答案1
somehost.com 上运行着一个名为 sshd 的 ssh 守护进程。您使用 -R 2222:localhost:22 调用 ssh 会告诉 somehost.com 上的 sshd,它应该通过端口 22 将发送到端口 2222 的流量通过隧道发送到防火墙后面的笔记本电脑。由于您设置了 Gatewayports=yes,sshd 会通过端口 22 上的隧道将发送到端口 2222 的其他主机的所有流量发送到您的笔记本电脑。
欲了解更多信息,请参阅https://unix.stackexchange.com/questions/46235/how-does-reverse-ssh-tunneling-work。