Samba双配置文件(config file参数)失效:无法实现不同认证级别的共享
看起来你碰到的核心问题是Samba的config file = /etc/samba/mfg/smb.conf.%m没有按预期根据客户端主机名加载对应配置,导致NT1兼容的旧系统共享和SMBv3+AD认证的共享没法同时正常工作——这确实是%m变量使用时常见的坑点,结合你提供的日志和配置,咱们一步步拆解解决:
核心问题定位:%m变量的匹配逻辑
%m在Samba里代表客户端发送的NETBIOS主机名,但如果客户端用IP直接访问、NETBIOS解析失败,或者客户端本身不发送NETBIOS名称,Samba就会用客户端的IP地址作为%m的值。这时候你的服务器上没有对应IP命名的配置文件(比如smb.conf.192.168.x.x),就会 fallback 到主配置,自然没法加载你准备好的AD认证配置,这也是你日志里出现IP相关报错的原因。
另外,主配置里的server min protocol = NT1会被所有子配置继承(除非子配置明确覆盖),而AD认证通常需要SMB2及以上的协议版本,这也会导致AD客户端的会话建立失败(对应你日志里的NT_STATUS_UNSUCCESSFUL)。
针对性解决方案
1. 修复%m的匹配问题(二选一即可)
- 方案A:改用IP匹配配置文件
如果客户端没法用主机名访问,直接把AD客户端的IP作为配置文件名,比如客户端IP是192.168.1.100,就把你的smb.conf.server改名为smb.conf.192.168.1.100,这样不管客户端发不发主机名,Samba都能匹配到对应的配置。 - 方案B:确保NETBIOS解析正常
在Samba服务器的/etc/hosts里添加客户端的IP和主机名映射,比如:
同时在主配置里开启WINS支持(如果你的环境没有WINS服务器):192.168.1.100 SERVER[global] wins support = yes netbios name = SAMBA_SERVER
2. 隔离主配置和子配置的协议参数
把主配置里的server min protocol = NT1删掉,让每个子配置自己定义适合的协议版本,避免参数冲突:
- 旧系统的子配置(比如
smb.conf.LEGACY_CLIENT)里添加:[global] server min protocol = NT1 security = user # 旧系统常用的认证方式,按需调整 - AD认证的子配置里添加:
[global] server min protocol = SMB3 # 强制使用SMBv3,兼容AD认证 client signing = required # 解开你注释的这行,AD环境通常需要签名 kerberos method = secrets and keytab # 同样解开注释,确保Kerberos认证正常
3. 验证配置加载情况
调整后主配置应该是这样:
[global] config file = /etc/samba/mfg/smb.conf.%m workgroup = WORKGROUP log level = 5
然后分别用旧系统和AD客户端访问,查看Samba日志(/var/log/samba/log.%m),确认日志开头是否显示loaded config file from /etc/samba/mfg/smb.conf.xxx,如果显示对应子配置的路径,说明加载成功。
额外排查点
如果还是出现认证失败,检查AD子配置的以下参数:
- 确认Samba服务器已经加入域(
net ads join -U administrator) - 验证
krb5.conf的域配置正确 - 确保AD客户端的DNS指向域控制器,且能解析
MYMASKEDDC01.mydomain.local
备注:内容来源于stack exchange,提问作者Lee Fisher

