在实际运维中,Windows无法连接Linux Samba共享的情况非常常见。大多数问题并非配置错误,而是基础组件未就绪——smbd未启动、nmbd被防火墙拦截、或smbpasswd指定的用户未添加至系统。这三项缺一不可,任何一个遗漏都足以让前面的配置前功尽弃。

确保 smbd 和 nmbd 服务同时处于 active (running) 状态
不少用户只知道启动smbd,却忽略了nmbd。如果Windows的“网络”中看不到Linux主机名,十有八九是nmbd没有正常运行,NetBIOS广播没有正确发送。
- 检查两项服务状态很简单:运行
systemctl status smbd nmbd,必须同时显示active (running)才算正常。 - 想一次性完成启用并启动:
sudo systemctl enable --now smbd nmbd - 如果
nmbd报错“Address already in use”,通常是端口137或138被占用。先用sudo ss -tuln | grep ':13[78]'排查占用进程。 - 另一个常见陷阱:
nmbd对主机名有要求,不能包含下划线。例如nas_v2这类名称会导致失败。使用hostname确认当前主机名,必要时修改/etc/hostname,然后执行sudo systemctl restart systemd-hostnamed让变更生效。
smb.conf 的 global 段缺少这三项,Windows 无法识别你的共享
只专心编写共享段远远不够。[global]部分有三个参数缺一不可。缺少任意一个,Windows连接时都会弹出0x80070035错误,或者提示“找不到网络路径”。
workgroup = WORKGROUP:必须与Windows客户端的工作组名称保持一致。默认值为WORKGROUP,切勿误写成HOME或添加多余空格。security = user:这是目前最稳定可靠的认证方式。注意,security = share在Samba 4.12以后版本已废弃,Windows 10和Windows 11基本无法连接。map to guest = bad user:此设置很实用,密码输入错误不会频繁弹窗报错,而是自动降级为guest用户访问。当然,这需要共享段中配合guest ok = yes才能生效。- 建议额外添加
unixcharset = UTF-8和dos charset = CP936,可避免中文文件名显示乱码,减少后续麻烦。
valid users 和目录权限必须双重满足
很多人误以为Samba认证通过就万事大吉,事实并非如此。Samba能确认身份,并不等于就能对共享目录进行读写。系统层面的文件权限与Samba层面的访问控制是两套独立逻辑,必须同时放行才有效。
valid users = @sambashare:含义是只有sambashare用户组的成员才能访问。因此需要先创建组:sudo groupadd sambashare,再将用户加入:sudo usermod -aG sambashare alice。- 共享目录的所属组也必须改为
sambashare:sudo chgrp sambashare /srv/samba/shared - 权限设置方面,推荐添加SGID位,确保新创建的文件自动继承所属组:
sudo chmod 2775 /srv/samba/shared。不要图省事直接设为777,既不安全,在SELinux环境下还可能被拒绝访问。 - 如果系统启用了SELinux,还需要为目录设置上下文标签:先执行
sudo semanage fcontext -a -t samba_share_t "/srv/samba/shared(/.*)?",再运行sudo restorecon -Rv /srv/samba/shared使配置生效。
防火墙不放行 137–139/445(TCP+UDP),Windows 始终无法连接
这一步并非可选,而是必须完成。Samba依赖四个端口,任何一个被防火墙拦截,表现出的症状都不相同:
- UDP 137/138:影响Windows“网络”中能否发现Linux主机名,这项工作由
nmbd完成。 - TCP/UDP 445:所有现代SMBv2/v3连接都走此通道,Windows 10和Windows 11默认只使用445端口。
- Ubuntu/Debian系统使用UFW的话:
sudo ufw allow 137:139/tcp && sudo ufw allow 445/tcp && sudo ufw allow 137:139/udp && sudo ufw allow 445/udp - RHEL/CentOS/Rocky系统使用firewalld的话,直接执行
sudo firewall-cmd --permanent --add-service=samba,比手动开放四个端口更可靠。 - 切勿轻信“先关掉防火墙试试”的建议。临时关闭防火墙可用于定位问题,但生产环境必须精准放行所需端口,否则等于将系统暴露在风险中。
最后提醒一个极易被忽略的组合问题:nmbd与UDP端口。很多时候服务状态显示正常,TCP 445也能连通,用户也已添加,但Windows“网络”中依然找不到那台Linux机器。此时无需纠结smb.conf的配置,优先检查 systemctl status nmbd 和 firewall-cmd --list-ports | grep 137 的输出,问题往往就出在这里。
