配置服务器互信就是通过SSH密钥认证实现多台Linux服务器之间的免密登录,核心步骤包括生成密钥对、汇总公钥并分发到各目标主机,完成后即可跨机执行命令或传输文件而无需重复输入密码。
要实现服务器互信,首先需要理解SSH密钥认证的基本原理,每台服务器生成一对公私钥,公钥放在目标服务器的授权列表里,私钥留在本地作为身份凭证,当发起SSH连接时,目标服务器验证签名即可确认身份,从而实现免密登录,这一机制在自动化运维、集群部署和分布式管理中被广泛采用,已成为运维人员的基础技能。
ssh互信配置步骤详解
整个配置过程可以拆解为几个连贯的操作,每步都需要在指令层面准确执行,以下步骤适用于CentOS、Ubuntu等主流Linux发行版,其他Unix系统也类似。
生成密钥对:每台服务器独立操作
在每台需要参与互信的服务器上,执行密钥生成命令:
ssh-keygen -t rsa -b 4096
-t rsa指定算法类型,RSA是通用选择,兼容性最好。-b 4096设置密钥长度,4096位是目前推荐的安全标准。
- 执行后按提示指定保存路径(默认
~/.ssh/id_rsa)和密码短语。要实现免密登录,密码短语必须留空,直接回车跳过。
如果服务器上已有密钥对,则跳过此步,避免覆盖,生成结束后,在 ~/.ssh/ 目录下会出现 id_rsa(私钥)和 id_rsa.pub(公钥)两个文件,私钥权限必须为600,公钥644,否则SSH会拒绝使用。
汇总公钥到认证文件:建立单方向信任
假设你有两台服务器A和B,想让A能免密登录B,只需将A的公钥追加到B的 ~/.ssh/authorized_keys 文件中。 如果要做双向互信,则每台机器的公钥都需要加入其他机器的授权列表。
手动操作步骤:
- 在A上查看公钥内容:
cat ~/.ssh/id_rsa.pub,复制输出。 - 登录B,编辑
~/.ssh/authorized_keys(如果文件不存在则新建),将复制的内容粘贴到新的一行。 - 保存文件,并设置权限:
chmod 600 ~/.ssh/authorized_keys。
批量操作技巧: 当服务器数量较多时,逐台手工操作容易出错,推荐使用 ssh-copy-id 工具,它自动将本地公钥写入目标主机:
ssh-copy-id user@B
输入B的密码后,公钥即被安全追加,重复此命令,即可将A的公钥分发到所有目标服务器。
测试免密登录:验证配置是否生效
在A上执行 ssh user@B,如果直接进入B的命令行而无需输入密码,说明配置成功,首次连接时可能会提示确认主机指纹,输入 yes 即可,如果依然提示输入密码,请检查以下常见问题:
~/.ssh目录权限是否为700,authorized_keys是否为600。- 目标服务器的SSH配置是否允许密钥认证:检查
/etc/ssh/sshd_config中PubkeyAuthentication yes是否开启,是否准确无误,注意不要有多余空格或换行。
多台服务器互信配置的批量操作
当服务器数量达到几十台甚至上百台时,手动分发的效率极低,而且容易遗漏,行业内的通用做法是编写脚本实现自动化配置,将“生成密钥、汇总公钥、分发授权文件”三个步骤串联起来。
批量配置ssh互信的脚本实现
一个典型的批量脚本思路如下:
- 选定一台控制节点,在该节点上生成密钥对(如果尚未存在)。
- 准备一个包含所有目标服务器IP和用户信息的列表文件。
- 通过循环遍历列表,使用
sshpass或expect工具自动输入密码,执行ssh-copy-id将控制节点的公钥分发到每台服务器。 - 分发完成后,控制节点即可免密登录所有目标机器。
示例脚本片段(使用bash + sshpass):
#!/bin/bash
SERVERS=("192.168.1.101" "192.168.1.102" "192.168.1.103")
USER="root"
PASSWORD="your_password"
for SERVER in "${SERVERS[@]}"; do
sshpass -p "$PASSWORD" ssh-copy-id -o StrictHostKeyChecking=no "$USER@$SERVER"
done
- 如果目标服务器之间也需要互信,则需要在每台机器上重复执行类似操作,或者将生成的私钥同步到所有机器(不推荐,因为私钥泄露风险增大)。
- 更安全的做法是:每台机器都生成自己的密钥对,然后通过控制节点收集所有公钥,合并成一个
authorized_keys文件,再分发回每台机器,这样任意两台机器之间都能直接免密登录。
配置注意事项:避免踩坑
- 主机名解析:确保所有服务器的主机名能互相解析(通过
/etc/hosts或DNS),否则SSH连接时可能出现Host Key验证失败。 - 私钥保密:私钥一旦泄露,所有授权服务器都可能被未授权访问,生产环境建议为每个服务器生成独立的密钥对。
- known_hosts管理:首次连接时,系统会将目标主机的公钥指纹记录在
~/.ssh/known_hosts中,后续连接会校验,如果目标主机重装系统或更换密钥,需要清理旧的指纹记录,否则会报错。 - 防火墙与SELinux:某些环境下,SELinux或iptables会阻止SSH密钥认证,需确保相关规则放行。
服务器互信配置常见问题
配置完成后,ssh登录依然提示输入密码,可能是什么原因?
最常见的原因是权限设置不当。~/.ssh 目录权限应为700,authorized_keys 文件权限应为600,~/.ssh 目录不能是组可写或其他人可写,检查目标服务器SSH配置中 AuthorizedKeysFile 的路径是否正确,默认指向 .ssh/authorized_keys,如果使用非root用户,还需要确认用户的家目录安全。
多台服务器互信配置时,如何批量处理密钥分发?
可以使用 sshpass 或 expect 工具配合循环脚本,实现自动输入密码并执行 ssh-copy-id,对于上百台规模的集群,更推荐使用Ansible或SaltStack等自动化工具,它们内置了密钥分发模块,可以批量、幂等地完成配置,且能管理配置的变更。
配置ssh互信后,是否会影响sftp或scp传输?
不会,SSH密钥认证对SSH协议下的所有服务(包括sftp、scp、rsync)都生效,配置成功后,这些传输工具同样可以免密使用,极大提升脚本和自动化任务的效率,但注意,如果使用非标准端口或跳板机,需要在SSH配置中指定相应的参数。
服务器互信配置是运维自动化的基石,掌握核心步骤和批量操作技巧,能显著降低日常维护的重复劳动,是每个运维工程师必须熟练掌握的技能。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/504460.html



