slapd启动失败主因是slapd.d配置未正确初始化或权限错误:需停服务、清空旧配置、用slaptest -f生成新slapd.d并chown ldap:ldap,同时确保olcSuffix与olcRootDN格式规范且一致。
OpenLDAP 2.4+ 默认使用 cn=config 动态配置,直接改 slapd.conf 不生效。常见错误是启动时报 “ldap_add: Invalid syntax (21)” 或直接拒绝启动,本质是配置目录未正确生成或权限不对。
slapd:systemctl stop slapd
mv /etc/openldap/slapd.d /etc/openldap/slapd.d.bak
slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d 生成新结构(前提是 slapd.conf 存在且语法合法)chown -R ldap:ldap /etc/openldap/slapd.d,否则 slapd 进程读不到配置文件这是客户端连得上但查不到数据的最常见原因。不是网络不通,而是服务端没声明“我在哪儿管谁”。olcSuffix 必须和你后续所有 LDIF 导入、客户端查询的 Base DN 完全一致,且格式不能少 dc=。
/etc/openldap/slapd.d/cn=config/olcDatabase={2}hdb.ldif
olcSuffix 值应为完整域名形式,例如:olcSuffix: dc=example,dc=com(不是 example.com 或 example)olcRootDN 必须匹配 olcSuffix,例如:olcRootDN: cn=admin,dc=example,dc=com
systemctl restart slapd,且用 slaptest -u 验证配置语法客户端能 ping 通服务器,ldapsearch -x -H ldap://192.168.10.5 -b "dc=example,dc=com" 能返回结果,但 getent passwd 为空——问题几乎一定出在 /etc/nslcd.conf 的 uri 和 base 不匹配,或 binddn/bindpw 权限不足。
uri 必须带协议和结尾斜杠:uri ldap://192.168.10.5/(漏斜杠会导致连接被重定向失败)base 必须与服务端 olcSuffix 完全相同:base dc=example,dc=com
uri 应为 ldaps://,且需配置 tls_cacertfile 指向 CA 证书路径binddn 必须有足够权限读取 posixAccount 和 posixGroup 条目,通常就是 olcRootDN
加了 pam_ldap.so 后,连 root 都要等 10 秒才进系统,或者本地账户突然无法登录——说明 PAM 链路把 LDAP 查询当成了必选项,而没做 fallback 控制。
auth [default=bad] 这类严格模式下加载 pam_ldap.so
auth [success=done default=ignore] pam_ldap.so use_first_pass,表示 LDAP 成功就跳过后续模块,失败则忽略继续走本地认证/etc/pam.d/system-auth 中该行位于 pam_unix.so 之前,否则本地密码校验会被跳过/etc/pam.d/sshd,而非全局 system-auth
slaptest -u 和 getent passwd 这两个验证点。前者不通过,slapd 根本不会真正加载配置;后者不返回 LDAP 用户,后面所有 PAM/NSS 都是空转。别急着改 PAM,先让 getent 跑出来再说。