如何访问位于 NAT 后面的 Linux 机器,没有 GUI?

Aru*_*run 2 linux remote nat remote-access

我的一个 Debian 盒子没有 GUI。如何从外部通过命令行连接到它(如 AnyDesk、Teamviewer 等...)?

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

公网IP和路由器广域网IP不同

con*_*tti 6

更新:如果每小时连接检查对您不起作用(因为一个小时太长而无法等待它重新连接),请查看autossh。debian 服务器上的整个脚本将以autosshcron@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
Run Code Online (Sandbox Code Playgroud)

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

在家里的电脑上:

假设你已经正确设置了 openssh-server,你现在需要做的就是:

$ ssh <server-username>@localhost -p 12122
Run Code Online (Sandbox Code Playgroud)

创建 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
Run Code Online (Sandbox Code Playgroud)

-g对于允许此端口转发的全局入站连接很重要。

在您家中(或几乎任何地方)的 PC 上:

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

$ ssh <username>@<VPS-IP> -p 13122
Run Code Online (Sandbox Code Playgroud)