我需要一个从我家到私有 IP 10.4.100.6的 SSH 隧道,如下图所示:
+-------+ +-----------------+ +------------+ +-------------+
| | | | | | | |
| Home +----+ foo.example.com +--+ 10.4.100.5 +--+ 10.4.100.6 |
| | | | | | | |
+-------+ +-----------------+ +------------+ +-------------+
我对10.4.100.5和10.4.100.6具有 root 访问权限。我对foo.example.com的访问权限为零。当我 ssh 到foo.example.com时,我不知何故登陆了10.4.100.5,这是一个不同的主机。我们正在谈论 4 个独立的主机。我假设foo.example.com使用一对一的 NAT。
我试过了:
ssh -L 8080:10.4.100.6:80 [email protected]
没运气。有小费吗?
编辑:事实证明隧道有效,但不适用于 websockets。连接ws://localhost:8080
失败:
<snip> WebSocket connection to 'ws://localhost:8080/' failed: Error during WebSocket handshake: Unexpected response code: 200
起初我没有意识到这一点。我以为连接挂了。
编辑2:我很抱歉,但我想通了。我没有意识到该应用程序涉及 2 个服务器:端口 80 上的 nginx 和端口 8080 上的 websocket 服务器。我创建了 2 个单独的 SSH 隧道,现在一切正常。我很困惑,因为我选择的本地端口 8080 也是远程 websocket 服务器使用的端口。
总结:通过一对一的 NAT 创建 SSH 隧道没有什么特别的要求。
前提是
10.4.100.5
可以访问,10.4.100.6:80
我不明白为什么您的ssh -L 8080:10.4.100.6:80 [email protected]
行不通。你可以远程登录/卷曲
10.4.100.6:80
吗10.4.100.5
?如果不是,则可能是防火墙配置为10.4.100.6
禁止访问端口 80,方法是断开连接而不拒绝它。您可以使用 OpenSSH 中的ProxyJump功能来干净地完成此操作。
添加
-J [email protected]
告诉 ssh 通过 foo.example.com 上动态设置的端口转发连接到目标。如果您没有设置 ssh 密钥,系统将提示您输入 foo.example.com 和 10.4.100.6 的密码。如果这对您有用,您可以将其添加到本地
~/.ssh/ssh_config
以使其更容易。例如,然后,您无需
-J
在命令行上指定连接到 10.4.100.6。有没有使用sshuttle的选项?- https://github.com/sshuttle/sshuttle
它可能是一个更简单的代理选项,尤其是在无法访问远程 SSH 目标的情况下。