配置 SSH 免密登录

78 阅读5分钟

背景

因为想要进行多机训练,所以研究了下如何在物理机之间,以及容器之间进行免密登录的配置


前提条件

现在有 A,B 两个物理机,相互之间可以 ping 通,目标是让 A 物理机和 B 物理机之间可以免密登陆,以及 A 物理机上的容器 container_a 和 B 物理机上的容器 container_b 之间可以免密登陆

A 物理机的 IP 为 192.168.0.1
B 物理机的 IP 为 192.168.0.2

已安装 OpenSSH 客户端和服务端,如果没有安装可以参考下面的内容


安装 OpenSSH

针对 CentOS/RHEL 环境

sudo yum update -y  
sudo yum install -y openssh-clients openssh-server ssh-copy-id  

针对 Ubuntu/Debian 环境

sudo apt update  
sudo apt install -y openssh-client openssh-server ssh-copy-id  

物理机间配置免密登陆

相对于不同机器上的容器相互配置免密,感觉这个 easy 很多,一次就尝试成功了,容器之间配置免密我搜了好久,尝试了好多方法才成功

确保每台机器上的 SSH 服务正常运行

# CentOS  
sudo systemctl start sshd  
sudo systemctl enable sshd  
  
# Ubuntu  
sudo systemctl start ssh  
sudo systemctl enable ssh  

生成 SSH 密钥对

分别在物理机 A 和 物理机 B 上执行以下命令去生成 SSH 密钥对:

cd ~  
ssh-keygen -t rsa -b 2048 -f ~/.ssh/id_rsa -N ""  

生成后的公钥路径为:~/.ssh/id_rsa.pub

复制公钥到目标路径

复制的方式有两种,一种是执行 ssh-copy-id 命令,一种是手动复制

注意:若出现 yes/no 提示,输入 yes 就好了;密码则输入用户名对应的密码就好了

复制公钥到目标路径

方式一:执行 ssh-copy-id 命令

分别在物理机 A 和 物理机 B 上执行以下命令

# tinero 为用户名(这个用户名可以登陆物理机 A 和 B)  
  
# A 机器上执行:  
ssh-copy-id tinero@192.168.0.2  
# B 机器上执行:  
ssh-copy-id tinero@192.168.0.1  
方式二:使用追加方式

分别在物理机 A 和 物理机 B 上执行以下命令

# tinero 为用户名(这个用户名可以登陆物理机 A 和 B)  
# A 机器上执行:  
cat ~/.ssh/id_rsa.pub | ssh tinero@192.168.0.2 "cat >> ~/.ssh/authorized_keys"  
# B 机器上执行:  
cat ~/.ssh/id_rsa.pub | ssh tinero@192.168.0.1 "cat >> ~/.ssh/authorized_keys" 
方式三:手动复制

这个方式更直接暴力,在物理机 A 和 B 上分别执行 cat ~/.ssh/id_rsa.pub 命令去获得生成的公钥,然后 Ctrl C 这两个输出内容,通过 vim ~/.ssh/authorized_keys 的方式,将复制的内容全部 Ctrl V 到里面,物理机 A 和 B 上都要执行

设置权限

在物理机 A 和 物理机 B 上执行以下命令

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

验证是否配置成功

执行以下命令后,如果无需输入密码即可登陆,则说明配置成功

# A 机器上执行:  
ssh tinero@192.168.0.2  
# B 机器上执行:  
ssh tinero@192.168.0.1  

容器间配置免密登陆

我之前以为要配置容器间的免密登陆,在启动容器时,得需要将物理机上的用户挂载进去,或者其他操作,但是等最后配置好了,其实发现,不用这么复杂

配置环境

执行以下命令去配置环境,确保 ssh 服务正常运行

# CentOS  
yum update -y && yum install -y openssh-server  
service ssh start  
  
# Ubuntu  
apt update -y && apt install -y openssh-server  
service ssh start  

修改配置文件

我是使用的 host 网络,去启动的 docker 容器,SSH 默认的 22 端口已经被物理机占用了,所以我需要修改一下配置文件,将 SSH 端口修改为 2222

# 编辑配置文件  
vim /etc/ssh/sshd_config  
# 将文件中的 #Port 22 改为 Port 2222,然后保存退出  
# 2222 代表 SSH 端口,把 ‘#’ 删掉则表示使用 2222 端口,如果不删掉的话,没啥用,改了和没改一样 
# 重启 ssh 服务  
service ssh restart  

有一点需要注意下,就是当你第一次使用 service ssh start 命令启动服务后,后面如果修改了 /etc/ssh/sshd_config 文件,必须使用 service ssh restart 命令重启服务才行,执行 service ssh start 命令是不会生效的(当时试了几次才发现)

生成 SSH 密钥对

# 分别在容器 container_a 和 container_b 上执行以下命令去生成 SSH 密钥对,生成后的公钥路径为:~/.ssh/id_rsa.pub  
ssh-keygen -t rsa -b 2048 -f ~/.ssh/id_rsa -N ""  

复制公钥到目标容器

就是使用物理机间配置免密登陆的方法,将 container_a 和 container_b 的公钥分别复制到对方的 ~/.ssh/authorized_keys 文件中去

因为不想输密码,我直接纯手动复制,所以就不贴出命令了,就是分别 cat 两个容器中 ~/.ssh/id_rsa.pub 文件的内容,然后复制到对方容器里 ~/.ssh/authorized_keys 文件中

赋予权限

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

验证是否配置成功

执行以下命令后,如果无需输入密码即可登陆,则说明配置成功(由于我修改过 SSH 端口,所以需要使用 2222 端口去登陆;而且在容器内,我使用的是 root 用户)

# 容器 container_a 上执行:  
ssh -p 2222 root@192.168.0.1  
# 容器 container_b 上执行:  
ssh -p 2222 root@192.168.0.2  
  
# 第一次登陆会提示 yes/no 提示,输入 yes 就好了