我为一家提供网络管理软件解决方案的公司工作。解决方案的一部分是代理身份验证。我们软件中已经存在的一个遗留选项是配置代理以使用 NTLM 身份验证(以及其他可能的身份验证方案)。但是,目前该软件存在仅使用单个 Active Directory 服务器进行身份验证的限制,我接到了一项任务来克服这种限制。
这个想法是实现某种冗余,这样如果主 AD 服务器出现故障,我们的服务器会自动开始在后台针对辅助 AD 服务器进行身份验证,并且客户端仍然可以无缝地进行身份验证,或者至少可以进行身份验证。
服务器环境是经过修改的 Debian GNU/Linux,运行 Squid 4.13-VCS。在有效的 NTLM 身份验证方案中,Squid 使用 Samba 的工具 ntlm_auth 进行身份验证。Samba 版本为 4.10.5(来自 smbclient -V)。我们的 AD 测试服务器运行 Windows Server,我创建的测试服务器运行 Windows Server 2022。两个 AD 服务器都在同一个域中(我创建的测试服务器与较旧的测试服务器域同步)。
我做了一些研究,发现 ntlm_auth 似乎连接到 winbind,而 winbind 则保持与 AD 服务器的连接。我尝试在 smb.conf 中设置“密码服务器”参数,但当我运行“net ads join -U 'user%password'”时,它会忽略该参数,而且只有当我使用 -S 参数强制使用特定服务器时,它才会起作用。它似乎只适用于单个服务器参数,而且据我测试,winbind 似乎不够智能,无法检测到 AD 服务器已关闭并自动尝试另一个服务器。
我的 smb.conf 是,省略了公司特定的详细信息:
[global]
workgroup = domain
server string = SMB Server
password server = SRVAD002 SRVAD001
security = ads
realm = domain.local
interfaces = 172.30.46.200/255.255.0.0,192.168.10.116/255.255.255.0,192.168.10.246/255.255.255.0
bind interfaces only = yes
#DEFAULT: lm announce = auto
#lm announce = no
local master = no
os level = 10
domain master = no
preferred master = no
dns proxy = no
log level = 1
syslog = 0
syslog only = no
log file = /var/log/samba/samba.log
max log size = 0
winbind uid = 10000-20000
winbind gid = 30000-40000
winbind use default domain = Yes
winbind enum users = yes
winbind enum groups = yes
winbind separator = /
#winbind separator = +
#DEFAULT: winbind cache time = 15
winbind cache time = 60
#DEFAULT winbind max clients = 200
winbind max clients = 600
winbind refresh tickets = true
#ntlm auth = Yes
#min protocol = NT1
#client NTLMv2 auth = Yes
socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
getwd cache = yes
我还尝试设置直接指向 AD 服务器的接口参数,但无济于事。
那么,有没有办法配置 samba/winbind/ntlm_auth 来完成这种冗余设置?也许是一些 AD 连接池之类的?
答案1
在 Active Directory 中,这是消费者的责任。
您可以像每个 Windows 端点主机一样操作。向 rootdse 查询域控制器列表,然后在所需端口 (135,389,3268) 上执行网络连接测试,并根据 SRV 记录选择离您最近的域控制器。或者您可以像其他一些企业供应商一样配置两个域控制器而不是一个。如果主服务器已关闭,请尝试在另一台服务器上执行操作。