跳到主要内容

添加第二台 IPA 服务器

用 ipa-replica-install 添加一台 replica 组成多 master。安装前检查、安装命令、可忽略的告警、安装后检查,以及失败后的清理与重试。

第二台 IPA 服务器(replica)与第一台组成多 master,目录、KDC、CA、DNS 全部双向复制,任一台停机时域照常工作。管理台目前只安装在第一台上,replica 是纯 FreeIPA;命令行 ipa 在两台上都可用。

replica 安装不走 playbook,使用 FreeIPA 自带的 ipa-replica-install。它对目标主机干净程度的要求比 ipa-server-install 更严格,安装前检查不能省略。

安装前检查

在新主机上执行。

主机名解析

hostname -f                          # FQDN
getent hosts $(hostname -f)          # 第一条必须是真实 IPv4,不能是 ::1 或 127.0.0.1
grep '^hosts' /etc/nsswitch.conf     # 应为 hosts: files dns,没有 myhostname

/etc/hosts 中主机名不能出现在 ::1 或 127.0.0.1 行。nsswitch.conf 的 hosts: 含 myhostname 时 IPv6 查询返回 ::1,IPA 拒绝安装或创建指向回环的记录。改为 hosts: files dns。

ipa-client-install --uninstall 把 nsswitch.conf 还原为安装前的备份,每次卸载重来都需要重新修改这一行。

系统完整性

replica 需要在干净系统上安装。被人工清理过的机器在不同步骤失败,且每次失败的位置不同。

rpm -q mod_ssl ipa-server ipa-server-dns sssd-common idm-pki-base bind-dyndb-ldap
rpm -Va --nofiledigest --nomtime --nomode 2>/dev/null | grep '^missing' || echo "no missing files"
ls -l /etc/krb5.conf.d/crypto-policies      # 必须存在,指向 /etc/crypto-policies/back-ends/krb5.config

rpm -Va 有 missing 时用 rpm -qf <路径> 找到包,执行 dnf reinstall,然后 restorecon -Rv 修复 SELinux 标签。

/etc/krb5.conf.d/crypto-policies 是 update-crypto-policies 生成的软链,不属于任何 rpm,rpm -Va 查不出它缺失。缺少它时 KDC 不受 permitted_enctypes 约束,用 camellia 签票,第一台按自己的策略一律拒收,复制断在 Invalid credentials (49)。缺少时执行 update-crypto-policies --set DEFAULT,仍没有则手工创建:ln -s /etc/crypto-policies/back-ends/krb5.config /etc/krb5.conf.d/crypto-policies。

时间、端口、第一台的状态

chronyc sources                      # 与第一台时差小于 5 分钟
ss -lntp | grep -E ':(389|636|8443|8080) ' || echo "ports clear"

在第一台上:ipactl status 全部 RUNNING;ipa server-find 和 ipa topologysegment-find domain 中没有新主机的残留(上次失败留下的)。

许可

replica 本身不需要许可。第一台的许可需含证书签发模块(所有档位都有),否则 replica 安装在申请 dirsrv 证书一步报 CA_UNREACHABLE。1.0.2 起 FreeIPA 自身的证书请求不经过许可闸门,该限制不再存在。

安装

在新主机上先注册为客户端再提升:

ipa-client-install --domain=<域> --realm=<REALM> \
  --server=<第一台 FQDN> --principal admin -U -p admin -w '<admin口令>'

kinit admin
ipa-replica-install --setup-ca --setup-dns --forwarder=<第一台使用的转发器> -U

第一台的转发器用 ipa dnsconfig-show(全局)查看,为空时看 ipa dnsserver-show <第一台 FQDN>(每服务器)。没有转发器时使用 --no-forwarders。

第一步的 -p admin -w 只用于注册。第二步 -U 非交互模式需要一张有效的 admin 票,因此中间执行 kinit admin,或给第二步加 --principal admin --admin-password。

全程 10 到 15 分钟,依次为目录 40 步、KDC、dirsrv TLS、httpd 21 步、CA 33 步(约 3 分钟)、DNS 9 步、DNSSEC 密钥同步。

可忽略的输出

