目的
学校的服务器连接的是校园网,使用mtr工具可以找到下面几个地址。其中最后一个地址为成都教育网IP,教育网IP会拦截外面的访问(这部分理解不深,暂时这么认为)
一个比较方便的方法是,先找一个有公网IP的服务器,然后让学校的服务器连接该公网IP地址的服务器,建立一个SSH反向隧道,然后我的笔记本就可以在外网环境下,连接公网IP的服务器,再通过公网服务器连接学校的服务器。
过程
1.获得具有公网IP的云服务器
这里选择阿里云服务器,第一次买有优惠,不到100就可以获得1年。
2.与云服务器建立无密码ssh连接
然后让学校的服务器建立与云服务器的无密码ssh连接
ssh-keygen -t rsa
然后将生成的公钥添加到云服务器中,并进行绑定。
然后进行登录
ssh root@xxx
如果出现错误Permission denied (publickey)
需要将公钥添加到本地 ssh 环境
ssh-add ~/.ssh/rsa #添加专有密钥添加到 ssh-agent
添加过程如果报错Could not open a connection to your authentication agent
可以执行下面的方法
# linux
eval `ssh-agent`
如果windows系统下报错Error connecting to agent: No such file or directory
用命令行打开powershell
get-service ssh* #检查ssh-agent服务是否启动成功
#如果是stopped
Set-Service -Name ssh-agent -StartupType Manual
Start-Service ssh-agent
3.建立SSH反向隧道
在内网端执行下面的命令,测试 autossh + 免密登录是否成功
apt-get install autossh
autossh -M 9991 -NfR 9888:localhost:22 xxx@xxx
在云服务器端执行watch -n 1 netstat -tnlp
没问题的话可以看到一个有9888的端口
然后配置内网端开机启动反向ssh,注意修改其中的一些参数。
# 创建autossh.service
vim /lib/systemd/system/autossh.service
# 将下面的内容加进去
[Unit]
Description=Auto SSH Tunnel
After=network-online.target
[Service]
User=xxx
Type=simple
ExecStart=/usr/bin/autossh -NR 9888:localhost:22 -i /home/xxx/.ssh/id_rsa xxx@xxx -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
启动配置
systemctl enable autossh
systemctl start autossh
systemctl status autossh
4.SSH两级跳文件配置
由于阿里云服务器只能绑定一个SSH公钥,如果绑定了,就不允许其他用户从root登录
所以需要把阿里云服务器配置成通过密码登录,就可以多用户同时连接了。
用vscode远程开发通常通过配置ssh文件,用远程资源管理器来进行ssh连接。
在ssh config中编写下面的语句,意思是以cloud-server为中转,连接cloud-second。
Host cloud-server
HostName xxx
Port 22
User xxx
Host cloud-second
HostName xxxx
Port 9888
User xxx
ProxyCommand ssh -W %h:%p cloud-server
运行ssh cloud-second
即可远程控制内网设备了