smb共享不直接提供定期清理僵尸连接的配置,需通过windows的sesstimeout、linux samba的deadtime/keepalive及系统tcp参数协同实现。
smb共享本身不直接提供“定期清理僵尸连接”的配置项,因为smb协议层(如windows server的smb服务或linux的samba)并不像数据库那样内置连接心跳探测与超时驱逐逻辑。但僵尸连接(即客户端异常断开后,服务端仍维持的空闲tcp连接或未释放的会话)确实会发生,尤其在移动设备休眠、网络闪断、程序崩溃等场景下。这类连接会占用系统资源(如文件句柄、内存、smb会话数),长期积累可能影响并发能力。
真正起作用的是底层操作系统TCP栈、SMB服务自身的会话超时策略,以及配套服务(如Windows的LanmanServer或Samba的smbd)的配置。下面从三个关键层面说明如何有效控制和清理僵尸连接:
Windows SMB服务器端:调整会话与空闲超时参数
Windows通过LanmanServer服务管理SMB会话,其超时行为由注册表控制,需手动配置:
- 打开注册表编辑器(
regedit),定位到:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters - 新建或修改以下DWORD值(单位:秒):
•SessTimeout:客户端空闲多少秒后断开会话(默认约600秒,即10分钟)
•NullSessionPipes和NullSessionShares:仅影响匿名会话,非主要路径
•AutoShareWks/AutoShareServer:与共享自动创建有关,不涉及清理 - 修改后重启LanmanServer服务或重启系统生效
注意:
SessTimeout对SMB 2/3有效;SMB 1因协议缺陷难以可靠清理,应禁用。
Linux Samba服务器端:依赖smbd的keepalive与timeout机制
Samba通过smb.conf中的全局参数实现连接保活与超时控制:
- 在
[global]段添加或确认以下配置:deadtime = 15 # 空闲15分钟后关闭SMB会话(单位:分钟) keepalive = 30 # 每30秒向客户端发TCP keepalive探针(单位:秒) socket options = TCP_NODELAY IPTOS_LOWDELAY SO_KEEPALIVE
-
deadtime是最直接的“清理开关”,它基于smbd自身检测空闲时间,不依赖TCP层,推荐设为10–30分钟 -
keepalive需配合内核TCP参数(如net.ipv4.tcp_keepalive_time)才能生效,否则可能被中间防火墙中断
补充:若客户端是Windows,还需确保其TCP keepalive启用(默认已开),否则Samba探针收不到响应,deadtime仍可兜底。
网络与系统级协同:避免TCP连接僵死
即使SMB层配置得当,中间网络设备(如NAT网关、企业防火墙)常静默丢弃长时间空闲的TCP连接,导致服务端无法感知断连:
- 在Linux服务器上,调优内核TCP参数(临时生效示例):
sysctl -w net.ipv4.tcp_keepalive_time=600 # 首次探测前空闲时间(秒) sysctl -w net.ipv4.tcp_keepalive_intvl=60 # 探测间隔(秒) sysctl -w net.ipv4.tcp_keepalive_probes=3 # 失败后重试次数
- Windows服务器可通过PowerShell设置对应TCP参数(需管理员权限):
Set-NetTCPSetting -SettingName InternetCustom -InitialRtoMs 1000 -MinRtoMs 300
这些配置共同构成一个分层防御:TCP keepalive负责探测链路层存活,Samba或LanmanServer的deadtime/SessTimeout负责应用层会话回收,最终实现对僵尸连接的主动识别与清理。











