我将在不久的将来部署一些机器,这些机器将位于路由器之后。在每个路由器和端口转发上设置动态 DNS 是不可行的,所以有没有办法可以配置这些机器以启动到我的计算机的 TCP 连接,然后让我的计算机通过 SSH 连接到远程计算机那个联系?
IE:
COMPUTER A OPENS TCP CONNECTION TO COMPUTER B
COMPUTER B OPENS SSH CONNECTION OVER THE EXISTING TCP CONNECTION TO COMPUTER A
COMPUTER B NOW HAS SSH CONNECTION TO COMPUTER A
Run Code Online (Sandbox Code Playgroud)
这可能吗,如果可以,我该怎么做?
Cal*_*leb 21
在/etc/ssh/sshd
对计算机B组:
AllowTcpForwarding yes
TCPKeepAlive yes
Run Code Online (Sandbox Code Playgroud)
从计算机 A:
$ ssh -R 2222:localhost:22 ip.of.computer.b
Run Code Online (Sandbox Code Playgroud)
从计算机 B:
$ ssh localhost -p 2222
Run Code Online (Sandbox Code Playgroud)
请注意,2222 是我选择的任意高端口号。然后,计算机 B 上的该端口将通过在计算机 A 上初始化的 SSH 连接隧道返回到端口 22。如果您有多台机器,则应为每台机器使用不同的端口。
对于您的用例,您可能希望从脚本运行它,以便您可以将其设为守护程序,并在链接断开时定期尝试重新连接。您可能需要一个/bin/true
在计算机 B上有一个 shell 的特殊帐户来处理传入的连接。然后,您可以为每台允许“回拨”的机器设置一个或多个键。
在计算机 A 上,您可能会发现-n
,-N
和-T
选项可用于将其与本地输入断开连接(因此它可以在后台运行),不要尝试运行任何远程命令,只需打开隧道,而不是创建 tty。
大多数生成守护进程的常规方法在设置这样的网络隧道时效果不佳。网络连接中的问题会使其试图打破围墙以通过。一个带有 sleep 等待的简单循环应该可以解决问题。十分钟是一个不错的数字,因为如果出现问题(例如计算机 B处于脱机状态),它不会使网络和日志文件泛滥,但如果连接断开,它仍然可以让您以相当快的速度恢复。
#/bin/sh
while true; do
sleep $((60*10))
ssh -nNT -R 2222:localhost:22 ip.of.computer.b
done
Run Code Online (Sandbox Code Playgroud)
这样的脚本可以在启动时运行/etc/rc.local
。计算机 A启动后大约 10 分钟,您第一次更改登录计算机将开始。