在Windows电脑上使用非标准端口的SMB服务
调试了3天才成功添加映射网络驱动器。主要问题2个:
- 端口转发要先停止lanmanserver服务,否则445端口被占用,端口转发失败。
- window默认使用NTLMv1协议来登录认证,而该协议被samba服务禁止的。
解决非标准端口转为标准端口办法:
- 打开cmd执行下面命令,禁用 SMB 服务器组件
sc config lanmanserver start= disabled
- 重启电脑后再配置端口转发
# 重启后验证445端口是否被占用
netstat -ano | findstr :445
未被占用则添加端口转发规则:
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=445 connectaddress=10.xxx.xxx.xxx connectport=1445
- 配置成功后检查
# 查看当前的端口转发规则
netsh interface portproxy show all
# 验证445端口
netstat -ano | findstr :445
以上非标准端口则转为本地的标准端口445了。
解决使用NTLMv1协议认证失败的办法:
问题诊断:从日志中读到的关键信息
日志明确指出了两个连续的、致命的问题:
-
ntlm_password_check: NTLMv1 passwords NOT PERMITTED for user admin1
- 含义:Samba服务器明确禁止使用不安全的NTLMv1协议进行身份验证。
-
ntlm_password_check: NEITHER LanMan nor NT password supplied for user admin1
- 含义:由于NTLMv1被禁止,而客户端(您的Windows)可能只尝试了NTLMv1或发送的凭据格式不正确,导致服务器没有收到任何有效的密码信息。
结论:这不是您的密码错误,而是Windows客户端试图使用一种被Samba服务器安全策略禁止的、过时且不安全的认证协议(NTLMv1)来登录。
解决方案:修改客户端或服务器端的认证策略
有两种解决路径:
方案一:在Windows客户端上强制使用更安全的协议(推荐)
这是更安全、更标准的做法。我们需要修改Windows的本地安全策略,强制其使用NTLMv2。
- 在Windows上按
Win + R
,输入secpol.msc
打开“本地安全策略”。 - 依次展开 “安全设置” -> “本地策略” -> “安全选项”。
- 在右侧找到策略:“网络安全: LAN管理器身份验证级别”。
- 双击打开它。
- 在设置中,选择 “仅发送 NTLMv2 响应。拒绝 LM 和 NTLM”。
- 点击“确定”。
- 非常重要:在命令提示符(管理员)中执行
gpupdate /force
来立即刷新策略。 - 重启Windows电脑。
方案二:在Samba服务器上降低安全要求(不推荐,仅作测试)
如果方案一不奏效,或者您想快速验证问题,可以临时修改Samba配置,允许不安全的NTLMv1。请注意,这会降低安全性。
在Samba容器的启动参数中,添加以下全局配置:
-g "ntlm auth = yes"
完整的Docker运行命令示例会变成:
docker run -d ... dperson/samba \-g "log level = 3" \-g "ntlm auth = yes" \ # 新增这行,允许NTLMv1-s "Data;/data;yes;no;yes;all;admin1;;" \-u "admin1;your_password"
重要提醒:方案二只是用于确认问题的“调试开关”。一旦确认问题所在,应优先采用方案一,并移除此降低安全性的设置。
为什么会出现这个问题?
- Samba服务器(现代版本):出于安全考虑,默认禁止了脆弱的NTLMv1协议。
- Windows客户端:某些版本的Windows,或者在特定的组策略配置下,可能会在协议协商时首先尝试使用较老的NTLMv1。
- 结果:当客户端和服务器支持的认证协议不匹配时,就会导致登录失败。