我正尝试通过互联网通过 ssh 隧道连接到正在路由器后面的远程计算机端口上监听的服务。我在本地计算机和远程计算机上拥有 root 权限,并且对路由器拥有管理员访问权限。远程计算机的防火墙拒绝除其 ssh 端口(假设为 2222)之外的所有传入连接。端口 2222 由路由器转发,本地计算机的 ssh 客户端也在使用此端口。我能够使用 通过互联网从本地计算机连接到远程计算机ssh <my_user>@<router public ip>
,从而获得一个 shell。
到目前为止一切顺利。要设置隧道,我运行
ssh -D 5555 <my_user>@<router public ip>
然后我按预期在远程计算机上获得了一个 shell。在本地计算机的输出中,sudo ss -tap | grep ssh
我可以看到 ssh 客户端正在监听本地主机端口 5555,充当 SOCKS5 服务器,并且已建立隧道连接:
LISTEN 0 0 127.0.0.1:5555 0.0.0.0:* users:(("ssh", pid=...))
ESTAB 0 0 <local machine private ip>:40632 <router public ip>:2222 users:(("ssh", pid=...))
40632 是 ssh 客户端使用的随机传出端口。我告诉我的应用程序客户端使用 localhost:5555 处的 SOCKS5 服务器,并尝试通过隧道通过其 GUI 连接到应用程序服务器。这失败了,GUI 中出现输入/输出错误,在终端中我得到
channel 3: open failed: connect failed: Connection refused
在远程机器的 auth.log 中我得到了
sshd[<pid>]: error: connect_to <router public ip> port 5555 failed
在阅读了有关此问题的大量其他来源后,我发现“通道 3”消息通常是由于远程计算机上没有服务在端口 5555 上侦听。我猜想远程计算机上的 sshd 无法传递现在未加密的数据包。在我的例子中,应用程序服务正在侦听远程端口 5555:我可以在 ss 的输出中看到这一点,并且我还能够在远程计算机上使用 nc 连接到该端口,从而在 ss 输出中生成已建立的内部连接。
我认为相关错误消息来自远程计算机的 sshd。这告诉我 sshd 正在尝试连接到路由器的公共 IP 地址端口 5555,该端口未转发,因此无法连接(我已通过允许路由器转发此端口来验证这一点,但这对我来说不是一个解决方案)。我的印象是隧道正在运行,直到远程 sshd 应将数据包传递到远程目标端口的部分。
远程计算机上的 sshd 不应该尝试连接到远程计算机的 localhost:5555 而不是使用公共 IP 地址吗?我可能在这里配置不正确吗?
通过路由器转发 5555 会破坏隧道,所以我肯定设置错了。还有一件事要提一下,当我通过 LAN 执行所有操作时,隧道可以正常工作。正如我上面所说,通过互联网进行简单的 ssh 连接也可以正常工作。我还检查了远程计算机的防火墙没有阻止任何东西,事实确实如此(ufw.log 中没有阻止)。
如果我遗漏了任何关键细节,请告诉我。任何关于这方面的想法都将不胜感激!谢谢。