HAProxy代理LDAPS查询服务时测试绑定失败问题排查求助
核心问题定位
你当前配置的ldaps_frontend工作在TCP模式,而hdr(host)是HTTP协议专属的请求头字段,TCP模式下HAProxy无法解析到该字段,导致你配置的两个域名ACL全部匹配失败,且前端没有配置default_backend,请求直接被丢弃,所以LDP工具返回ldap_bind_s() failed: Server Down错误。
另外你配置中还存在后端名称不匹配的问题:ldaps_frontend中写的是use_backend e*** if host_***,但下方对应后端的定义是backend ***,名称不一致也会导致匹配不到后端。
排查验证步骤
- 查看HAProxy运行日志,确认
ldaps_frontend收到请求后是否因为无匹配后端直接断开:
正常会看到请求的会话日志里没有匹配到后端的标记。tail -f /var/log/haproxy.log | grep ldaps_frontend - 临时给
ldaps_frontend加一个默认后端测试:
把***tech.com对应的后端设为默认,加一行default_backend ***到ldaps_frontend配置末尾,重启HAProxy后用LDP测试,看绑定是否成功,如果成功即可确认是ACL匹配和后端名称的问题。
修正方案
LDAPS是基于TCP的上层协议,没有HTTP Host头,要实现基于域名的多域名分发,需要用**SNI(Server Name Indication)**匹配,HAProxy在TCP模式下可以通过SSL的SNI字段识别客户端请求的域名,修改你的ldaps_frontend配置即可:
frontend ldaps_frontend mode tcp log global bind *:636 ssl crt /etc/ssl/private/hap/ description LDAPS Service option tcplog option logasap option socket-stats option tcpka timeout client 60s # 替换原有的hdr(host) ACL,改用SNI匹配 acl host_j ssl_fc_sni -i j.com acl host_*** ssl_fc_sni -i ***tech.com use_backend j_ldaps if host_j # 修正后端名称,和下方定义的backend名称保持一致 use_backend *** if host_*** # 建议加默认后端兜底,避免异常请求直接被丢弃 default_backend ***
补充注意:你存放证书的/etc/ssl/private/hap/目录下需要同时包含两个域名的有效证书,且证书需要覆盖ldaps.***tech.com的主体备用名称(SAN),Windows的LDP.exe默认支持SNI,只要系统版本不是Windows Server 2003及以下即可正常识别。
其他可选排查点
如果修改后依然有问题,可以按以下步骤排查:
- 确认HAProxy到后端域控制器的636端口连通性:
看是否能正常建立SSL连接,拿到域控的LDAPS证书。openssl s_client -connect 后端域控IP:636 -showcerts - 检查后端健康检查状态:访问HAProxy的统计页面
http://你的HAProxy地址:8404/haproxy?stats,看两个LDAPS后端的服务器状态是否为绿色UP状态,如果是红色DOWN状态,说明HAProxy到后端的LDAPS健康检查失败,需要排查后端LDAPS服务本身是否正常。
内容的提问来源于stack exchange,提问作者Skeer
相关产品推荐
相关产品推荐

