解决方案 1 - 仅使用家里的 PC - 假设静态 IP:

解决方案 1 - 仅使用家里的 PC - 假设静态 IP:

我的一个 Debian Boxes 没有 GUI。如何连接它通过命令行来自外部(例如 AnyDesk、Teamviewer 等...)?

当我在办公室网络内时,我可以使用 SCP 和 SSH 访问这台机器。但我如何从家里访问?动态 DNS(DDNS 或 DynDNS)不适用于我的设置,因为网络提供商没有为路由器的 WAN 端口分配公共 IP

公网 IP 和路由器 WAN IP 不同

答案1

更新:如果每小时检查一次连接对你不起作用(因为等待一个小时重新连接的时间太长),请查看自动SSHautossh。Debian 服务器上的整个脚本将被cron@reboot或类似方式的适当命令替换。


反向 SSH 是你的好朋友。你需要一个 SSH 服务器才能工作。我将为你提供两种方法,第一种方法假设你可以从家里的机器上打开并运行 SSH 服务器。我将提供一种每小时自动尝试重新连接的方法,这样你家里的 PC 就不必一直在线。由于这有时不可能或很难,我还将添加一个更简单、更安全的解决方案,但这需要你有一个 Linux VPS。它们通常只需 2 美元/月。

解决方案 1 - 仅使用家里的 PC - 假设静态 IP:

Debian服务器上的准备:

我假设您已经cron安装并正在运行。创建一个/etc/cron.hourly包含以下内容的新文件:(不要忘记chmod +x文件!)

#!/bin/bash
cstate=$(netstat -na | grep "tcp" | grep "<IP-of-home-machine>:22" | tr -s " " | cut -d " " -f 6 | head -n 1)
cdate=$(date "+%Y-%m-%d %H:%M:%S")
if [[ $cstate == "ESTABLISHED" ]] || [[ $cstate == "TIME_WAIT" ]]
then
    echo "[$cdate] SSH connection up. ($cstate)" >> /var/log/check-ssh-relay.log
else
    echo "[$cdate] SSH connection broken. ($cstate) Reconnecting..." >> /var/log/check-ssh-relay.log
    ssh -N -f -R 12122:localhost:22 <username>@<IP-of-home-machine>
fi

这将每小时检查一次连接是否正常,如果连接不上,则尝试重新连接。当您家中的 PC 并非始终处于打开状态时,此功能非常有用。它将日志信息写入/var/log/check-ssh-relay.log。身份验证是通过 SSH 密钥完成的,因此请确保您提前正确设置了该密钥。

在家里的计算机上:

假设您已正确设置 openssh-server,那么您现在需要做的就是:

$ ssh <server-username>@localhost -p 12122

创建 SSH 连接。SCP、SFTP 等当然也可以使用。

解决方案 2 - 使用另一个 VPS 作为中继:

我个人使用这个解决方案。主要是因为我家里没有静态 IP。

Debian服务器上的准备:

与解决方案 1 完全相同,只是<IP-of-home-machine>您在这里使用的是 VPS 的 IP。

VPS 上的准备:

您需要做的就是以 root 用户身份运行以下命令:

$ ssh -g -f -N -L 0.0.0.0:13122:localhost:12122 root@localhost

-g这里允许此端口转发的全局入站连接非常重要。

在您家里的电脑上(或任何地方):

现在只需使用端口13122(如上所述)连接到您的 VPS:

$ ssh <username>@<VPS-IP> -p 13122

答案2

如果您没有 GUI,那么您所需要的只是一个远程控制台 - 这通常是通过ssh将非常好的安全性与增值服务scp(如远程文件复制)相结合来实现的。

答案3

您的问题很可能是您位于您无法控制的 NAT 后面,因此无法设置端口转发。

对此最简单的解决方案是反向隧道 - 从您想要控制的机器到您想要控制它的机器建立一个 ssh 连接(该机器需要通过 ssh 访问)

https://unix.stackexchange.com/questions/46235/how-does-reverse-ssh-tunneling-work

答案4

您可以设置一个OpenVPN服务器(假设您可以将端口从您的网络转发到公共 WAN),让您的非 GUI 框连接到它(如 Baldrickk 的回答;反向隧道),然后您的服务器应该能够通过 SSH 进入非 GUI 框,以及在该框上运行的任何其他服务。

我发现这种方法存在一些问题,其中之一就是,如果您的非 GUI 框的客户端超时,则如果不在本地(在同一网络上)通过 SSH 进入并重新启动客户端,则无法建立连接。

相关内容