【环境配置】反向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' 能
    看到以下红框的端口号,则说明测试通过。
'''

[外链图片转存失败(img-1geVStzi-1562760515809)(715FB3E711184BC9B5BE7FCBBD510187)]

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]UserExecStart 都需要进行正确配置。

# 之后执行
systemctl enable autossh
systemctl start autossh

# 使用以下指令,查看是否成功启动
systemctl status autossh

'''
    如果运行成功,当 B 执行指令 'watch -n 1 netstat -tnlp' 能
    看到以下红框的端口号,则说明测试通过。
'''

[外链图片转存失败(img-j7HtYCa2-1562760515810)(40B54C728F2540319A67D4E272AD2C32)]

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
  • 7
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值