Python连接Active Directory授权阶段耗时过长问题排查
问题描述
我使用ldap库连接Active Directory,代码如下:
import logging import ldap logging.basicConfig( level=logging.DEBUG, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' ) logger = logging.getLogger('my_logger') try: ldap_connect = ldap.initialize(host) ldap_connect.protocol_version = ldap.VERSION3 ldap_connect.set_option(ldap.OPT_REFERRALS, 0) logger.info('successful connection') ldap_connect.unbind() except Exception as e: logger.error(f'Error: {str(e)}') try: ldap_connect.simple_bind_s(user, password) logger.info('successful bind LDAP') except ldap.INVALID_CREDENTIALS as e: logger.warning('Error bind') except Exception as e: logger.error(f'Error: {str(e)}')
连接初始化快速成功,但在授权阶段(simple_bind_s)出现卡顿,耗时约15分钟,而正常应该在1分钟内完成。
之后我尝试了ldap3库,代码如下:
import json from ldap3 import Server, Connection, ALL, NTLM class LDAPapi: def __init__(self, server: str, login: str, password :str , domain: str = "passport"): self.server = Server('server', get_info=ALL) self.conn = Connection(server, user=f'{domain}\\{login}', password=password, authentication=NTLM)
同样出现问题,执行Connection(...)代码行时耗时10-15分钟。
以下是trace_level=2的日志信息:
((17, 3), {}) => result: None *** <ldap.ldapobject.SimpleLDAPObject object at 0x7> ldap://<host>- SimpleLDAPObject.set_option ((17, 3), {}) => result: None *** <ldap.ldapobject.SimpleLDAPObject object at 0x7> ldap://<host>- SimpleLDAPObject.set_option ((8, 0), {}) => result: None *** <ldap.ldapobject.SimpleLDAPObject object at 0x7> ldap://<host>- SimpleLDAPObject.simple_bind ((<login>, <password>, None, None), {}) => result: 1 *** <ldap.ldapobject.SimpleLDAPObject object at 0x7> ldap://<host>- SimpleLDAPObject.result4 ((1, 1, -1, 0, 0, 0), {}) => result: (97, [], 1, []) <ldap.ldapobject.SimpleLDAPObject object at 0x7> *** <ldap.ldapobject.SimpleLDAPObject object at 0x7> ldap://<host>- SimpleLDAPObject.unbind_ext ((None, None), {}) => result: None
可能的原因及排查方向
- DNS解析异常:Active Directory依赖DNS定位域控制器,若客户端DNS配置错误、域控制器DNS记录失效,会导致绑定过程中长时间等待DNS响应。可尝试用域控制器IP替代域名连接,验证是否解决卡顿。
- 网络链路/防火墙限制:客户端到域控制器的网络存在路由延迟,或防火墙对LDAP/NTLM流量做深层检查(如内容过滤、IDS/IPS规则),导致数据包处理缓慢。用
ping测试连通性,telnet测试389(LDAP)、636(LDAPS)端口响应速度,同时确认防火墙未过度拦截LDAP流量。 - 域控制器负载过高:目标域控制器CPU、内存或磁盘IO占用过高,无法及时处理绑定请求。联系AD管理员查看域控制器性能日志,确认是否存在资源瓶颈。
- NTLM认证回退延迟:使用NTLM认证时,若Kerberos认证失败会回退到NTLM,若配置不当这个回退过程会触发超时延迟。可尝试强制使用Kerberos认证,或检查客户端Kerberos配置(如
krb5.conf)是否正确。 - LDAP超时配置缺失:当前代码未设置网络超时选项,可尝试添加:
强制限制超时时间,观察是否触发超时错误,帮助定位问题根源。ldap_connect.set_option(ldap.OPT_NETWORK_TIMEOUT, 30) ldap_connect.set_option(ldap.OPT_TIMEOUT, 30) - 底层LDAP库兼容性问题:
ldap或ldap3依赖的底层客户端库(如OpenLDAP)版本过旧,存在性能或兼容性bug。尝试更新相关库到最新稳定版本后再测试。
内容的提问来源于stack exchange,提问作者Username18
相关产品推荐
相关产品推荐

