RAC安装过程中最常见的报错之一就是节点间SSH互信失败,导致安装程序无法把软件分发到远端节点。这个问题的根源通常不是密钥没有生成,而是权限、主机名或用户环境存在偏差。Oracle Grid Infrastructure在安装和升级时会通过ssh、scp在节点间执行命令和复制文件,因此必须在所有节点之间建立双向的SSH等价性。

本文从RAC节点通信机制切入,结合实际操作步骤说明如何用RSA密钥完成互信配置,并给出验证和排错方法。
一、为什么RAC节点必须配置SSH等价性
Oracle RAC由多个节点组成,集群软件安装阶段需要通过远程命令把Grid Infrastructure和数据库软件复制到其他节点。Oracle Universal Installer会在源节点执行ssh、scp等命令,要求目标节点无需输入密码即可执行。这里的等价性不是单向信任,而是任意两个节点之间都能双向免密登录,因为安装过程可能在任一节点发起。
如果没有配置等价性,安装程序会在执行远程命令时提示输入密码或直接因认证失败退出。即使手动输入密码能够继续,后续的运行期管理命令如srvctl、crsctl也可能在切换节点时受到阻碍。因此配置SSH等价性是RAC部署的前置条件,也是集群健康检查中常见的核对项。
从原理上看,SSH等价性依赖公钥认证机制。每个节点上的Oracle用户生成一对密钥,私钥留在本地,公钥写入所有节点~/.ssh/authorized_keys文件。当节点A访问节点B时,SSH客户端使用A的私钥签名一个随机挑战,节点B通过已保存的A公钥验证签名,从而确认身份。由于整个过程不需要口令,就实现了免密登录。
二、配置前的环境准备与用户检查
开始配置前,需要确认所有节点的主机名解析一致。RAC节点之间的通信基于主机名,如果/etc/hosts或DNS解析结果不一致,即使密钥配置正确,SSH连接也可能因为主机名无法解析而失败。建议在每台服务器的/etc/hosts中显式配置所有节点的IP地址和短主机名、全限定主机名,并保证文件内容一致。
同时要检查Oracle用户是否存在且UID相同。RAC要求所有节点上的oracle用户和grid用户拥有相同的UID和GID,否则安装程序在设置文件权限和共享存储访问时会产生权限冲突。可以使用id oracle和id grid命令核对,必要时通过useradd -u或usermod -u调整。
还需要确认~/.ssh目录的状态。如果该目录不存在,需要先创建;如果已经存在,检查归属用户和权限。默认情况下,sshd的StrictModes参数为yes,要求~/.ssh目录仅属主可写,权限不能过宽。建议将目录权限设置为700,后续的密钥文件设置为600。
三、基于RSA密钥的等价性配置步骤
首先在每个节点上以Oracle用户身份生成RSA密钥对。执行下面的命令可以生成2048位密钥,并且不设置私钥口令。没有口令是为了后续SSH命令能够在无人值守情况下自动执行。
mkdir -p ~/.ssh chmod 700 ~/.ssh ssh-keygen -t rsa -b 2048 -N "" -f ~/.ssh/id_rsa
生成后每个节点都会产生id_rsa和id_rsa.pub两个文件。私钥必须仅保存在本节点,公钥则需要分发到所有节点。最简单的分发方式是使用ssh-copy-id命令,它可以自动把公钥追加到目标节点authorized_keys文件并修正权限。假设节点名为rac1、rac2,可在rac1上执行:
ssh-copy-id -i ~/.ssh/id_rsa.pub oracle@rac1 ssh-copy-id -i ~/.ssh/id_rsa.pub oracle@rac2
如果环境中没有ssh-copy-id,可以手动合并公钥。先将各节点的id_rsa.pub集中到一个临时文件,再使用重定向追加到authorized_keys。注意追加符号在代码中使用时需要写成>>,下面示例已经转义。
cat /tmp/rac1_id_rsa.pub >> ~/.ssh/authorized_keys cat /tmp/rac2_id_rsa.pub >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys
所有节点都完成公钥分发后,要再次检查权限。正确状态是~/.ssh为700,id_rsa为600,authorized_keys为600。如果权限过宽,SSH服务端会拒绝公钥认证,即使文件内容完全正确也会要求输入密码。可以通过ls -ld ~/.ssh和ls -l ~/.ssh/authorized_keys查看。
另外,首次连接时需要在每个节点上执行一次手动SSH,以生成known_hosts文件并记录主机指纹。否则后续自动执行命令时可能会因为无法确认主机指纹而中断。可以在一个节点上运行循环,依次连接所有主机,回答yes后再继续。
四、等价性验证与常见故障排查
配置完成后,必须在每个节点之间双向验证。可以在rac1上执行ssh rac2 date,再在rac2上执行ssh rac1 date。如果两条命令都能在不输入密码的情况下返回目标节点时间,说明等价性配置成功。注意需要同时测试短主机名和全限定主机名,因为Oracle安装程序两种名称都可能使用。
验证失败时,先查看目标节点日志/var/log/secure或/var/log/auth.log中的SSH记录,常见原因包括Authentication refused: bad ownership or modes、Permission denied (publickey,password)等。此时重点检查家目录权限、~/.ssh目录权限和authorized_keys文件权限。某些Linux发行版的sshd还会检查用户家目录是否组可写,如果/home/oracle权限为775也会被拒绝。
如果权限没有问题但仍然失败,需要确认SELinux状态。在RHEL或CentOS系统中,SELinux可能阻止SSH读取authorized_keys文件,可以通过getenforce查看状态,并在测试环境中使用setenforce 0临时关闭。如果关闭后成功,则需要通过restorecon -R -v ~/.ssh恢复文件安全上下文,或者调整SELinux布尔值,而不是永久关闭。
另一个容易忽略的是主机名解析。若/etc/hosts中同一IP对应多个主机名,或者不同节点对同一主机名解析到不同IP,即使密钥正确,连接也可能被拒绝。建议使用hostname、hostname -i和getent hosts核对每个节点的解析结果,确保所有节点信息一致。
五、多节点批量配置与安全建议
当节点数量较多时,手动逐台执行命令容易遗漏。可以编写一个批量脚本,将公钥收集到一个目录后统一分发。下面示例假设节点列表存储在hosts.txt中,每行一个主机名,脚本会自动生成密钥并复制到所有节点。
#!/bin/bash USER=oracle HOSTS="rac1 rac2 rac3 rac4" for h in $HOSTS; do ssh-copy-id -i ~/.ssh/id_rsa.pub $USER@$h done for h in $HOSTS; do ssh $USER@$h "chmod 700 ~/.ssh; chmod 600 ~/.ssh/authorized_keys" done
安全方面,建议不要为root用户配置等价性,而是使用专门的grid或oracle用户,并且定期轮换密钥。RAC安装完成后的日常管理中,SSH互信仍然会被集群工具使用,因此不要随意删除公钥或修改权限。如果服务器维护导致家目录被重置,需要重新执行上述检查。
最后还要注意,在某些云环境或强制使用证书登录的场景中,密码登录可能已经被禁用,此时只能通过控制台或带外管理先将公钥注入系统。无论如何,只要保证所有节点之间能够双向免密执行命令,Oracle RAC的安装和后续集群管理就能顺利进行。
Oracle RACSSH等价性集群互信修改时间:2026-08-26 04:25:48