Samba服务器需要开放TCP 139和TCP 445两个核心端口,同时配合UDP 137和UDP 138用于网络发现,绝大多数Linux服务器配置这三个端口的放行规则就能实现Windows文件共享。
很多人在部署Samba时盯着smb.conf改了又改,结果Windows访问还是报“找不到网络路径”,问题根本不在配置文件,而是防火墙把端口堵死了,搞清楚Samba的端口分配逻辑,比你反复重启服务有效得多。
Samba端口全景:四组端口各自负责什么
SMB协议经过二十多年演进,形成了两套并行的通信通道,Samba服务作为SMB协议的开源实现,完整保留了这两个通道的端口使用习惯。
TCP 139端口:NetBIOS会话服务的传统通道
这是SMB协议最早使用的端口,运行在NetBIOS会话服务之上,Windows 2000之前的系统主要依赖这个端口进行文件共享,虽然现代Windows默认优先走445端口,但很多老设备、打印机、嵌入式系统仍然只支持139端口。
当你启动Samba服务时,系统会同时监听TCP 139和TCP 445两个端口。
TCP 445端口:直接承载SMB协议的新通道
从Windows 2000开始,微软推出了直接基于TCP的SMB通信方式,绕开了NetBIOS层,这个端口成为现代文件共享的主力通道,近年来部署的Windows 10/11系统、Windows Server 2016以上版本,默认情况下全部使用445端口。
UDP 137/138端口:NetBIOS名称解析与数据报服务
这两个UDP端口承担着NetBIOS名称广播功能,局域网内的Windows电脑通过137端口发广播包找到Samba服务器的主机名,通过138端口传输少量数据报。如果只放行TCP端口而不放行UDP端口,Windows客户端的“网络”列表里看不到Samba服务器,但直接输入IP地址仍然能访问。
实战配置:samba服务器如何配置防火墙端口
不同Linux发行版的防火墙管理工具差异很大,但核心原则一致:放行TCP 139/445,根据需求放行UDP 137/138。
firewalld(CentOS / Rocky Linux / Fedora)
这是红帽系发行版的默认防火墙管理工具,打开终端,依次执行以下命令:
firewall-cmd --permanent --add-service=samba firewall-cmd --reload
这个操作会一次性放行Samba所需的全部四个端口,如果只想精确放行TCP端口,可以这样执行:
firewall-cmd --permanent --add-port=139/tcp firewall-cmd --permanent --add-port=445/tcp firewall-cmd --permanent --add-port=137/udp firewall-cmd --permanent --add-port=138/udp firewall-cmd --reload

配置完成后,用firewall-cmd --list-ports查看当前放行的端口列表,确认是否生效,行业共识认为,使用--add-service=samba比手动指定端口更安全,因为firewalld会自动根据Samba版本调整端口范围。
UFW(Ubuntu / Debian)
Debian系的防火墙工具配置逻辑略有不同:
ufw allow samba ufw reload
同样需要明确一个细节:UFW的samba服务规则在/etc/services文件中映射了对应端口,在多数情况下,这条命令自动放行全部四个端口,如果使用精简模式,可以分别指定:
ufw allow 139/tcp ufw allow 445/tcp ufw allow 137/udp ufw allow 138/udp
云服务器安全组:最容易忽略的“第二道防火墙”
简米云、酷番云、华为云的服务器即使关了系统防火墙,依然无法访问Samba,几乎没有例外都是安全组规则没有放行端口,登录云控制台,找到“安全组”或“防火墙”选项,添加入方向规则:
| 协议类型 | 端口范围 | 授权对象 | 说明 |
|---|---|---|---|
| TCP | 139 | 0.0.0/0 | NetBIOS会话 |
| TCP | 445 | 0.0.0/0 | SMB直连 |
| UDP | 137 | 0.0.0/0 | 名称解析 |
| UDP | 138 | 0.0.0/0 | 数据报服务 |
授权对象建议精确到公司出口IP或办公网段,而不是直接填0.0.0.0/0,SMB协议历史上出现过多次严重漏洞,比如勒索软件常用445端口横向传播,将端口暴露给全网存在较高风险。
samba共享无法访问时的排查思路
客户端连接失败时,先别急着改配置文件,按端口连通性逐层排查,每次只验证一个步骤,基本都能直接定位到问题。
第一步:确认服务确实在监听
ss -tlnp | grep smbd
输出结果应该同时包含0.0.0:139和0.0.0:445两行,如果只有其中一个,说明smb.conf中的smb ports参数被修改过,恢复默认值即可。
第二步:验证系统防火墙放行状态
iptables -L -n | grep 445
输出中能看到ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:445这类规则表示已放行,如果没有任何输出,说明防火墙根本没有放行这个端口。

