windows访问不到linux共享目录,90%是smbd/nmbd未运行或防火墙拦截445等端口;须检查服务状态、启用网络发现、放行137-139/445端口、配置valid users与目录权限,并处理selinux/apparmor上下文。

Windows访问不到Linux的共享目录,90%的情况不是配置写错了,而是smbd根本没在跑,或者防火墙拦住了445端口。
确认smbd和nmbd服务已启用并运行
很多用户改完smb.conf就去Windows上试,结果弹“找不到网络路径”,第一反应是配置有问题——其实systemctl status smbd可能显示inactive (dead)。
必须执行:
-
sudo systemctl enable --now smbd nmbd(两个服务都要启,nmbd负责让Linux主机名出现在Windows“网络”里) -
sudo systemctl is-active smbd和sudo systemctl is-active nmbd都得返回active - 如果提示
Unit smbd.service not found,说明Samba根本没装:Ubuntu/Debian用sudo apt install samba,RHEL系用sudo dnf install samba
Windows连不上?先查网络发现和防火墙端口
Linux和Windows必须在同一子网(比如都是192.168.1.x),且Windows端要开“网络发现”和“文件和打印机共享”(控制面板 → 网络和共享中心 → 高级共享设置)。
Linux防火墙必须放行以下端口:
- TCP 139、445
- UDP 137、138、139、445
- Ubuntu用
sudo ufw allow 137:139/tcp、sudo ufw allow 445/tcp等逐条加;RHEL系用sudo firewall-cmd --permanent --add-port=445/tcp再--reload
别信“只开445就行”——老版本Windows(或某些嵌入式设备)仍依赖NetBIOS端口(137–139),关了就看不见主机名。
smb.conf里valid users和目录权限必须同时满足
Windows提示“拒绝访问”或“登录失败”,大概率是用户映射或文件系统权限断了一环。
三件事缺一不可:
- 系统用户必须已存在:
sudo useradd -M -G sambashare alice(-M不建home目录,轻量) - Samba密码单独设:
sudo smbpasswd -a alice(注意:不是passwd,也不是usermod) - 共享目录权限要放开:
sudo chgrp sambashare /srv/samba/shared+sudo chmod 2775 /srv/samba/shared(2是SGID,确保新文件继承组) -
smb.conf中对应共享节必须写明:valid users = @sambashare(带@表示组),且browseable = yes
如果用guest ok = yes,必须配guest account = nobody,并确保nobody对目录有读写权——但生产环境不建议开访客模式。
SELinux或AppArmor启用时,samba_share_t上下文不能漏
CentOS/RHEL/Rocky Linux默认开SELinux,Ubuntu/Debian若启了AppArmor,也会拦截访问,现象是日志里反复报Permission denied,但ls -l明明权限是对的。
补救步骤:
- RHEL系:
sudo semanage fcontext -a -t samba_share_t "/srv/samba/shared(/.*)?",再sudo restorecon -Rv /srv/samba/shared - Ubuntu/Debian:
sudo aa-status看AppArmor是否启用,若启用,需为/usr/sbin/smbd添加对应路径的读写规则 - 临时验证可先
sudo setenforce 0(仅测试,勿留线上)
最易被忽略的是:SELinux上下文不会自动继承子目录,restorecon -Rv必须带-v看输出,确认每层路径都标上了samba_share_t。











