Featured image of post SSH

SSH

SSH config and AutoSSH setting

SSH 的一些配置,方便远程连接,以及设置多设备跳转连接,完善VSCode远程连接服务器,以及基于 AutoSSH 和 VPS 实现内网穿透


SSH 免密登录

1. 客户端生成公私钥

本地客户端生成公私钥:(一路回车默认即可)

1
ssh-keygen

上面这个命令会在用户目录.ssh文件夹下创建公私钥

1
2
cd ~/.ssh
ls

会看到两个文件

1
2
id_rsa #私钥
id_rsa.pub #公钥

2. 上传公钥到服务器

这里测试用的服务器地址为:192.168.50.1 用户为:root

1
ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]

上面这条命令是写到服务器上的ssh目录下去了

1
2
cd ~/.ssh
vim authorized_keys

可以看到客户端写入到服务器的 id_rsa.pub (公钥)内容。

3. 测试免密登录

客户端通过ssh连接远程服务器,就可以免密登录了。

ssh [email protected]

SSH 多次跳转连接

1. 前言

中心这边的VPN只能连新川办公室内网,虽然可以访问AiStation,但是没法访问本地的两台服务器,测试发现这边服务器地址为10.91.**.**,内网ip是10.92.**.**,VPN连接内网分配地址是92的,无法访问本地服务器,但是中心这边的机器虽然连的是92,却可以访问91的服务器,突发奇想做两次跳转连接,就可以访问服务器了,测试发现确实可行。具体连接示意图如下图所示:

两次SSH连接示意图

2. 实现

图示已经展示了整个实现的步骤:

  1. 连接VPN接入内网
  2. 第一次SSH,登录办公室机器
  3. 第二次SSH,从办公室机器登录服务器

3. SSH config

两次登录还是有点麻烦,而且只能终端操作了,如果使用VSCode的SSH Remote来远程还是不方便,其实VS Code也可以两次SSH直连服务器,只需要改一下ssh的config文件就好,如下示例

1
2
3
4
5
6
7
8
Host M2
  HostName **.**.**.** # M2的ip
  User m2_user # M2用户名
  
Host M3
  Hostname **.**.**.** # M3的ip
  ProxyJump M2 # 关键 实现跳转
  User m3_user # M3用户名

AutoSSH

示意图

由于新川实验室的VPN连接很不稳定,经常断线,索性买了VPS来中转连接,通过AutoSSH实现内网穿透

1. VPS 选择

首选当然是白嫖(狗头)

  • 国内免费:

    • 阿里 free.aliyun.com
    • 腾讯 cloud.tencent.com/act/free
    • Az国内 azure.cn/zh-cn/pricing/1rmb-trial
  • 亚太地区:

    • Az30天 azure.microsoft.com/zh-cn/free/
    • GCP 365天 cloud.google.com
    • AWS 365天 aws.amazon.com

免费试用加学生优惠才是最合适的,一般能做到一年不到一百,跳板机最好选国内的服务器,延迟低,国外服务器可以做其他的用途(再次狗头)

2. 服务器配置

我们共有三台设备,处于内网的计算服务器A,VPS服务器B,和处于外网用来连接内网的设备C。A和B可以联通,B和C联通,便可以实现C与A的联通,实现内网穿透。

VPS服务器设置

登录VPS服务器,开启VPS的ssh服务,记录VPS的公网ip,并开启一个不被其他服务占用的端口,一般随便选就好,此处服务器地址以22.22.22.22为例,端口为1024

配置A服务器的ssh参数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
vim /etc/ssh/sshd_config

# 修改相关配置信息
# 连接超时及转发相关:
GatewayPorts yes
TCPKeepAlive yes
ClientAliveInterval 60  
ClientAliveCountMax 3

# 证书相关:
PubkeyAuthentication yes
AuthorizedKeysFile  .ssh/authorized_keys

完成参数修改后重启ssh服务systemctl restart sshd

内网服务器配置

配置免密登录,首先是生成ssh公私钥,一路回车默认即可:

1
ssh-keygen

上面这个命令会在用户目录.ssh文件夹下创建公私钥

1
2
cd ~/.ssh
ls

会看到两个文件

1
2
id_rsa #私钥
id_rsa.pub #公钥

上传公钥到VPS服务器 用户为:root

1
ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]

上面这条命令是写到VPS服务器上的ssh目录下去了,以后通过ssh连接远程服务器,就可以免密登录了。

3. Autossh 配置

安装auotssh sudo apt-get install autossh auotssh反向代理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
autossh -p 22 -M 1023 -fNR 1024:localhost:22 [email protected]
or 
autossh -p 22 -M 1023 -NR 1024:localhost:22 [email protected]

# -p  指定外网服务器的ssh端口(默认22)
# -M  在外网服务器中指定一个端口,监听连接的状态,使断开后进行重连 
# -f  隧道建立成功后在后台运行
# -N  不执行远程指令
# -L  建立本地SSH隧道,指定本地的某端口转发到远程主机的某端口
# -R  建立远程SSH隧道,指定远程主机上的某端口转发到本地的某端口

完成后便完成A与C之间的连接,这时候C便可通过B跳转登录到A服务器

4. 外网连接

完成内网服务器A的autossh配置后,位于外网的服务器C便可通过B跳转连接A了

1
ssh -p 1024 [email protected]

此处连接有两点需要注意:

  • 首先是-p指定端口,也就是B服务器开启的端口,用于监听A服务器的ssh连接
  • 其次是ssh登录的用户为A服务器的用户,虽然登录地址是还是B服务器,当其实是会跳转到A服务器,所以要用A的账号来登录。 `

5. Autossh 自启动

具体参考Autossh reverse tunnel

配置autossh.service

sudo vim /etc/systemd/system/autossh.service

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[Unit]
Description=AutoSSH tunnel service
After=network.target

[Service]
# local username that will be used to execute autossh
User=v
# not sure what this does
Environment="AUTOSSH_GATETIME=0"

# ssh options
# remote ssh port
# -p [PORT]
# -M 0 --> no monitoring
# -N Just open the connection and do nothing (not interactive)
#
# port 1024 on SERVER will be forwarded to ssh port on this computer

ExecStart=/usr/bin/autossh -M 1023 -o ServerAliveInterval=60 -o ServerAliveCountMax=3 -o "ExitOnForwardFailure=yes" -o StrictHostKeyChecking=false -p 22 -NR '*:1024:localhost:22' [email protected]

# kill process
ExecStop=killall -s KILL autossh

[Install]
WantedBy=multi-user.target

完成后,通过以下命令启停和查看autossh服务进程

1
2
3
4
sudo systemctl daemon-reload
sudo systemctl start autossh.service
sudo systemctl enable autossh.service
sudo systemctl status autossh.service