每次登陆自己的 VPS 都要使用密码去登陆,虽然密码被自己降低难度了,但是总要输入密码登陆有点繁琐,且长久看来一机一密码是比较靠谱的设置。在此基础上添加了几个常用的 SSH Trick ,比如保持 SSH 连接活性以及连接复用。
注:本文所有环境皆基于 Linux 。
0 x01 Generate The Key
首先在本机上生成一对 公钥 & 密钥 ,后者必须自己保存好、不可随意分发公布,前者不仅可以用于普通的 Linux 服务器登录,还可以用于 Github 和 PGP 等服务。
输入以下命令,意思是生成一对 RSA 的公钥密钥,指定密钥长度为 4096 bits 。
1
| ssh-keygen -t rsa -b 4096
|
在现有算力的情况下,4096bits 长度的密钥对是无法计算出来的,除非生成密钥的方式有漏洞或者后门,不然就是相对安全的。
一般情况下全按 回车 既可,让密钥放置在默认位置 /Users/[YOUR_USER_NAME]/.ssh/id_rsa 既可。
如果要求更加安全,可以在 Enter passphrase 这里设置使用密码,即每次使用这个密钥都需要输入你设置的密码。
0 x02 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== Dave@DaveMBP.local
|
然后复制上述内容(即生成的公钥),然后写入 服务器(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 登录服务器将不再需要输入密码,直接通过公钥、私钥配对即可登录。
0 x03 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 每隔 30 s 向 server 端 sshd 发送 keep-alive 包,如果发送 60 次,server 无回应断开连接。
0 x04 Share Connection
如果需要在多个窗口中打开同一个服务器连接,可以尝试添加 ~/.ssh/config 几行设置项:
1
2
| ControlMaster auto
ControlPath ~/.ssh/conn-%r@%h:%p
|
配置之后,第二次 SSH 连接将会共享第一次建立的连接,从而加快速度。
添加长连接配置,每次 SSH 建立连接之后会被保持 4 个小时,退出服务器仍然可以复用。
接下来配置连接中转,效果示意如下:
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
|
0 x05 Reference
ssh-keygen 中文手册
Ubuntu 设置 SSH 通过密钥登录 - CSDN.Net
保持SSH连接