通过 ssh 隧道连接位于 NAT 后面的机器

通过 ssh 隧道连接位于 NAT 后面的机器

我有两台机器,都位于 NAT 后面。而且我可以从每台机器访问服务器。有没有办法通过服务器从机器 1 到机器 2 建立 ssh 隧道?

客户端机器是 Linux Mint。服务器是 Debian。我在所有机器上只有用户访问权限

答案1

我知道这是怎么做的。

所以你有 3 台电脑。A、B、C

A、B 位于 NAT 后面。假设 B 是中间方

方法 1

2条隧道

因此,您可以建立从 A 到 B(隧道 1)的 SSH 连接。然后从 C 到 B(隧道 2)。并将隧道 1 转发到隧道 2。

计算机A使用SSH -L连接

计算机C使用SSH -R连接

-L 或 -R 决定隧道的哪一侧监听以及哪一侧转发。

因此,除非我犯了错误,否则你可以这样做-

A$ ssh -L 1234:127.0.0.1:2345 user@compB
C$ ssh -R 2345:127.0.0.1:3456 user@compB

但我不确定您是否可以与同一个 SSH 服务器建立两个连接,因此请尝试这个..建立两个不同的 sshd 服务器..

在 CompB 上编辑 sshd_config 你会看到它显示端口 22,在其下方添加一行显示端口 222,然后 CompB 将在两个端口上运行 ssh 服务器。

然后你可以通过两个不同的端口 22 和 222 连接到 ssh 服务器

A$ ssh -L 1234:127.0.0.1:2345 user@compB -p22
C$ ssh -R 2345:127.0.0.1:3456 user@compB -p222

端口 1234 是计算机 A 上连接客户端程序的端口,它是隧道 1 的入口

端口 2345 是计算机 B 上的端口,也是隧道 2 的入口

端口 3456 是您在 CompC 上运行服务器程序的端口

因此,通过这种方式,CompA 可以通过 CompB 连接到 CompC 上的服务器

方法 2

一条隧道

一种选择是只使用一个隧道,但这样你只能在半条路线上获得加密。5.6.7.8 是 CompC 的 IP,端口 3456 是 CompC 上的服务器,端口 1234 是隧道的监听端口。

A$ ssh -L 1234:5.6.7.8:3456 user@compB

然后在 CompA 上将客户端程序连接到 CompA 上的端口 1234,然后所有内容都会转到 CompC。

答案2

根据答复巴洛普

我有 A 和 B,它们位于 NAT 后面。还有 C,它们可以从 A 和 B 访问

在 CI 上,仅需具有 ssh 访问权限。无需其他任何操作。

在机器 A 上添加任务到 crontab

$crontab -e

TUNCMDR='ssh -f -N -R 1144:localhost:22 Cuser@hostC'
* * * * * pgrep -f "$TUNCMDR" || ($TUNCMDR  &&  echo "`date`: Land remote port to localhost:22" >> ~/ssh-world.log)  &>/dev/null
TUNCMDL='ssh -f -N -L 1234:localhost:1143 Cuser@hostC'
* * * * * pgrep -f "$TUNCMDL" || ($TUNCMDL  &&  echo "`date`: Forward local 1234 port to remote" >> ~/ssh-world.log)  &>/dev/null

在机器 B 上将任务添加到 crontab

$crontab -e

TUNCMDR='ssh -f -N -R 1143:localhost:22 Cuser@hostC'
* * * * * pgrep -f "$TUNCMDR" || ($TUNCMDR  &&  echo "`date`: Land remote port to localhost:22" >> ~/ssh-world.log)  &>/dev/null
TUNCMDL='ssh -f -N -L 1234:localhost:1144 Cuser@hostC'
* * * * * pgrep -f "$TUNCMDL" || ($TUNCMDL  &&  echo "`date`: Forward local 1234 port to remote" >> ~/ssh-world.log)  &>/dev/null

注意:与主机 A 相比,主机 B 上的 1143 和 1144 端口已更改

在主机上A连接到B您运行ssh -p 1234 Buser@localhost
在主机上B连接到A您运行ssh -p 1234 Auser@localhost
在主机上C连接到A您运行ssh -p 1144 Auser@localhost
在主机上C连接到B您运行ssh -p 1143 Buser@localhost

您可以看到正在运行的重新连接信息cat ~/ssh-world.log

更新型多巴胺

通过添加到 ~/.ssh/config 来停止会话断开/挂断

Host *
    ServerAliveInterval 15

相关内容