CentOS通过yum默认安装的
openldap 在 slapd 服务启动后,默认 listen 的配置是ldap:/// ldapi:///这两个参数,也就是会监听默认的 TCP:0.0.0.0:389 和一个IPC (Unix-domain socket);查看 openldap 的官方手册,发现修改自定义的监听端口和指定bind的IP地址的方法,都是通过命令行的方式在启动 slapd 进程的命令后面加 -h 参数来指定监听的地址和端口,比如:
/usr/sbin/slapd -h ldap:/// ldapi:///
但是我在CentOS下用yum安装的opldap并不需要我们手动执行上面的命令来启动,而是由/etc/init.d/slapd这个专门的服务控制脚本来进行启动和停止的;
一开始我想到的是直接修改/etc/init.d/slapd这个启动脚本,将 -h 参数写死到start函数中。但总觉得这有点不够科学,应该有更加合理的配置参数或选项可以让我自定义才对;
于是完整看了一遍/etc/init.d/slapd的处理逻辑,发现它会从/etc/sysconfig/ldap文件来读取SLAPD_URLS这个变量的参数,并用来设置成启动时的-h参数;
于是直接将/etc/sysconfig/ldap中的SLAPD_URLS变量取消注释,并修改成了我需要的如下这样:
SLAPD_URLS="ldap://0.0.0.0:489/"
重启slapd服务器,发现除了我新定义的 0.0.0.0:489 有在正常监听以外,原本默认的 389 也有在监听中,如下:
从slapd进程的指令可以发现,是把自定义SLAPD_URLS的值附加在了原本的启动指令上,所以会将新的 port 和原本默认的 port 同时监听起来了;那么如何关闭和禁止监听 default 的 port 呢?
于是继续查看启动脚本,在start函数中发现了如下配置启动参数的代码:
harg="$SLAPD_URLS"
if test x$SLAPD_LDAP = xyes ; then
harg="$harg ldap:///"
fi
if test x$SLAPD_LDAPS = xyes ; then
harg="$harg ldaps:///"
fi
if test x$SLAPD_LDAPI = xyes ; then
harg="$harg ldapi:///"
fi
所以在生成启动参数时,脚本会做三个判断,分别是检查SLAPD_LDAP,SLAPD_LDAPS,SLAPD_LDAPI这三个选项是否为yes如果是的话,就会在我们自己定义的 SLAPD_URLS 后面附加默认的监听参数,所以最后拼接出来的启动参数 -h后面就会同时包含自定义的端口和系统默认的端口;
这三个系统默认的监听选项开关同样也是定义在 /etc/sysconfig/ldap配置文件中;将其默认的 yes修改为no,修改后如下:
SLAPD_LDAP=no //禁用默认的389
SLAPD_LDAPI=no //禁用默认的IPC(Unix-domain socket)
SLAPD_LDAPS=no //禁用默认的ldaps 636
SLAPD_URLS="ldap://0.0.0.0:489/"
之后再重启服务,终于按我的要求实现仅监听自定义的端口了;
总结
修改CentOS yum 安装的 openldap (slapd) 服务默认监听端口的方法如下:
- 将
/etc/sysconfig/ldap文件中的SLAPD_LDAP,SLAPD_LDAPI,SLAPD_LDAPS三个选项设置为no - 在
/etc/sysconfig/ldap文件中启用,或者是添加一行SLAPD_URLS=的设置定义自己想要绑定监听的地址和端口 - 重启
slapd服务