背景
因为想要进行多机训练,所以研究了下如何在物理机之间,以及容器之间进行免密登录的配置
前提条件
现在有 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 就好了