
1. FreeIPA 到底是个什么东西值不值得上手第一次听到 FreeIPA 这个名字很多人会以为它是某个小工具实际上它是一整套身份管理基础设施的集合体。全称是 Identity, Policy, Audit身份、策略、审计由红帽主导开发底层把 389 Directory Server、MIT Kerberos、Dogtag 证书系统、BIND DNS、SSSD、chrony 这些各自独立就很能打的组件封装成了一条命令就能跑起来的整体方案。你要的集中登录、统一授权、主机证书签发、内网域名解析、操作审计它基本都覆盖了。这篇搭建教程一主要解决的是从零到服务端能跑起来并且自检通过这一段也就是环境规划、系统准备、服务端安装和安装期排错。适合正在给中小规模内网做统一认证的运维、需要搭建实验环境练手的学生、以及被一堆机器上重复维护/etc/passwd折磨过的开发同学。服务端装完之后客户端纳管、HBAC 规则、sudo 集中管理、副本复制、跨域信任这些内容体量很大我放到后续的教程二三里慢慢拆。需要先打个预防针FreeIPA 的安装脚本本身容错性不算高它会在开始时严格校验主机名解析、时间同步、域名合法性任何一项不满足就直接中止而且中止后往往留下一堆半成品配置清理不干净会让下一次安装莫名其妙失败。所以这篇的重点不只是敲哪条命令更是敲之前把哪些东西先定死。1.1 拆开看它的几个核心组件各自干什么理解组件的分工出问题的时候才能快速定位到底该看哪个日志。我习惯把它拆成这么几层389 Directory Server389-ds真正的数据存储层用户、用户组、主机、服务、策略规则全存在这里对外提供 LDAP/LDAPS 服务默认端口 389 和 636。它相当于整个系统的数据库进不去 LDAP 就等于什么都查不到。MIT Kerberos KDC负责认证也就是你执行kinit admin时背后真正在干活的角色。它签发票据TGTSSSD 客户端拿着票据去访问服务。端口 88认证和 464改密码。Dogtag Certificate System内部的 CA给每个加入域的主机签发证书LDAPS、HTTPS、Kerberos 之间的服务认证都依赖它。IPA 的 CA 是用自签名根证书起步的后续可以换成外部 CA 签发。BIND bind-dyndb-ldap 插件DNS 服务。这个插件做的事很有意思它让 BIND 直接以 LDAP 为后端读取区域数据也就是说你在 IPA 里改一条 DNS 记录不需要去碰 zone 文件也不需要 reload立刻生效。SSSD不是服务端组件而是装在客户端上负责和 IPA 通信、缓存凭证、做离线认证的守护进程。服务端装好之后客户端能不能顺利加入一半看 SSSD 的配置。chrony时间同步。Kerberos 对时间偏差极其敏感默认容忍 5 分钟超了就直接拒绝认证。这六个东西绑在一块儿优点是开箱即用、互相之间已经调好缺点是一处配置不对报错信息可能来自完全想不到的模块。比如登录失败可能是 DNS 解析问题也可能是时间偏差还可能是证书过期。1.2 和其它几种身份管理方案的横向对比选型的时候我一般会给团队摆这么一张表把决策依据讲清楚而不是因为FreeIPA 听起来很专业就上方案部署复杂度功能覆盖适用规模主要痛点FreeIPA中一条脚本搞定但前置校验严认证授权DNS证书审计全覆盖10~几千台组件耦合紧排错要懂多个子系统裸 OpenLDAP高全靠手工拼只有目录存储任意认证授权要自己配 Kerberos、SSSD工作量大微软 AD中图形化程度高认证授权GPODNS证书中大型企业许可成本、跨平台集成偶有摩擦NIS 手搓 Kerberos极高基础认证遗留小环境技术老旧、文档稀缺、坑深从这张表能看出 FreeIPA 的定位它在功能完整和部署成本之间找了个不错的平衡点。如果你的环境是纯 Linux又不打算买 Windows Server 授权FreeIPA 基本是最省心的选择。要是环境里已经有 AD 而且规模不大硬换 FreeIPA 反而折腾直接用信任关系打通更划算——这也是为什么FreeIPA 与 AD 建立信任这种做法在企业里很常见Linux 侧的机器归 IPA 管员工账号还是走 AD两边通过跨域信任互认票据不用做账号同步人员离职时在 AD 禁用一次就够了。1.3 哪些场景适合哪些场景别硬上适合上的场景我列几个具体的内网有几十台到几百台 Linux 服务器密码策略、sudo 权限、SSH 公钥分散在各台机器上改一次要登几十台。需要给内网服务签发证书又不想花钱买公网 CA也不想手工维护自签证书链。有合规要求需要记录谁在什么时候登录了哪台机器、执行了什么操作。内网需要一套自己的 DNS而且希望 DNS 记录和主机账号生命周期绑定。不太建议硬上的场景也说清楚只有三五台机器的小环境用 Ansible 批量推一下 SSH key 和 sudoers 文件成本比维护一套 IPA 低得多跨公网、机器分布在多个不可靠网络的环境Kerberos 和多端口的通信要求会带来很大麻烦团队里没人愿意花时间理解 Kerberos 和 LDAP 的话后面出问题只能干瞪眼。注意FreeIPA 不是装完就不用管的东西。Kerberos 票据、CA 证书都有有效期副本之间还有复制协议要维护至少要有一个人能看懂相关日志。2. 动手之前的规划三件必须先定死的事我见过太多人上来就dnf install ipa-server结果卡在安装脚本的第一步然后反复卸载重装越装越乱。安装前的规划没做好后面补的成本是几何级增长的。这一节把域名、网络端口、时间同步这三件事讲透。2.1 域名与 Kerberos Realm 的命名规则这里有一个关键概念要分清DNS 域名和Kerberos Realm是两个东西但通常一个是另一个的大写形式。比如 DNS 域名定了example.lan那 Realm 一般就是EXAMPLE.LAN。命名有硬性约束违反了安装脚本直接拒绝Realm 必须全大写习惯上就是域名的大写形式比如CORP.EXAMPLE.COM。域名不能是单段必须是至少两段example这样的不行脚本会报 domain name is not valid。域名不要和你的公网域名撞车。假设你公司的官网是example.com内网千万别直接用example.com否则客户端解析www.example.com时会被内网 DNS 抢答导致访问官网失败。稳妥做法是用子域比如id.example.com或者干脆用保留后缀像example.lan、corp.internal。我个人的建议如果公司有正式域名用三层子域id.公司域名如果没有就用xxx.lan这种明显不会和公网冲突的后缀。internal这个后缀曾经被 ICANN 建议保留后来正式分配给了某个商业机构所以我不太推荐新手用容易踩坑。还有一点容易被忽略域名一旦确定后期修改成本极高。它写进了 Kerberos 的 realm 名、LDAP 的 suffixdcexample,dclan、证书的 SAN、DNS 区域、SRV 记录几乎散落在所有配置文件里。改域名基本等于重建。所以这一步一定要和团队确认好最好写进部署文档。2.2 网络、端口与 DNS 记录规划FreeIPA 用到的端口比一般人想象的多。如果内网有严格的防火墙策略提前把这些端口摸清楚能省掉大量排错时间。我按用途整理一张表端口协议用途是否必须53TCP/UDPDNS 查询与区域传输使用内置 DNS 时必需80TCPHTTP主要用于证书和跳转必需443TCPHTTPSWeb 管理界面和 API必需88TCP/UDPKerberos 认证必需464TCP/UDPKerberos 改密必需389TCP/UDPLDAP必需636TCPLDAPS 加密目录访问必需749TCPKerberos 管理kadmin服务端间管理需要123UDPNTP 时间同步使用 IPA 管理时间时需要8080TCPDogtag CA 的 HTTP 接口CA 相关操作需要8443TCPDogtag CA 的 HTTPS 接口CA 相关操作需要DNS 记录这块如果打算用 IPA 内置的 DNS理论上不需要手工建反向区域之外的任何记录因为安装脚本会自动创建。但如果你要在安装前手工验证解析至少得保证两条记录存在正向ipa.example.lan解析到服务器的内网 IP比如192.168.10.10。反向该 IP 反解回ipa.example.lan即10.10.168.192.in-addr.arpa的 PTR 记录。反向解析为什么重要因为安装脚本和很多 Kerberos 工具会做正反解一致性校验。如果你只做了正向没做反向脚本可能报 Unable to resolve hostname 或者更隐晦的 Reverse resolvable check failed。我见过有人在这一步卡了一下午最后发现只是 PTR 记录没建。另外内置 DNS 还需要一个上游转发器forwarder。这个转发器的选择有讲究要用内网能稳定访问的公共解析服务或者自建的上级 DNS不要填一个需要额外网络环境才能到达的地址否则安装时 DNS 校验会超时。测试方法很简单装之前先跑dig 转发器地址 www.example.com能返回结果就行。提示如果内网已经有成熟的 DNS 体系也可以在安装时加--no-dns不用 IPA 的 DNS转而把所有 SRV 和 A 记录手工加到现有 DNS 里。但这样做会失去改 DNS 自动生效的便利SRV 记录一旦写错客户端加入时会报找不到 KDC。新手我建议先用内置 DNS把流程跑通再说。2.3 时间同步看起来最不起眼翻车最常见Kerberos 的设计原理决定了它对时间极其敏感票据上带时间戳如果客户端和 KDC 的时间差超过默认的 5 分钟clockskew认证会直接被拒报错信息通常是 Clock skew too great。所以在装 IPA 之前先确认这台机器的时间同步是正常的。做法dnf install -y chrony systemctl enable --now chronyd chronyc sources -v chronyc trackingchronyc tracking输出里的System time那一行如果显示偏差在毫秒级、Leap status是Normal就说明没问题。如果发现偏差很大先别急着装 IPA等它同步稳定几分钟再动。安装 FreeIPA 时有两种时间管理方式要提前想清楚让 IPA 自己管时间默认行为脚本会配置 chronyd并把它作为内网的时间源客户端加入时会指向 IPA 服务器同步时间。这种方式适合内网没有统一时间源的情况。用手工加--no-ntpIPA 完全不碰 chrony 配置时间由你现有的 NTP 基础设施负责。如果内网已经有统一时间源我强烈建议用这个参数避免 IPA 把已有的 chrony 配置覆盖掉。一个真实的坑有人用云上的实例搭 IPA云厂商自带的 chrony 配置里已经指向了内网时间服务安装脚本默认又加了一个外部源结果两个源互相打架机器时间来回跳Kerberos 认证时好时坏。后来加--no-ntp才彻底稳住。3. 把裸机收拾成可安装状态规划定完了接下来是把一台裸机收拾到安装脚本能顺利跑通的状态。这一步看着琐碎但每一项都有它存在的理由。3.1 操作系统选型与最小化安装FreeIPA 的官方支持列表里红帽系RHEL、Rocky Linux、AlmaLinux是第一梯队包管理用 dnf安装最顺Fedora 版本新但更新快适合练手Debian 和 Ubuntu 也有打包但版本往往落后一两年某些新特性对不上。如果是生产环境我建议用 Rocky Linux 9 或 AlmaLinux 9 这类和 RHEL 9 完全兼容的发行版文档和社区经验都能直接套用。安装系统时选最小化安装Minimal Install就够了不要装带图形界面的版本多出来的服务会占用端口。特别注意如果你在安装系统时顺手勾了Web 服务器之类的软件组httpd 会开机自启并占住 80 和 443 端口IPA 安装脚本会直接报端口冲突。我之前就遇到过一次排查半天才发现是系统自带的 httpd 在跑。系统装完先更新一遍dnf update -y reboot更新完重启是必要的内核和 glibc 更新后不重启后续安装可能遇到奇怪的库版本问题。3.2 主机名、hosts 与网络配置主机名必须是完整限定域名FQDN不能是短名。这一点很多教程会一笔带过但实测这是安装失败排名前三的原因。# 查看当前主机名 hostnamectl status # 设置成 FQDN注意和后面安装参数保持一致 hostnamectl set-hostname ipa.example.lan设置完重新登录一下让 shell 环境刷新再确认hostname -f # 期望输出ipa.example.lan如果hostname -f输出的是短名说明解析没配好。接着编辑/etc/hosts加上静态映射cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.10.10 ipa.example.lan ipa这里有一个细节值得说明为什么要在/etc/hosts里加这一行明明打算用 DNS因为安装过程中 DNS 服务本身还没起来脚本需要靠本地文件完成自解析。加这一行能让前期的正反解校验顺利通过。等 IPA 的 DNS 跑起来之后这条记录和 DNS 里的记录是一致的不会冲突。顺手把网卡配置也确认一下IP 建议用静态地址别用 DHCP。原因很简单如果 IP 变了DNS 记录、证书 SAN、客户端的配置全都要改血亏。ip -4 addr show ip route show3.3 SELinux、防火墙与依赖包SELinux 这块网上有不少先setenforce 0关掉再说的建议我不推荐。FreeIPA 自带完整的 SELinux 策略模块在 enforcing 模式下是能正常工作的关掉反而会丢失一层安全防护。正确的做法是保持 enforcing只在你确认某个报错和 SELinux 有关时临时切到 permissive 抓一下审计日志# 查看当前状态 getenforce # 排障时临时切 permissive重启失效不改配置文件 setenforce 0 # 抓完日志记得切回去 setenforce 1 # 看有没有被 SELinux 拦 ausearch -m avc -ts recent防火墙方面firewalld 提供了现成的服务定义一条命令就能放行 IPA 需要的端口# 方式一用预定义服务推荐 firewall-cmd --permanent --add-servicefreeipa-ldap firewall-cmd --permanent --add-servicefreeipa-ldaps firewall-cmd --permanent --add-servicefreeipa-trust firewall-cmd --permanent --add-servicedns firewall-cmd --permanent --add-servicentp firewall-cmd --permanent --add-servicekerberos firewall-cmd --permanent --add-servicekpasswd firewall-cmd --reload # 查看生效的规则 firewall-cmd --list-all有些老版本 firewalld 没有freeipa-4这个服务定义那就退化成逐端口放行firewall-cmd --permanent --add-port{80/tcp,443/tcp,389/tcp,389/udp,636/tcp,88/tcp,88/udp,464/tcp,464/udp,53/tcp,53/udp,123/udp,749/tcp} firewall-cmd --reload如果内网是纯实验环境、暂时不考虑安全边界也可以先systemctl stop firewalld systemctl disable firewalld但这句话只适合试验机生产别这么干。最后装依赖包。服务端和内置 DNS 需要的包dnf install -y ipa-server ipa-server-dns bind-dyndb-ldap注意ipa-server-dns和bind-dyndb-ldap这两个包在有些发行版的默认仓库里是非默认安装的不装的话安装脚本加--setup-dns时会报找不到 DNS 组件。这一步先装好能省掉一次失败重装。4. 跑起 ipa-server-install参数逐个拆环境收拾干净就到了关键的安装环节。ipa-server-install这个命令的交互流程不算长但每一步的选择都会影响后续使用我建议第一次先用交互模式把流程走一遍理解每个问题的含义之后再改成静默安装方便批量复现。4.1 交互式安装流程走一遍直接执行ipa-server-install脚本会先做一轮前置检查然后逐个提问。典型的交互过程长这样我加了中文注释说明每个问题的意图The log file for this installation can be found in /var/log/ipaserver-install.log This program will set up the IPA Server. Do you want to configure integrated DNS (BIND)? [no]: yes # 是否启用内置 DNS。内网没有现成 DNS 体系就选 yes Enter the fully qualified domain name of the computer on which youre setting up server software. Using the form hostname.domainname Example: master.example.com. Server host name [ipa.example.lan]: # 服务器 FQDN直接回车用默认值前提是 hostname 已设对 Warning: Hostname ipa.example.lan does not match any of the systems IP addresses... Do you want to use it? [no]: yes Enter the domain name of the computer Example: master.example.com. DNS domain name [example.lan]: # DNS 域名决定了 LDAP 的 dc 后缀 Enter the Kerberos realm name. This is usually the domain name in uppercase. Kerberos realm name [EXAMPLE.LAN]: # Realm 名一般用域名大写 Enter the password of the Directory Server superuser. # Directory Manager 密码也就是目录的管理员非常重要 Directory Manager password: Confirm: Enter the password of the IPA admin user. # IPA admin 密码日常管理用这个账号 IPA admin password: Confirm: Do you want to configure DNS forwarders? [yes]: yes Enter the IP address of the DNS forwarder: 223.5.5.5 # 上游 DNS装之前测过能通就行 Do you want to search for missing reverse zones? [yes]: yes # 是否自动创建反向区域建议 yes The IPA Master Server will be configured with: Hostname: ipa.example.lan IP address(es): 192.168.10.10 Domain name: example.lan Realm name: EXAMPLE.LAN Continue to configure the system with these values? [no]: yes确认之后脚本开始正式安装会依次配置 LDAP、Kerberos、CA、DNS、Web 服务中间会启动重启若干次服务。整个过程视机器性能通常 5 到 15 分钟。期间不要开另一个终端去手动启停相关服务会干扰脚本判断。4.2 静默安装参数详解跑通一遍之后生产部署就该用静默模式了方便写进自动化脚本。对应的命令ipa-server-install \ --realmEXAMPLE.LAN \ --domainexample.lan \ --hostnameipa.example.lan \ --ip-address192.168.10.10 \ --ds-passwordDsPassw0rd!2024 \ --admin-passwordAdminPassw0rd!2024 \ --setup-dns \ --forwarder223.5.5.5 \ --forward-policyonly \ --no-ntp \ --mkhomedir \ --unattended逐条说清楚这些参数都不是随便加的--realm和--domain前面规划好的值大写 Realm 加小写域名。--hostnameFQDN必须和hostname -f输出一致。--ip-address当机器有多块网卡或者多个 IP 时用这个参数明确指定 IPA 监听和注册的地址。不指定的话脚本可能选错导致后来客户端连不上。--ds-passwordDirectory Manager 密码至少 8 位建议混大小写数字符号。--admin-passwordIPA admin 密码同样是 8 位起。--setup-dns启用内置 DNS。--forwarder上游 DNS 地址可以写多个--forwarder。--forward-policyonly表示所有非本地区的查询都转发给上游不做递归查询first表示先尝试自己递归失败再转发。内网环境用only更规范。--no-ntp不接管 chrony时间交给现有的时间同步体系。--mkhomedir让后续加入的客户端在用户首次登录时自动创建家目录省得每台机器手工建。--unattended全静默不交互。密码别直接写在命令里那样会进 shell 历史。生产环境可以用文件方式# 权限设成 600用完就删 echo DsPassw0rd!2024 /root/.ds_pw chmod 600 /root/.ds_pw ipa-server-install --ds-password$(cat /root/.ds_pw) ... --unattended提示如果反悔了想重来卸载用ipa-server-install --uninstall然后rm -rf /var/lib/dirsrv/slapd-EXAMPLE-LAN /etc/dirsrv/slapd-EXAMPLE-LAN /var/lib/pki/pki-tomcat把残留清掉再重启机器。不清残留直接重装很可能在 CA 初始化那一步报证书已存在的错。4.3 安装后自检五条命令确认服务真的活着安装脚本最后打印 The ipa-server-install command was successful 不代表万事大吉必须做一轮自检# 1. 拿一张 admin 票据验证 Kerberos 正常 kinit admin klist # 2. 列出用户验证 LDAP 正常 ipa user-find --all # 3. 查看全局配置验证 API 正常 ipa config-show # 4. 检查 DNS 解析验证内置 DNS 正常 dig 127.0.0.1 ipa.example.lan A dig 127.0.0.1 192.168.10.10 -x # 5. 检查所有核心服务单元 systemctl list-units --typeservice | grep -E ipa|named|krb5kdc|pki|dirsrv第 1 条如果成功说明 LDAP、Kerberos、CA 三者之间的联动是通的。第 4 条的正反解都返回正确结果说明 DNS 配好了。第 5 条里这些服务单元应该都是active (running)重点看ipa.service、named.service、krb5kdc.service、pki-tomcatdpki-tomcat.service、dirsrvEXAMPLE-LAN.service。还可以跑一下健康检查工具新版本才有ipa-healthcheck --output-type human它会把 DNS、证书、复制、信任等各个维度的状态汇总输出有问题会标ERROR或WARNING非常适合装完做一次全面体检。5. 安装期常见问题与排查实录安装脚本报错信息往往比较笼统只说失败并回滚具体原因得去日志里翻。这一节把我实际遇到过、也帮别人解决过的问题整理出来。5.1 报错速查表先给一张快速对照表遇到问题可以按症状对号入座报错关键字可能原因处理方向Unable to resolve hostnameFQDN 解析不到检查/etc/hosts和 DNS 的正反解Reverse resolvable check failed缺 PTR 记录补反向区域或加 hosts 映射domain name is not valid域名只有一段改成两段以上如 example.lanrealm name must be uppercaseRealm 用了小写改成全大写Clock skew too great时间偏差超 5 分钟先修好 chrony 再装Port 80 already in usehttpd 等占用端口停掉占端口的服务再装IPA server is already configured有残留配置先--uninstall再清残留DNS server could not be startednamed 启动失败看/var/log/messages里 named 的报错CA failed to start证书服务初始化失败看/var/log/pki/pki-tomcat/ca/debug主日志的位置要记住出问题第一个看它tail -n 200 /var/log/ipaserver-install.log里面通常会有比终端输出详细得多的原因说明。5.2 DNS 反向解析与转发器相关的经典坑我印象最深的一次是安装时一直卡在 DNS 配置那一步报错说 DNS 服务启动失败。翻了journalctl -u named才发现是上游转发器的地址填错了BIND 启动时做了一次探测连不上就起不来。所以装之前一定要用dig 转发器地址验证一次连通性别凭记忆填地址。另一个高频坑是反向区域的问题。假设你服务器的 IP 是192.168.10.10反向区域应该是10.168.192.in-addr.arpa注意 IP 段是倒序的。安装脚本在--setup-dns时会问你要不要自动创建反向区域选 yes 的话它会自己建好并加 PTR。但如果你的 IP 段不是标准的 /24比如是192.168.10.0/25自动创建有时会判断失误需要手工加# 手工创建反向区域 ipa dnszone-add 10.168.192.in-addr.arpa. # 手工加 PTR 记录 ipa dnsrecord-add 10.168.192.in-addr.arpa. 10 --ptr-recipa.example.lan.验证反向解析dig 127.0.0.1 -x 192.168.10.10 short # 期望输出 ipa.example.lan.如果这一步一直失败可以在安装时加--no-reverse暂时跳过反向区域创建先把服务跑起来之后手工补。这算是一个务实的折中方案。5.3 我踩过之后总结的几条经验第一安装失败后千万别反复重试。脚本每次失败都可能留下部分配置第二次跑的时候它检测到/etc/dirsrv/slapd-EXAMPLE-LAN已存在行为就不确定了。正确顺序是ipa-server-install --uninstall→ 手工删残留目录 → 重启机器 → 再装。第二把安装日志留好。每次装之前cp /var/log/ipaserver-install.log /root/install-$(date %s).log出问题的时候能对比两次的差异比对着终端刷屏的输出来回翻要高效得多。第三先把主机名和解析搞定再装任何东西。我在帮人排障时发现一半以上的安装失败可以归结为主机名和解析不对。装之前跑三条命令做个体检hostname -f # 必须输出 FQDN getent hosts $(hostname -f) # 必须解析到正确的 IP dig short -x $(hostname -I | awk {print $1}) # 反解最好也能出结果第四密码复杂度和位数要一次到位。脚本对密码有长度要求如果第一次输入太短被拒后面的交互会重新走一遍比较烦。直接准备一个 12 位以上、大小写数字符号齐全的密码一次性通过。第五别在有多块网卡的机器上想当然。那台机器的默认路由网卡不一定是 IPA 要监听的网卡务必用--ip-address明确指定。装完之后ip a里出现一个奇奇怪怪的ipa或者 tun 之类的接口是正常的那是 IPA 的虚拟接口别去删。我个人的体会是FreeIPA 这套东西的难度不在安装本身而在安装前的规划和安装后的排错。只要把域名、时间、解析这三件事提前定死脚本其实很顺反过来任何一项含糊过去后面都会以各种意想不到的方式还回来。服务端跑起来只是第一步接下来把第一台客户端纳入管理、验证登录和 sudo 规则是否生效才能真正确认这套东西在你的环境里是可用的这部分留到教程二里继续拆。