最近项目中,需要支持老掉牙的设备的DNC功能。该设备通过samba服务器,访问网关的文件夹,实现DNC功能。在网关中(该网关使用debian系统)安装完samba,并且配置好后,有意思的事情发生了:
1. 同事A和B的电脑都可以通过samba访问debian网关的文件夹,但是我的电脑就是不行。
2. 目标设备(也就是那个老的掉渣的设备),无法通过samba访问debian网关的文件夹。
3. 在另一个网关(ubuntu16的系统,后面简称u16,也安装了samba),目标设备可以通过samba访问u16网关的文件夹。
4. 我的电脑,安装了debian的虚拟机。虚拟机中安装了samba,电脑可以连接虚拟机中的samba。
这种情况下,只能先用wireshark先看一下通讯的过程
1. 我的电脑连接不上,抓包如下:
回复:
对应的,请求如下:
然后我的电脑的smb版本是1.0,可能是因为是家庭版,所以无法安装smb2
因此,我的电脑连接不上,应该是客户端和服务端,沟通的不匹配导致的。而同事A和B,都安装有smb的其它版本,因此,不存在这个问题。
2. 电脑可以连接虚拟机的samba
转包后发现,debian网关中碰到的不支持的dialects,在虚拟中不存在。网关盒子与虚拟机都是debian系统,为什么一个可以,另一个不行呢?首先看一下版本,结果发现debian网关中的版本是4.13,而虚拟中的则是4.9版本。然后再去看了一下apt下的源的设置,果然,,网关盒子中的源是阿里云的,而虚拟中的源则是163和清华的。
将debian网关盒子中的samba卸载,再更新源,再进行安装,ok,我的电脑也就可以连接上debian盒子了。
3. 目标设备无法连接debian盒子
在将debian的samba更新后,虽然我的电脑可以连接了,但是目标设备仍然不行。再次抓包,发现问题出在session setup andx request这个过程中。第一步negotiate后,samba返回给客户端的信息中,capabilities中,包含有Extended Security,为1。但是在建立会话的时候,客户端并没有进行NTLMSSP_NEGOTIATE(这个客户端太老了,而且不是传统的电脑,除了IP地址,我们无法对更多的属性进行配置),所以,在建立会话层的时候,被samba拒绝。
4. 目标设备可以连接u16盒子
经过抓包发现,negotiate的response中,samba服务就没有Extended Security
因此后续的会话,就不需要NTLMSSP,所以就没有问题。查看了一下,u16中samba服务是4.3版本。注意,这里security是user,
综上,如果目标设备要和debian盒子中的samba通讯,就需要让samba关闭这个所谓的Extended Security。去samba官网和其它地方找了一圈资料,说是修改smb.conf配置文件,主要就是修改client use spnego和client NTLMv2 auth这两个配置项。默认这两个都是yes。不过我测试过
client use spnego = no
client NTLMV2 auth = no
结果失败,仍然是要求SSP。
知乎上有工程师说配成:
client use spnego = yes
client NTLMV2 auth = no
不过很遗憾,也失败了。
最后这个问题,还是采取了简单粗暴的办法,将security设置为share。然后,就ok了。
不过,我个人觉得这不是一个好的解决办法。如果看官们有更好的办法,欢迎写在评论区。