详解SSH免密登录云服务器步骤与报错指南
在官网购买Linux云服务器后,首先通过以下流程先实现ssh外部登录
- 绑定eip
- 配置安全组
- 放行ssh端口
最后通过文中步骤再实现云服务器ssh免密登录。
一、云服务器背景
主机名 | 内网ip | 外网ip |
ECMhost1 | 192.168.30.55 | 61.171.xxx.xxx |
ECMhost2 | 192.168.30.51 | 无 |
ECMhost3 | 192.168.30.172 | 无 |
如表格中所示,ECM云服务器中只有ECMhost1绑定了外网eip,其余云服务器并未购买eip,只能通过内网进行连通。
#修改主机名
ECMhost1:
hostnamectl set-hostname ECMhost1
ECMhost2:
hostnamectl set-hostname ECMhost2
ECMhost3:
hostnamectl set-hostname ECMhost3
#添加hosts内网绑定主机名与ip地址
echo "
> 192.168.30.66 ecmhost1
> 192.168.30.67 ecmhost2
> 192.168.30.68 ecmhost3
> " >> /etc/hosts
分别在三台云服务器的hosts中写入hostname与其对应的内网段的ip地址
二、生成ssh公钥和私钥密钥对
1)检查阶段
ls -al ~/.ssh/
或
ls -al /root/.ssh/
#分别检查用户目录和root目录下是否已经存在id_rsa、id_rsa.pub密钥对,如果有请核实进行备份后,将其删除
#若报错显示 无.ssh目录,则手动创建
mkdir ~/.ssh/
或
mkdir /root/.ssh
2)生成密钥对
*ssh-keygen --help
usage: ssh-keygen [-q] [-a rounds] [-b bits] [-C comment] [-f output_keyfile]
[-m format] [-N new_passphrase] [-O option]
[-t dsa | ecdsa | ecdsa-sk | ed25519 | ed25519-sk | rsa]
[-w provider] [-Z cipher]
ssh-keygen -p [-a rounds] [-f keyfile] [-m format] [-N new_passphrase]
[-P old_passphrase] [-Z cipher]
ssh-keygen -i [-f input_keyfile] [-m key_format]
ssh-keygen -e [-f input_keyfile] [-m key_format]
ssh-keygen -y [-f input_keyfile]
ssh-keygen -c [-a rounds] [-C comment] [-f keyfile] [-P passphrase]
ssh-keygen -l [-v] [-E fingerprint_hash] [-f input_keyfile]
ssh-keygen -B [-f input_keyfile]
ssh-keygen -D pkcs11
ssh-keygen -F hostname [-lv] [-f known_hosts_file]
ssh-keygen -H [-f known_hosts_file]
ssh-keygen -K [-a rounds] [-w provider]
ssh-keygen -R hostname [-f known_hosts_file]
ssh-keygen -r hostname [-g] [-f input_keyfile]
ssh-keygen -M generate [-O option] output_file
ssh-keygen -M screen [-f input_file] [-O option] output_file
ssh-keygen -I certificate_identity -s ca_key [-hU] [-D pkcs11_provider]
[-n principals] [-O option] [-V validity_interval]
[-z serial_number] file ...
ssh-keygen -L [-f input_keyfile]
ssh-keygen -A [-a rounds] [-f prefix_path]
ssh-keygen -k -f krl_file [-u] [-s ca_public] [-z version_number]
file ...
ssh-keygen -Q [-l] -f krl_file [file ...]
ssh-keygen -Y find-principals -s signature_file -f allowed_signers_file
ssh-keygen -Y match-principals -I signer_identity -f allowed_signers_file
ssh-keygen -Y check-novalidate -n namespace -s signature_file
ssh-keygen -Y sign -f key_file -n namespace file [-O option] ...
ssh-keygen -Y verify -f allowed_signers_file -I signer_identity
-n namespace -s signature_file [-r krl_file] [-O option]
- ssh-keygen -t参数是type的缩写,意为指定密钥加密的类型,可选有-t rsa和-t dsa #ssh-keygen默认加密类型为rsa,即默认命令为ssh-keygen -t rsa可无需再指定加密参数
- ssh-keygen -f参数是生成密钥的保存路径,即指定密钥存放地址 #默认地址即可
- ssh-keygen -C参数是生成密钥的注释,可作为多密钥系统中识别与保存的注释
ssh-keygen -t rsa -f /root/.ssh/gitlab-server-192.168.11.100 -C "Gitlab-admin@mycompony.com"
本文中所展示 ssh-keygen 无需添加参数,直接执行生成密钥即可
3)密钥生成过程
图所示有三个输入栏分别会要求输入:
1.Enter file in which to save the key保存密钥的文件(无输入则使用默认地址)
2.Enter passphrase输入保管密钥的短语(无输入则留空,有输入则每次使用密钥前均需要验证该值)
3.Enter same passphrase again:重复输入一次保管密钥的短语(再次验证)
本文中所展示ssh-keygen可直接三次回车使用默认值即可
4)生成结束阶段会在root或用户的/.ssh目录下生成一对公钥和密钥。
图示文件则为再ECMhost1刚刚创建的密钥对文件,同理需要再另外两台主机中进行相同的命令行配置,得到三台ssh公私玥环境准备齐全的云服务器主机
部分云服务器文件可能与图示不同,以下为.ssh目录下文件的详解
known_hosts 记录ssh服务访问过的计算机的公钥,即为本机访问其余主机的ssh记录
id_rsa ssh-keygen生成的私钥
id_rsa.pub ssh-keygen生成的公钥
authorized_keys 用于存放授权免密登录主机的公钥(第三部分中需要用到)
三、云服务器之间ssh免密互联
#通过第二部分已经得到了三台具有ssh公私玥的云环境,之后需要将ssh公钥文件进行拷贝传输写入至需要免密登陆的主机authorized_keys中,有两种方法,分别介绍
方法1:读取ECMhost1主机中的/root/.ssh/id_rsa.pub文件内容,手动写入目标服务器ECMhost2、ECMhost3的/root/.ssh/authorized_keys文件中
#步骤
1.1 cat 读取ECMhost1的 id_rsa.pub公钥文件
公钥文件的格式标注了所属用户root和主机ECMhost1
1.2 手动追加写入
#登录ECMhost2主机,手动执行命令
echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDiLmaCa0dNB5Bmpj1JxhYW1ZHQ7rL7rGZlZbyygMJZfbFNWUtMpLRIA3oWp7Rp0dx9b3IQEAACX2x0J7D1F1kgunFbid9hZA//9MOnYyWDNVBoNzWKPjCQRxNgWh2gDfHCL9HUk+6r6bJ7j0IAPyL7/SpZcvVkTk8GD4hW/R6Xr2ku/zAUsOw6jrsNdnVmNKaLtvH3qyWl3eV+t6HdM3veA6fRuM+dhaf6tfsZzMOHrx5OGoOi5ssu0BEBgQTNZZUbIlYb0wiRzmb7uRcKyEPrWYqGtZtAzNHH7/f+Pcdm2FtbOcIbcHCgTSFSEKE5hsKD4sG+HZ3VQJp9WjhKtqDuPHUzfZtIfxo0y90dL4tGwBIJqKTxF1/S8zRw2rlHziB2FMgsTv5VagtquliopD38sQTsFSL+QONUyCQKrJ1LUkTnfdyfNhEyj1jUqHWuAwerlRznK2ThuAcHYlHSfDUqeS0+S/yUxJlTrUkp5W7enDVH7TFNWNFHY701sWXUrM0= root@ECMhost1" >> /root/.ssh/authorized_keys
#登录ECMhost3主机,手动执行命令
echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDiLmaCa0dNB5Bmpj1JxhYW1ZHQ7rL7rGZlZbyygMJZfbFNWUtMpLRIA3oWp7Rp0dx9b3IQEAACX2x0J7D1F1kgunFbid9hZA//9MOnYyWDNVBoNzWKPjCQRxNgWh2gDfHCL9HUk+6r6bJ7j0IAPyL7/SpZcvVkTk8GD4hW/R6Xr2ku/zAUsOw6jrsNdnVmNKaLtvH3qyWl3eV+t6HdM3veA6fRuM+dhaf6tfsZzMOHrx5OGoOi5ssu0BEBgQTNZZUbIlYb0wiRzmb7uRcKyEPrWYqGtZtAzNHH7/f+Pcdm2FtbOcIbcHCgTSFSEKE5hsKD4sG+HZ3VQJp9WjhKtqDuPHUzfZtIfxo0y90dL4tGwBIJqKTxF1/S8zRw2rlHziB2FMgsTv5VagtquliopD38sQTsFSL+QONUyCQKrJ1LUkTnfdyfNhEyj1jUqHWuAwerlRznK2ThuAcHYlHSfDUqeS0+S/yUxJlTrUkp5W7enDVH7TFNWNFHY701sWXUrM0= root@ECMhost1" >> /root/.ssh/authorized_keys
1.3 验证ssh登录
ssh root@ECMhost2 -p 22
ssh root@ECMhost3 -p 22
1.4 报错解疑
#被远端关闭连接
ssh ssh_exchange_identification: read: Connection reset by peer
解决方案:在目标服务器的/etc/hosts.allow文件中追加ECMhost1的ip地址
echo "sshd: 192.168.30.55" >> /etc/hosts.allow
#权限拒绝
ssh : Permission denied (publickey,gssapi-with-mic)
解决方案:编辑/etc/ssh/sshd_config文件
sed -i 's/#PubkeyAuthentication yes/PubkeyAuthentication yes/' /etc/ssh/sshd_config
systemctl restart sshd
方法2:利用原生ssh-copy-id命令拷贝至指定云服务器中
2.1 分别将ECMhost1主机的公钥拷贝至另外两台主机
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.30.51
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.30.172
2.2 验证登录
ssh -p 22 root@192.168.30.51
ssh -p 22 root@192.168.30.172
3. 以上步骤已经成功将ECMhost1实现免密ssh登录ECMhost2、ECMhost3云服务器,ECMhost2与ECMhost3之间的互相连通同样可以参考以上步骤