*************SMB服务端代码实现****************************************************
github:https://github.com/FileSysOrg/jfileserver
代码官方配置文档:https://filesys.org/wiki/index.php/Configuring_JFileServer
*************SMB协议解析************************************************************
-------------------------------------------------------------------------
| TCP头 | NETBIOS头 | SMB头 | SMB COMMAND头 | 数据 |
-------------------------------------------------------------------------
1.TCP Header的长度为20字节
2.NETBIOS Header的长度为4字节(2-4字节定义smb包长度)
3.SMB Header的长度为32字节(第5个字节定义smb命令类型)
4.SMB COMMAND Header的长度不固定
*************SMB2协议过程************************************************************
1. Negotiate Protocol Request
在用户输入“服务器名”之后,首先要做的就是把服务器名解析为IP,可以通过DNS还是NetBIOS解析。
得到IP地址后,客户端就向服务器发送第一个SMB请求:“Negotiate Protocol Request”。这个请求包含了客户端所支持的各种 SMB Dialect。
2. Negotiate Protocol Response
服务器收到该请求后,选择一个它支持的最新版本(比如NT LM 0.12),再通过“Negotiate Protocol Response”回复给客户端
3. Session Setup Request
Negotiation 结束之后,客户端请求和服务器建立一个session,在客户端发送的Session Setup Request里,包含了身份验证请求(如Kerberos的AP_REQ)。
4. Session Setup Response
服务器回复Session Setup Response,包含了验证结果(如Kerberos的AP_REP)。
5. Tree Connect Request
Session Setup通过后,客户端就成功的连上了服务器,客户端发送的Tree Connect Request来访问具体的共享。
如果前面没有指定共享名(服务器名),客户端访问的是命名管道$IPC,如果指定了服务器共享名,那么这儿就是访问共享名的部分了。
6. Tree Connect Response
服务器在检查过用户对该路径的权限后,回复Tree Connect Response。
检查用户权限是这样进行的:服务器从Session Setup Request中已经得到用户所属的组,再通过和该路径上的ACL对比,即可得到用户权限。至此,用户就进入了共享文件夹。
*************参考链接************************************************************
SMB2数据包:https://wiki.wireshark.org/SMB2
SMB协议详解与SMB命令:https://blog.csdn.net/qq_33336155/article/details/53307308