第三步:从客户端测试端口连通性
在Windows的命令提示符中执行:
telnet 192.168.1.100 445
光标停留在空白处且不报错,说明TCP 445端口连通。telnet命令在部分Windows版本需要手动开启才能使用,也可以用PowerShell替代:
Test-NetConnection 192.168.1.100 -Port 445
返回结果中TcpTestSucceeded : True代表连接成功。
第四步:检查客户端的SMB协议版本
Windows 10/11默认禁用SMB 1.0协议,如果Samba服务器版本较低(3.x时代的老系统),可能出现“无法连接到MSSQL”这类错误提示,业内专家指出,现代Linux发行版默认的Samba 4.x系列兼容性最好,基本不用关心这个问题。
在哪些场景下只需要开放139端口
虽然445端口是现代SMB通信的默认选择,但某些特定环境中,只开放139反而更合理。
老设备兼容场景
部分2005年前生产的打印机、扫描仪、投影仪只支持NetBIOS会话服务,它们连接Samba共享时只能走139端口,这些设备通常也不支持445端口的直接SMB协商机制,强行用445反而导致连接不稳定。
内网隔离场景
有较高安全要求的网络环境中,通过VLAN隔离不同业务部门,在核心交换机上做ACL(访问控制列表)时,只放行139端口可以在一定程度上减少SMB攻击面,但这种场景有代价:Windows 10/11无法通过139端口访问Samba,必须搭配旧版Windows终端使用。
samba服务器为何需要固定IP
与端口配置同等重要的是给Samba服务器设置静态IP地址,DHCP分配导致IP变动时,Windows会缓存旧的连接记录,经常出现“指定的网络名不再可用”的报错,修改/etc/network/interfaces或使用nmcli工具配置静态IP,能从根本上避免这类问题。
多网卡场景下的端口监听策略
部分服务器部署了双网卡,一块连接内网,一块连接外网,默认情况下Samba监听所有接口,好消息是smb.conf中的interfaces参数可以直接限制监听范围:
[global]
interfaces = 192.168.1.0/24 lo
bind interfaces only = yes
加上这段配置后,Samba只在192.168.1.x网段和本机回环地址上监听端口,即使防火墙没有拦住外部流量,外部设备也无法通过网卡边界探测到Samba服务,这种组合方式比纯靠防火墙限制更保险,多了一道校验机制。

为什么Samba偶尔需要开放高端口
防火墙上看到Samba占用了大量随机端口,请不要直接放行全部高端口,优先检查是否是下面两个原因:
- Windows Print Spooler服务的打印机重定向功能使用
smbspool调用远程打印队列,偶尔会占用49152到65535之间的动态端口。 - Samba的
rpc_lookup服务依赖rpcbind(端口111)获取远程过程调用端口映射表。
遇到这种情况,在smb.conf中显式固定RPC端口范围即可,配置在[global]段落中:
rpc server dynamic port range = 5000-5100
然后Firewalld放行5000-5100/tcp,静态端口分配后,防火墙规则就能精确控制了。
常见问题整理
为什么Windows能Ping通服务器,但无法访问Samba共享?
Ping使用ICMP协议,它的通断只能证明网络链路正常,与端口放行情况毫无关联,防火墙允许ICMP回显,但不一定允许TCP 445连接,这是最常见的一种端口误判场景,建议直接从Windows的资源管理器地址栏输入\IP地址测试是否出现认证窗口。
Windows提示“发生系统错误53”是什么原因?
错误代码53代表网络路径未找到,从网络协议栈来看,TCP连接请求被目标主机拒绝或丢弃,首先检查服务器本机防火墙是否放行TCP 139和TCP 445,其次确认Samba服务在正常运行(systemctl status smbd),如果服务器有云安全组,还需要检查安全组规则是否放行了这两个端口。
Samba改用其他端口后如何让Windows客户端识别?
在smb.conf的[global]段落中写smb ports = 8445,然后重启服务,Windows客户端需要修改注册表HKLMSYSTEMCurrentControlSetServicesLanmanWorkstationParameters,新建DWORD类型的SMBPort,值设为8445,修改后重启Windows,文件管理器就能通过新端口访问Samba,需要说明的是,这种方式属于非常规操作,非必要不建议使用,排查问题时反而增加复杂度。
配置Samba端口确实需要把TCP、UDP、客户端协议版本几个因素全部对齐,但核心逻辑很清晰:TCP 139提供旧协议通道,TCP 445提供新协议通道,UDP 137/138负责让服务器在局域网“被看到”,把这四个端口放行后,在绝大多数局域网环境下,Samba共享可以正常挂载,遇到连接异常,按照网络链路逐层排查即可。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/832013.html

