环境配置反向SSH家中电脑连接校园内网服务器
目录
【环境配置】反向SSH——家中电脑连接校园内网服务器
1. 需求描述
1.1 具体情境
实验室有一台校园内网GPU服务器,校园内网的特点是只允许内网机器主动访问外网机器,而不允许外网机器主动访问内网机器。
现在需要使用家中的电脑(无公网IP的机器,其可能是另一个单位内网或家用路由器分配IP的机器),通过ssh控制校园内网的GPU服务器。
1.2 实现思路
假设校园内网的GPU服务器为机器A,在家中的电脑为机器C,具有公网IP的云服务器为B(公网IP的机器B需要购买阿里云或者腾讯云的服务器)。
由于机器B具有公网IP,机器C和机器A都可以通过主动连接找到机器B,所以我们可以将B作为A与B之间的桥梁。
首先使用机器 A 通过反向 ssh 连接机器 B ,然后机器 C 使用 ssh 连接 B 就可以通过该反向 ssh 对 A 进行操作了。
1.3 实现要求
- 能使用家中的电脑 C 通过 ssh 对校园内网GPU服务器 A 进行操作
- 每当GPU服务器 A 开机,就自动连接云服务器 B (前提是要确保机器A能访问外网)
2. 配置过程 (以下指令全部在机器 A 中执行)
校园内网GPU服务器(机器A):
公网IP:无
用户名:gpu401
腾讯云(机器B):
公网IP: 666.666.666.666
用户名:ubuntu
2.1 配置autossh免密登陆 (A连接B)
# 设置ssh免密码登录,使得 A 能免密码登录 B
ssh-keygen -t rsa # 一路回车,生成的id_rsa.pub文件在~/.ssh/文件夹里面。
# 将 A 中的这个key推送到vps,使用如下命令进行推送到 B
ssh-copy-id -i ~/.ssh/id_rsa.pub ubuntu@666.666.666.666 -p 22
# 安装autossh,其能确保 A-B 之间的 反向 ssh 能断线自动重连
apt-get install autossh
# 测试 autossh + 免密登录是否成功。
autossh -M 9991 -NfR 8990:localhost:22 ubuntu@666.666.666.666
'''
如果该测试指令在 A 执行后,当 B 执行指令 'watch -n 1 netstat -tnlp' 能
看到以下红框的端口号,则说明测试通过。
'''
2.2 配置 A 开机启动反向ssh
# 使用systemctl来控制服务的注册以及启动
# 创建autossh.service
vim /lib/systemd/system/autossh.service
# 将下面的内容加进去
[Unit]
Description=Auto SSH Tunnel
After=network-online.target
[Service]
User=gpu401
Type=simple
ExecStart=/usr/bin/autossh -NR 9888:localhost:22 -i /home/gpu401/.ssh/id_rsa ubuntu@666.666.666.666 -p 22 >> /dev/null 2>&1
ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/bin/kill -TERM $MAINPID
KillMode=process
Restart=no
[Install]
WantedBy=multi-user.target
WantedBy=graphical.target
注意,由于当时是使用了 机器A 中的用户 gpu401 来免密登录 机器B 的, 因此上述配置文件中
[Service]
的
User
和
ExecStart
都需要进行正确配置。
# 之后执行
systemctl enable autossh
systemctl start autossh
# 使用以下指令,查看是否成功启动
systemctl status autossh
'''
如果运行成功,当 B 执行指令 'watch -n 1 netstat -tnlp' 能
看到以下红框的端口号,则说明测试通过。
'''
3. 使用示例(以下指令全部在机器C中执行)
3.1 使用机器 C 登录 机器A
# 首先机器 C 通过 ssh 登录机器 B,然后在 shell 中输入以下指令登录机器A:
ssh -p 9888 gpu401@127.0.0.1
3.2 上\下传文件
# 从机器 A 下载整个目录到机器 B
scp -r username@servername:/var/www/remote_dir/(远程目录) /var/www/local_dir(本地目录)
# 从机器 A 上传目录到机器 B
scp -r local_dir username@servername:remote_dir
# 上传文件同理,取消参数 '-r' 即可
scp local_fileName username@servername:remote_dir