目的:总结Linux应用进程开发过程中碰到棘手问题时的分析方法及解决过程
背景:项目中的samba经过裁减后使用,导致出现以下一系列问题,之前对samba进程源码也是一无所知
问题:
1.mac系统不能访问samba,后来发现密码大写就能访问,涉及NTLM和LM口令验证
2.改成user模式后,失去权限控制
3.改好权限控制后,mac中点击无权限目录没反应,导致所有目录都无法访问
4.mac客户端开始连接server的时候速度很慢难以接受
5.同一个PC上多个username无法访问samba
分析:
问题1———
samba采用share控制模式并加入权限控制,在windows系统中访问时,点击每个目录才要求输入用户名和密码,工作也正常。在mac系统中连接samba时,首先就要求输入用户名和密码,但是始终连接不上去。
碰到这个问题首先在samba进程中加入打印代码进行跟踪,运行时发现console全无打印,没有打印怎么跟踪,又如何调试。还没开始就好像要打住了,没办法只能从main开始密密麻麻的加打印,再运行终于看到打印并终止于某个地方,这才发现该处将打印设备的文件描述符close掉了,打开即可。
回来定位问题,samba源码文件太多,找到auth目录及其他相关目录下的可疑权限验证文件,依次加打印,经过多次测试发现在 函数password_ok处总是密码验证失败导致mac系统无法登录,而win7却正常通过密码验证。接着去了解samba兼容的 LanManager和Windows NT口令加密相关知识,了解samba本身的密码验证原理。(插述:client端连接server时首先会进行一个简单的协商交互,server会产生一个随机值返回给client;client接着用密码的散列口令值作一些处理形成密钥,对server返回的随机值进行加密,再发送到server端,server端用本地保存的散列口令值和随机值作同样的计算,将结果和client发送的响应值比较,此即为权限验证过程)发现mac系统访问输入密码时,碰到字母一律输入大写居然能验证通过,可惜还是没找到原因。
抓包比对分析,mac通过samba访问项目中的代码服务器都能正常工作。如何快速方便抓mac的包呢,将pc和mac机器一起连到交换机,再从交换机连接到开发板或运行samba的代码服务器。分析访问板子和服务器的数据包,基本也差不多,再细看,有个很重要的mode参数不一样,即权限控制模式security mode。
问题2、3———
于是将项目中的模式改为user模式进行测试,发现windows和mac都无法连接,跟踪代码发现进程中有一处代码系统调用函数调研了非法字符串导致进程异常。添加判断代码后继续测试,windows和mac都能正常连接,但是没有了权限控制,即无需用户名和密码就可以访问所有的目录,解决当前问题却又出现了新问题,总归有了一些进展,思路方向也大体明朗起来。又回到权限控制问题,继续抓包加打印跟踪代码并分析,在权限相关文件中加了权限控制代码,判断是否访问对应的目录,不是就终止并返回对应数据包信息,windows和mac测试有效果。但是,考验人的事情总是不会那么一帆风顺,权限控制问题解决好了,又出现新问题,如果在mac中访问了无权限的目录,会没有反应,还会导致也无法去访问所有目录,仍然继续加抓包分析,发现正常时client端会受到NT_STATUS_NOT_FOUND的数据包,又在相关文件中经过一番修改调试,找到相应代码添加判断是否是访问有权限目录,不是就返回带NT_STATUS_NOT_FOUND的数据包信息,这回都OK了。
问题4———
mac在首先连接server时(即协商过程结束后弹出输入用户名和密码窗口)会很慢差不多1、2分钟,这个问题自从改成user模式后就一直存在,也最无头绪。
依然是抓包对比分析,每次分析包的时候我都做了过滤只分析smb协议包,访问项目服务器的包和开发板的samba包都是一模一样,还是没头绪。求助别人帮我分析,果然受到启发,不要过滤smb协议包,对所有包进行分析,发现mac在做完协商之后会做一个AAAA(ipv6相关)dns查询本机域名,server没有回应reply会重复的查询多次,导致了速度很慢。继续做验证来确认这个结论,将开发板连到internet中,或将mac中dns地址设置为无效地址,再做client连接果然速度很快,基本可确认前面的结论。原来开始开发板没有连接到internet,在本地查不到dns结果。于是修改dns模块相关代码,终于解决问题。
此类问题是典型的linux应用服务问题,解决过程会碰到很多的问题,不断的进行抓包分析,确是不错的经验,值得总结。
附:samba客户端与server端通过一系列命令请求相应来交互,实现相关协议
问题5———
Forthe problem that when multiple users connect to fileserver(SAMBA).
Toconnect successfully using a different user on the same client on Mac, use thefollowing methods.
Input following format string on Server Address field when connect to server.
smb://second_username@ipaddrTo connect successfully using a different user on the same client on windows, useone of the following methods.
Method1
Disconnectany existing mappings to this network share on the same client before anotheruser connect to samba.
eg.net use \\10.1.1.1\test /del
Method2
Oneuser use \\servername\sharefolder and another use \\ipaddr\sharefolderon the same client.
eg. \\BudiiLite\test, \\10.1.1.1\test
在linux系统中mount -t cifs //192.168.10.85/test1 /var/test2 -osec=ntlmv2,domain=MYDOMAIN,username=test1,password=test1可以映射samba文件共享
版权声明:本文为wuruixn原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。