每次登陆自己的 VPS 都要使用密码去登陆,虽然密码被自己降低难度了,但是总要输入密码登陆有点繁琐,且长久看来一机一密码是比较靠谱的设置。在此基础上添加了几个常用的 SSH Trick ,比如保持 SSH 连接活性以及连接复用。

注:本文所有环境皆基于 Linux 。

0x01 Generate The Key

首先在本机上生成一对 公钥 & 密钥 ,后者必须自己保存好、不可随意分发公布,前者不仅可以用于普通的 Linux 服务器登录,还可以用于 GithubPGP 等服务。

输入以下命令,意思是生成一对 RSA 的公钥密钥,指定密钥长度为 4096 bits

1
ssh-keygen -t rsa -b 4096

在现有算力的情况下,4096bits 长度的密钥对是无法计算出来的,除非生成密钥的方式有漏洞或者后门,不然就是相对安全的。


ssh-keygen

一般情况下全按 回车 既可,让密钥放置在默认位置 /Users/[YOUR_USER_NAME]/.ssh/id_rsa 既可。

如果要求更加安全,可以在 Enter passphrase 这里设置使用密码,即每次使用这个密钥都需要输入你设置的密码。

0x02 Use The Key

生成完 Key 之后,我们需要在服务器上进行配置。配置分两步,一个是写入 authorized_keys ,另一个是开启 证书登录支持

写入 authorized_keys

本机(Local) 输入以下命令:

1
2
3
4
cat ~/.ssh/id_rsa.pub

# ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDAqYDLL6BVtluI/53lNDJSg3atQQwtON5dYX06loGoqcMhX/WlrF83xEJN2W80HWnBeL9dBJ6hELkqvCOvxe9YXRLpBWQzuiUAk7qB2OPOPEBaEaosujNZMcgls57a4KjAENCJT6bOqWBfzxUiDI+Ll7syruhw8Y5+315aakL5mt4+JRFoCNIt8CmcJGTqmGDiYOses82zylNcOXbTBrm/DIyB0x3N93MUO4ALdxfXEYETnnfwBlPjYyVJGbPeC/u/GghPTijMB16wXtDbeiA8Pk6VW8kRBdZkl5vmAzo97lWDIQvfWGf3Nh7tdplhyeSolxXYEZtWAWoI0XL4hAnnydvcVqxrIwXVktLRRcRX47y42RtfC+NpWjk/L+fG/2JFbxdD+CuBCW9k33fAn6wr30jN9eNxPtQ2yQnS0l7nN0yyO6kv1/B9Kh+bvTTpqYecTxywvStT4Muv1PSZB9yy6K/fkeEs9t2ummEnoAFy6zbMTWpfAaV/2D2xt5UiANWK0g7noB7d+ciProkqD+TVJ61Xh7AcF+PJ7kdpwK6HVRbzkR8W13aJc2MjvWwRDR77cxDTxcmlXtak1AlQegXnU9H5smL33mzI3aNRfR2sikYa0UVJyiOL6vlH9JQVb4Gueoa+UTbDvNoPNi0DQr752fITAsXJmTS5SjPYw9Iw6Q== [email protected]

然后复制上述内容(即生成的公钥),然后写入 服务器(Server)authorized_keys 文件中并设置权限控制。

1
2
3
4
5
6
7
8
cd ~
mkdir .ssh
vim .ssh/authorized_keys

// 粘贴上述复制的公钥到 authorized_keys 新的一行 或者 最后一行

chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh

开启服务器支持

使用 vim 编辑文件 /etc/ssh/sshd_config 修改一下内容,如果没有则添加即可。

1
2
3
4
5
6
7
8
9
# vim /etc/ssh/sshd_config
RSAAuthentication yes
PubkeyAuthentication yes

// 检查是否允许 root 通过 SSH 登录
PermitRootLogin yes

// 如果需要禁用密码登录,设置这一条
PasswordAuthentication no

修改完之后,再运行一条命令就大功告成了:

1
sudo service sshd restart

接下来使用 ssh 登录服务器将不再需要输入密码,直接通过公钥、私钥配对即可登录。

0x03 Keep Alive

有时候连接 SSH 经常会断开,导致工作效率低下,可以进行如下配置。

服务端 Server

1
2
3
4
5
# vim /etc/ssh/sshd_config
ClientAliveInterval 30
ClientAliveCountMax 60

sudo service ssh restart

第一行表示让 server 每隔 30 秒向 client 发送一个 keep-alive 包来保持连接;

第二行配置表示如果发送 keep-alive 包数量达到 60 次,客户端依然没有反应,则服务端 sshd 断开连接。

客户端 Client

1
2
3
# vim /etc/ssh/ssh_config
ServerAliveInterval 30
ServerAliveCountMax 60

本地 ssh 每隔 30s 向 server 端 sshd 发送 keep-alive 包,如果发送 60 次,server 无回应断开连接。

0x04 Share Connection

如果需要在多个窗口中打开同一个服务器连接,可以尝试添加 ~/.ssh/config 几行设置项:

1
2
ControlMaster auto
ControlPath ~/.ssh/conn-%r@%h:%p

配置之后,第二次 SSH 连接将会共享第一次建立的连接,从而加快速度。

添加长连接配置,每次 SSH 建立连接之后会被保持 4 个小时,退出服务器仍然可以复用。

1
ControlPersist 4h

接下来配置连接中转,效果示意如下:

1
2
# Local ---(SSH)---> Server1 ---(SSH)---> Server2
ForwardAgent yes

首先 SSH 登入进 Server1,接着在 Server1 上登入 Server2 时,就會自动使用你本地的 SSH Key。

下面是最终的配置内容,可以对照着自己已有的配置进行增删。

1
2
3
4
5
6
7
8
9
10
Host *
ForwardAgent yes
ServerAliveInterval 30
ServerAliveCountMax 60
IdentityFile ~/.ssh/id_rsa
TCPKeepAlive no
ControlMaster auto
ControlPath ~/.ssh/conn-%r@%h:%p
ControlPersist 4h
Compression yes

0x05 Reference

ssh-keygen 中文手册

Ubuntu 设置 SSH 通过密钥登录 - CSDN.Net

保持SSH连接