我有一个 NAS 机箱(Noontec N5),我只能通过 Web 界面(即 no ssh)与之交互。这允许我公开 SMB 服务并添加用户,无论是否有密码。
我可以匿名登录,例如。有smbclient -L 10.1.0.25 -UGuest和没有密码:
~ • smbclient -L 10.1.0.25 -Uguest
Enter guest's password:
Anonymous login successful
Domain=[R] OS=[R] Server=[R]
Sharename Type Comment
--------- ---- -------
PUBLIC Disk
IPC$ IPC
Anonymous login successful
Domain=[R] OS=[R] Server=[R]
Server Comment
--------- -------
Workgroup Master
--------- -------
Run Code Online (Sandbox Code Playgroud)
但我无法使用密码登录:
~ • smbclient -L 10.1.0.25 -Ujason
Enter jason's password:
session setup failed: NT_STATUS_LOGON_FAILURE
Run Code Online (Sandbox Code Playgroud)
如果我删除密码并在没有密码的情况下登录(与“访客”登录相同),则相同的用户名有效。
我该如何进一步诊断或修复它?
用于设备的工作组是SUNNYDALE:
~ • nmblookup -A 10.1.0.25 | grep GROUP
SUNNYDALE <00> - <GROUP> B <ACTIVE>
Run Code Online (Sandbox Code Playgroud)
将此添加到smbclient命令没有帮助(它现在也在 中/etc/samba/smb.conf):
~ • smbclient -L 10.1.0.25 -W SUNNYDALE -U jason
Enter jason's password:
session setup failed: NT_STATUS_LOGON_FAILURE
Run Code Online (Sandbox Code Playgroud)
我找到了一台 OS X 和 Windows XP 机器来测试,它们都可以很好地连接。这似乎是一些未知的魔法smbclient(这并不排除它不在官方 SMB 协议中的可能性)。
我还尝试使用mount.cifs,sec=以及vers=手册页中列出的各种不同类型的选项和选项,但没有成功。
我使用 Wireshark 来捕获 Windows XP 测试虚拟机和 NAS 之间的数据包。看起来 XP 会反复尝试各种域名和安全协议的组合,直到成功为止。最终(成功)尝试似乎SMB用于域名和NTLMSSP身份验证。
但是,使用smbclient和尝试这些设置mount.cifs没有用。
由于问题是关于诊断,而不是最终解决方案,我将描述我尝试过的使我更接近解决方案的事情(问题中的更新总结了大部分内容)。
在阅读下面的命令输出时,注意我的 NAS 是调用的giles,域名是SUNNYDALE. 我的本地用户名,盒子上的是jason. 我abcd为此设置了一个测试密码。
问题是 NAS 驱动器似乎只有在NTLM从 Ubuntu 使用身份验证时才能工作;大多数实用程序NTLMv2默认使用或其某些变体。我被我使用的初始工具并没有让我控制这一事实而受阻。
大多数 NAS 机箱在一段时间不活动后都会让驱动器进入睡眠状态。通常这是一件好事,但在诊断过程中,根据所使用的工具,它可能会导致名称解析或身份验证的虚假错误。
在调试时禁用空闲时休眠功能,或在浏览器中保持 Web 界面打开并定期刷新以确保它已启动。完成后记得重新启用它!
首先确保您可以解析NAS。使用nmblookup:
~ • nmblookup giles
192.168.1.114 giles<00>
Run Code Online (Sandbox Code Playgroud)
如果您没有看到它,您可能需要安装该libnss-winbind软件包(即 with sudo apt-get install libnss-winbind)并编辑/etc/nsswitch.conf. 查找以以下内容开头的行hosts:并放置在wins某处:
hosts: files mdns4_minimal [NOTFOUND=return] dns wins mdns4
Run Code Online (Sandbox Code Playgroud)
(请注意,我不是这些设置的专家;记录之前的线路,以防您以后遇到麻烦。)
我发现这smbclient并没有解决我的问题,因为它不允许您微调身份验证设置。mount.cifs但是,该实用程序确实如此。还有一些其他细节可以让您更好地控制,例如。使用的 SMB 协议版本。此终端会话展示了如何尝试不同的域和身份验证方法:
~ • mkdir temp
~ • sudo mount.cifs //giles/jason ./temp -o username=jason,password=abcd,domain=SUNNYDALE
mount error(13): Permission denied
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
~ • sudo mount.cifs //giles/jason ./temp -o username=jason,password=abcd,domain=SUNNYDALE,sec=ntlmv2
mount error(13): Permission denied
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
~ • sudo mount.cifs //giles/jason ./temp -o username=jason,password=abcd,domain=SUNNYDALE,sec=ntlm
~ •
Run Code Online (Sandbox Code Playgroud)
(最后一条命令成功了。)
请注意,您可能会从中得到一些虚假的失败mount.cifs,例如:
~ • sudo mount.cifs //giles/jason ./temp -o username=jason,password=abcd,domain=SMB
mount error: could not resolve address for giles: Unknown error
~ • sudo mount.cifs //giles/jason ./temp -o username=jason,password=abcd,domain=SMB
mount error(13): Permission denied
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
Run Code Online (Sandbox Code Playgroud)
有时我什至在第一次尝试时遇到身份验证错误,但下一次却没有。尝试每个命令两到三遍以确保。
调试 SMB 问题时要小心,这些问题您不依赖/etc/samba/smb.conf或mount.cifs(或您使用的任何工具)中的默认值。特别是工作组(行开始workgroup =)和身份验证方法(client ntlm auth = ...例如,不同协议的多行)。
请注意,在mount.cifs上面的终端会话中,我总是在更改身份验证方法时指定域。要科学!每次只改变一件事。如果它变得乏味,请编写脚本!
正如Ben Grimm 指出的那样,有时这些框会忽略您给它们的工作组。尝试以下方法之一:
这是一个基本的健全性检查:如果您可以从 Windows 或 Mac 机器连接,那么至少应该可以(即使困难)从 Ubuntu 连接。如果您无法从任何其他机器连接,请返回开始并尝试配置,直到可以为止。
就我而言,一开始我没有非 Linux 机器可以尝试。最终我找到了一个旧的 XP VM(它是多年前一台机器的备份)。我意识到我可以很好地连接到 NAS!这让我想到了下一个策略……
Wireshark 是一个程序,用于检查和转储通过计算机接口的数据包。一旦我意识到我的 XP VM 可以连接,就需要弄清楚那台机器在做什么而我的 Ubuntu 机器没有。
Wireshark 只监视运行它的计算机上的接口。这意味着您必须在位于测试机器和 NAS 盒之间的机器上运行它。我不会在这里给出关于路由等的完整教程,但它对我有用,因为我在托管 XP VM 的机器上运行它,所以eth0就 Wireshark 而言,所有数据包都在通过。
就我而言,XP VM 有 IP192.168.1.111而 NAS 有 IP 192.168.1.114。所以我在 Wireshark 中使用的捕获过滤器是:
(host 192.168.1.111) and (host 192.168.1.114)
Run Code Online (Sandbox Code Playgroud)
然后我:
\\giles\jason并点击enter在这一点上,我通过使用Edit > Find packet...和选择“按字符串”选项查看数据包。我只是搜索了我的用户名并寻找了第一次成功的身份验证尝试。你可以看到这是未成功通过查找STATUS_LOGON_FAILURE后来了几包。
令我惊讶的是 XP 执行的绝对数量的尝试。它使用给定的用户名和域名,有时使用WORKGROUP或者SMB甚至是客户端名称作为域名,并且它试图多种认证方法。
有趣的是,我什至从未确定成功的尝试!在这一点上,我意识到smbclient不会有帮助,并返回mount.cifs并更科学地使用它。
最后,在找出问题所在并通过 成功访问共享后mount.cifs,我仍然无法连接 Nautilus。这里的问题是 Nautilus 使用 GVFS 挂载 SMB 共享,GVFSNTLMv2默认使用。
您可以通过编辑/etc/samba/smb.conf和添加在系统范围内更改此设置:
client ntlm auth = yes
client ntlmv2 auth = no
Run Code Online (Sandbox Code Playgroud)
我在workgroup = ...设置下方添加了这个。但是,这将强制更改 GVFS 尝试挂载的所有 SMB 共享,这可能会使其他共享无法访问,因此请注意。
(出于某种原因mount.cifs抱怨第一行,但testparm没有。也许它可以被删除,但我不是要尝试的游戏。)