如何通过一对一 NAT 建立 ssh 隧道

如何通过一对一 NAT 建立 ssh 隧道

我需要一个从我家到私有 IP 的 SSH 隧道10.4.100.6如图所示:

+-------+    +-----------------+  +------------+  +-------------+
|       |    |                 |  |            |  |             |
| Home  +----+ foo.example.com +--+ 10.4.100.5 +--+  10.4.100.6 |
|       |    |                 |  |            |  |             |
+-------+    +-----------------+  +------------+  +-------------+

我有 root 权限10.4.100.510.4.100.6. 我完全无法访问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 隧道不需要任何特殊操作。

答案1

只要10.4.100.5可以访问,10.4.100.6:80我不明白为什么你不能工作。ssh -L 8080:10.4.100.6:80 [email protected]

10.4.100.6:80您可以从telnet/curl10.4.100.5吗?如果不行,则可能是防火墙配置为10.4.100.6禁止访问端口 80,方法是断开连接而不是拒绝连接。

答案2

您可以使用代理跳转OpenSSH 中的功能可以干净地完成此操作。

ssh -J [email protected] -L 8080:localhost:80 [email protected]

添加后,ssh 会通过在 foo.example.com 上动态设置的端口转发连接到目标。如果您没有设置 ssh 密钥,系统会提示您输入 foo.example.com 和 10.4.100.6 的密码。-J [email protected]

如果这对你有用,你可以将其添加到本地~/.ssh/ssh_config以使其更容易。例如,

Host 10.4.100.6
    ProxyJump [email protected]

这样您就不需要-J在命令行上指定连接到 10.4.100.6。

答案3

有没有选项可以使用穿梭巴士? -https://github.com/sshuttle/sshuttle

它可能是一个更简单的代理选项,特别是在缺乏对远程 SSH 目标的访问的情况下。

相关内容