输出含义
DNS server <转发器> does not support DNSSEC上游不签 DNSSEC,安装过程自动关闭校验
Reverse DNS resolution of address <第一台 IP> failed未创建反向区,安装后补充
Replica DNS records could not be added on master: Insufficient access安装中途的 ACI 时序问题,replica 自身的 DNS 阶段会补上 A 记录,安装后核对
Could not add certificate to service ldap/... entry: no modifications to be performed证书已存在,幂等跳过

安装后检查

# 新主机
ipactl status                              # 9 个(无 adtrust)或 11 个服务全部 RUNNING
getcert list | grep -c MONITORING          # 8 或 9

# 第一台
ipa server-find                            # 两台
ipa topologysegment-find domain            # 一段,Connectivity: both
dig +short <新主机 FQDN>                    # A 记录存在

复制必须用真实数据验证。topologysegment 和 ipa-replica-manage list 都不代表数据在流动:

# 第一台
ipa user-add repltest --first=a --last=b
# 新主机,等待 15 秒
ipa user-show repltest
# 反向再做一次,然后在第一台删除
ipa user-del repltest

安装过程中警告的反向区在任一台创建,两台自动同步:

ipa dnszone-add <反向区>.in-addr.arpa.
ipa dnsrecord-add <反向区>.in-addr.arpa. <末段> --ptr-rec=<新主机 FQDN>.

创建前先用 dig -x 确认该网段没有其他 DNS 做权威,否则冲突。

复制不通

安装成功但 user-add 不同步时,先看两边的复制状态:

ldapsearch -QY GSSAPI -o ldif-wrap=no -b "cn=mapping tree,cn=config" \
  "(objectclass=nsds5replicationagreement)" cn nsds5replicaLastUpdateStatusJSON | grep -E "^cn:|Status"
状态原因处理
Invalid credentials (49),DS 日志出现 gss_accept_sec_context新主机缺少 /etc/krb5.conf.d/crypto-policies,KDC 签了 camellia 票补软链,systemctl restart krb5kdc,再 systemctl restart dirsrv@<REALM>
Local error (-2)KDC 不可用时留下的旧状态KDC 启动后 systemctl restart dirsrv@<REALM>,然后 dsconf slapd-<REALM> repl-agmt poke --suffix "dc=..." <协议名>
state: green 但数据不动RUV 中有失败安装留下的僵尸 replica iddsconf slapd-<REALM> repl-tasks cleanallruv --suffix "dc=..." --replica-id <id>,两台都执行

dsconf 以 root 通过 LDAPI 自动绑定为 Directory Manager,不需要口令。

在新主机用第一台的 KDC 强制取票再绑定,可直接分清是哪一侧的问题:

KRB5_TRACE=/dev/stdout ldapwhoami -Y GSSAPI -H ldap://<第一台 FQDN> 2>&1 | grep -E "tkt=|Invalid"

tkt=camellia256-cts-cmac 对应上表第一行。

失败后的清理与重试

ipa-replica-install 失败后两边都有残留,都需要清理:

# 新主机
ipa-server-install --uninstall -U --ignore-topology-disconnect
dsctl slapd-<REALM> remove --do-it 2>/dev/null
rm -rf /etc/dirsrv/slapd-<REALM> /etc/pki/pki-tomcat /var/lib/pki/pki-tomcat /var/log/pki/pki-tomcat /etc/ipa/default.conf
rm -f /var/lib/ipa/sysrestore/sysrestore.state /var/lib/ipa/sysrestore/sysrestore.index
getcert list | grep -o "Request ID '[0-9]*'"     # 有则 getcert stop-tracking -i <id>
systemctl stop krb5kdc kadmin
sed -i 's/^hosts:.*/hosts:      files dns/' /etc/nsswitch.conf     # 卸载把它还原了

# 第一台
ipa server-del <新主机 FQDN> --force --ignore-topology-disconnect --ignore-last-of-role
ipa host-del <新主机 FQDN>
ipa server-find; ipa topologysegment-find domain      # 只剩第一台,0 段

ipa-server-install --uninstall 报 IPA server is not configured 属正常,它仍会去第一台移除 server 条目。报 Replication topology is disconnected 时加 --ignore-topology-disconnect。

两边都干净后,从安装前检查重新开始。安装中 KDC 被 restart 过时注意它依赖目录服务:systemctl restart krb5kdc kadmin dirsrv@... 一起重启会让 KDC 先启动而连不上 LDAP,用 ipactl restart 代替。

本页内容