内容由 AI 辅助完善,请注意甄别。
希冀平台的桌面系统分辨率很低,还动不动就要重新连接,便捷性上不如直接用 SSH 连接到虚拟机上进行操作。
由于希冀平台的虚拟机处于学院内网,外网无法直接访问,但虚拟机本身又可以访问公网,这种特殊的网络环境导致我们无法直接从外部通过 SSH 连接到虚拟机。
为了解决这个限制,我们利用虚拟机能够访问公网的这一特点,通过在虚拟机上搭建 SSH 服务并借助反向 SSH 隧道,将虚拟机的 SSH 端口映射到云服务器(公网服务器)上。
这样,我们就可以借助云服务器作为跳板,实现从外网安全便捷地访问处于内网的虚拟机。
这里记录了通过反向 SSH 隧道实现云服务器跳板机访问的全过程。适合无 systemd 容器或极简系统,以及需要内网穿透的场景。以下是详细的配置过程和经验分享。
0. 我的环境
阿里云服务器,系统为 Ubuntu 24.04 LTS,有弹性公网 IP。
请确保你的本机可以通过 SSH 正常连接这台跳板机,方法不在此展开。
1. 安装 SSH 服务
首先,更新软件源并安装 SSH 服务(openssh-server):
apt update
apt install openssh-server
bash注意:在某些极简容器系统中,安装过程中可能会出现一些报错,且没有 systemd 管理服务,这些错误可以暂时忽略,后续手动启动 sshd 即可。
2. 手动启动 SSH 服务
由于没有 systemd,无法通过 systemctl
启动服务,需要手动创建运行目录并启动 sshd:
mkdir -p /var/run/sshd
/usr/sbin/sshd
bash你可以用下面命令验证 SSH 服务是否已启动:
ps aux | grep sshd
bash3. 配置 SSHD 服务参数
在希冀平台上,编辑 SSH 配置文件 /etc/ssh/sshd_config
,确保内容包括:
Port 22
ListenAddress 0.0.0.0
ListenAddress ::
PermitRootLogin yes
PasswordAuthentication yes
text在跳板云服务器上,编辑 SSH 配置文件 /etc/ssh/sshd_config
,确保内容包括:
GatewayPorts yes
AllowTcpForwarding yes
text完成修改后保存文件。
4. 重启 SSH 服务
因为没有 systemd,需要手工杀死并重新启动 sshd:
pkill sshd
/usr/sbin/sshd
bash5. 设置 root 用户密码
给 root 用户设置一个密码,方便远程登录:
passwd root
bash6. 配置反向 SSH 隧道
在本机执行反向隧道命令,将远程服务器端口(例:2222)映射为容器的 SSH 端口:
ssh -N -R \*:2222:localhost:22 root@yourip
bash或者使用 autossh
,好像可以自动保持连接不断。
autossh -M 0 -N -o "ServerAliveInterval=30" -o "ServerAliveCountMax=3" -R \*:2222:localhost:22 root@yourip
bash如果服务器不支持密码登录,建议先生成 SSH 密钥对方便免密登录:
ssh-keygen -t rsa
bash一路回车使用默认配置即可。然后查看公钥内容:
cat ~/.ssh/id_rsa.pub
bash将公钥复制并粘贴到云服务器对应用户的 ~/.ssh/authorized_keys
文件中。
确认无误后,重新运行反向隧道命令:
ssh -N -R \*:2222:localhost:22 root@yourip
bash不显示错误即表示连接成功。
7. 通过跳板机访问容器 SSH
登录云服务器后,通过本地端口转发或直接 ssh 连接到已映射的端口:
ssh -p 2222 root@localhost
bash若之前修改了连接配置,避免因为 host key 变动导致连接失败,可先清理旧的
known_hosts
记录:
ssh-keygen -f ~/.ssh/known_hosts -R '[localhost]:2222'
bash这里还可能因为,对于希冀平台上的不同实验,会打开不同机器。如果重复配置,也需要清理旧的记录。
成功效果如下:
8. 本地 VS Code 使用跳板机
还可以将云服务器设置为跳板机,配置 ProxyJump。这样可以直接在本机以一行指令连接,但是区别不大。
具体方法可以询问大模型或参考网上教程。
9. 注意事项
平台貌似会定期休眠?原因不明。
如果连接断了,需要先重新启动 sshd 服务,然后重新开启反向隧道。
/usr/sbin/sshd
ssh -N -R \*:2222:localhost:22 root@yourip
autossh -M 0 -N -o "ServerAliveInterval=30" -o "ServerAliveCountMax=3" -R \*:2222:localhost:22 root@yourip
bash