Ubuntu 22.04 Samba文件共享服务搭建与配置全指南

1. 项目概述:为什么要在Ubuntu上搭建Samba?

如果你手头有一台安装了Ubuntu 22.04的电脑,无论是作为主力开发机、家庭服务器,还是淘汰旧笔记本改造的NAS,让它和家里的Windows电脑、Mac或者手机共享文件,总是一个绕不开的需求。直接插U盘拷贝太原始,用网盘同步又慢又担心隐私,这时候,一个本地的文件共享服务就成了刚需。Samba就是这个领域的老兵和事实标准,它实现了Windows网络最核心的SMB/CIFS协议,能让你的Ubuntu机器无缝融入现有的Windows网络环境,或者反过来,让其他设备像访问本地文件夹一样访问Ubuntu上的资源。

我选择在Ubuntu 22.04上做这件事,是因为这个LTS版本足够稳定,软件源里的Samba也是经过充分测试的版本,搭建过程几乎是一条直线的命令,但里面的门道不少。比如权限配置不对,你可能看得见文件夹却打不开;或者安全设置太松,等于在局域网里敞开了大门。这篇文章,我就从一个实际运维者的角度,带你从零开始,在Ubuntu 22.04上搭建一个既安全又好用的Samba服务。无论你是想搭建一个家庭媒体中心共享电影,还是为小团队创建一个简单的文件共享点,这些步骤和踩坑经验都能直接用上。

2. 核心思路与方案选型

2.1 为什么是Samba而不是其他方案?

在Linux上实现文件共享,可选方案不止Samba一个。比如,还有NFS(网络文件系统),它性能更高,在纯Linux/Unix环境间共享是首选;或者用WebDAV,通过HTTP协议共享,配置起来像搭一个网站。但我依然首选Samba,核心原因在于兼容性和免客户端。

NFS虽然高效,但Windows系统默认不支持,需要额外安装客户端软件,对家庭用户或非技术团队成员不友好。WebDAV需要每个访问设备都进行挂载操作,体验上不够“原生”。而Samba最大的优势在于,对于Windows和macOS用户,它几乎是透明的。在Windows的文件资源管理器里,你的Ubuntu服务器会直接出现在“网络”位置中,双击就能访问,和访问另一台Windows电脑没有任何区别。这种无缝体验,对于混合环境来说是决定性的。此外,Android和iOS上也有很多支持SMB协议的文件管理器App,访问同样方便。

因此,我们的方案选型非常明确:使用Ubuntu 22.04官方源中的Samba软件包,搭建一个支持多用户、具备不同权限的共享服务。我们将采用用户验证的方式,而不是匿名共享,以保障基本的安全。

2.2 基础环境与网络考量

在开始敲命令之前,有两点需要先确认好,这能避免后续很多麻烦。

第一是网络环境。确保你的Ubuntu服务器和需要访问它的客户端(比如你的Windows电脑)在同一个局域网段内。简单来说,就是它们连接的同一个路由器,获取的IP地址是类似192.168.1.xxx这样的。你可以通过在Ubuntu终端里输入ip addr命令来查看自己的IP地址。记下这个地址,后面客户端连接时会用到。

第二是防火墙。Ubuntu 22.04默认使用的是ufw防火墙,而且初始状态是禁用的。这有利有弊。好处是,在学习和测试阶段,你大概率不会因为防火墙问题导致连不上。坏处是,如果将来你要长期运行这台服务器,必须妥善配置防火墙。我们的策略是:先确保服务在无防火墙干扰下能正常工作,然后再回头配置防火墙规则,只开放必要的端口。Samba需要用到一系列端口,最常用的是139445。我们会在服务调试成功后再来处理它。

3. 服务安装与核心配置解析

3.1 安装Samba软件包

安装过程非常简单,Ubuntu的APT包管理器已经为我们准备好了所有东西。打开终端,首先更新一下软件包列表,这是一个好习惯,能确保我们安装的是最新的稳定版本。

sudo apt update

更新完成后,直接安装Samba:

sudo apt install samba -y

这个-y参数表示自动确认安装,省去一次手动输入。安装过程会同时装上Samba的核心服务程序smbd(负责文件共享和打印)和nmbd(负责NetBIOS名称解析,让其他电脑能在网络邻居里看到你的机器)。

安装完成后,系统会自动创建Samba的配置文件目录/etc/samba和主要的配置文件/etc/samba/smb.conf。这个文件就是我们接下来要动手术的核心。

注意:在修改任何配置文件之前,先做一个备份,这是运维工作的铁律。执行sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.backup。万一改乱了,我们可以用备份文件瞬间恢复。

3.2 剖析与规划Samba配置文件

在动手修改之前,我们先理解一下smb.conf的结构。这个文件被分成了若干节(section),每节用方括号[]括起来。

  • [global]:全局配置节。这里设置的是整个Samba服务器的行为,比如工作组名、服务器描述、安全模式、日志设置等。
  • [homes]:一个特殊的共享节。如果启用,每个系统用户都可以通过Samba访问自己的家目录(/home/用户名)。
  • [printers]:打印机共享节。
  • [share]:自定义的共享节。我们可以创建任意多个,比如[media][public]等。

我们的目标是创建一个新的、独立的共享目录,而不是直接使用[homes]节。这样做更清晰,权限分离也更好管理。假设我想创建一个名为shared的共享,对应Ubuntu系统上的/srv/samba/shared目录,允许一个特定的用户组(比如smbusers)的成员读写。

首先,创建这个目录并设置好本地权限:

# 创建共享根目录和具体共享目录 sudo mkdir -p /srv/samba/shared # 创建一个专门用于Samba的用户组 sudo groupadd smbusers # 将共享目录的所属组改为smbusers sudo chgrp smbusers /srv/samba/shared # 设置目录权限,所属者(root)和所属组(smbusers)有读写执行权限,其他用户无任何权限 sudo chmod 2770 /srv/samba/shared

这里chmod 2770中的2是设置SGID位。这个位非常有用:它使得在这个目录下创建的任何新文件或子目录,都会自动继承smbusers组作为所属组。这样,同组内的其他用户也能顺利读写这些新文件,避免了权限混乱。

3.3 编辑配置文件并创建Samba用户

现在,我们来编辑核心配置文件。使用你喜欢的文本编辑器,比如nano

sudo nano /etc/samba/smb.conf

首先,关注[global]节。找到workgroup这一行,默认可能是WORKGROUP。如果你的Windows电脑默认的工作组也是这个(大部分家庭网络是),就不用改。如果想改成其他名字,比如MYHOME,就修改它。确保server string(服务器描述)是你喜欢的名字,这会在网络邻居里显示。

最关键的一行是security。在较新的Samba版本中,推荐使用user模式(即用户级安全)。确保配置中是:

security = user

接下来,在文件的末尾,添加我们自定义的共享节:

[shared] comment = Ubuntu Samba Shared Folder path = /srv/samba/shared browseable = yes read only = no guest ok = no valid users = @smbusers create mask = 0664 directory mask = 0775 force group = smbusers

我们来逐行解析:

  • [shared]:共享名称,客户端访问时看到的就是这个。
  • comment:共享描述,辅助信息。
  • path:共享目录在Ubuntu上的绝对路径。
  • browseable:是否允许被浏览到,设为yes
  • read only:是否只读,设为no表示可读写。
  • guest ok:是否允许匿名(访客)访问,为了安全,务必设为no
  • valid users:允许访问此共享的用户。@smbusers表示允许smbusers用户组的所有成员。
  • create mask/directory mask:控制新建文件和目录的默认权限。这里设置文件为664(属主和属组可读写,其他人只读),目录为775(属主和属组可读写执行,其他人可读和执行)。
  • force group:强制所有通过Samba创建的文件都属于smbusers组,这与前面设置的SGID位协同工作,确保权限一致性。

保存并退出编辑器(在nano中是Ctrl+X,然后按Y确认,再按回车)。

现在,我们需要创建一个系统用户,并把它添加到smbusers组,然后为这个用户设置一个Samba专用密码。注意,Samba密码和系统登录密码是分开的。

假设我们创建一个叫sambauser的用户:

# 创建系统用户(不创建家目录,因为不是用来登录的) sudo useradd -M -s /usr/sbin/nologin sambauser # 将用户添加到smbusers组 sudo usermod -aG smbusers sambauser # 为sambauser设置Samba密码 sudo smbpasswd -a sambauser

执行smbpasswd命令后,会提示你输入并确认密码。这个密码就是之后在Windows上连接时需要输入的密码。

最后,在重启服务前,一定要用Samba自带的工具测试一下配置文件语法是否正确:

sudo testparm

如果输出显示“Loaded services file OK.”,并且下面列出了你配置的[shared]共享,那就说明配置文件语法没问题。如果有错误,它会明确指出在哪一行,方便你回头修改。

4. 服务管理、防火墙与客户端连接

4.1 启动服务并设置开机自启

配置检查无误后,就可以启动Samba服务了。Ubuntu 22.04使用systemd管理系统服务。

# 启动Samba服务 sudo systemctl start smbd nmbd # 设置开机自动启动 sudo systemctl enable smbd nmbd # 查看服务状态,确认是否运行正常 sudo systemctl status smbd

运行status命令后,你应该看到绿色的“active (running)”字样。如果有问题,日志信息会在这里显示,这是排查故障的第一现场。

4.2 配置防火墙(如果启用)

如前所述,如果之前没有启用ufw,可以跳过这一步。如果你已经启用了,或者现在打算启用以加强安全,就需要添加规则。

首先,查看Samba在ufw中的应用配置文件:

sudo ufw app list

你应该能看到一个叫“Samba”的应用。查看它的详细规则:

sudo ufw app info Samba

它会列出需要开放的端口。通常,我们允许局域网访问即可。假设你的局域网网段是192.168.1.0/24,可以这样添加规则:

# 允许来自局域网的Samba流量 sudo ufw allow from 192.168.1.0/24 to any app Samba # 启用ufw防火墙(如果尚未启用) sudo ufw enable

务必确认你的客户端IP在允许的网段内,否则会被防火墙阻断。

4.3 从Windows客户端连接

这是最有成就感的时刻。在你的Windows电脑上,打开文件资源管理器,在地址栏输入以下两种格式之一:

  • \\你的Ubuntu的IP地址(例如:\\192.168.1.100
  • \\你的Ubuntu的主机名(可以在Ubuntu终端用hostname命令查看)

按回车后,可能会弹出凭据窗口。输入用户名sambauser和你用smbpasswd设置的密码。如果一切顺利,你就会看到名为shared的共享文件夹,双击进入,就可以像操作本地文件夹一样读写文件了。

你可以尝试在里面新建一个文本文档,然后在Ubuntu的/srv/samba/shared目录下用ls -l命令查看,会发现这个文件的所属组是smbusers,权限也符合我们设置的664。这证明SGID和force group生效了。

4.4 从macOS客户端连接

在macOS上,打开Finder,在菜单栏选择“前往” -> “连接服务器…”,或者直接按Command+K。 在服务器地址中输入:smb://你的Ubuntu的IP地址(例如:smb://192.168.1.100)。 点击连接,选择注册用户,输入用户名sambauser和密码,同样可以挂载共享文件夹到本地。

5. 高级配置与性能调优

5.1 多用户与复杂权限管理

在实际应用中,一个共享给多人用很常见,且每个人权限可能不同。Samba可以很好地结合系统用户和组来管理。

例如,我们有share目录,希望:

  • 用户userAuserB可读写。
  • 用户userC只能读。
  • 其他人不能访问。

实现步骤:

  1. 创建系统用户和组。
    sudo groupadd share_rw sudo groupadd share_ro sudo useradd -M -s /usr/sbin/nologin userA sudo useradd -M -s /usr/sbin/nologin userB sudo useradd -M -s /usr/sbin/nologin userC sudo usermod -aG share_rw userA sudo usermod -aG share_rw userB sudo usermod -aG share_ro userC
  2. 设置目录权限。假设共享路径是/srv/samba/complex_share
    sudo mkdir -p /srv/samba/complex_share sudo chown root:share_rw /srv/samba/complex_share sudo chmod 2770 /srv/samba/complex_share # 设置ACL,为只读组添加读取和执行权限 sudo setfacl -m g:share_ro:rx /srv/samba/complex_share
  3. smb.conf中配置共享。
    [complex_share] path = /srv/samba/complex_share valid users = @share_rw, @share_ro read list = @share_ro write list = @share_rw force group = share_rw create mask = 0664 directory mask = 0775
    这里read listwrite list实现了精细的读写控制。force group确保了新建文件属于share_rw组,这样同组的userAuserB都能互操作文件,而userC由于不在share_rw组且被read list限制,只能读。

5.2 启用日志进行问题排查

Samba的日志是排查连接、权限问题的利器。在[global]节添加或修改以下配置:

log file = /var/log/samba/log.%m log level = 2 max log size = 1000
  • log file = /var/log/samba/log.%m%m是客户端机器名的占位符。这意为每个连接的客户端都会生成一个独立的日志文件(如log.windows-pc),查看起来非常方便。
  • log level = 2:日志级别。1是基础,2会记录更多细节(如连接、认证过程),3以上信息量巨大,一般调试时才用。
  • max log size = 1000:单个日志文件最大1000KB,超过后会轮转。

配置后重启Samba服务。当遇到问题时,去/var/log/samba/目录下查看对应的日志文件,里面通常会明确告诉你认证失败、权限拒绝的具体原因。

5.3 性能优化参数

对于千兆网络或需要传输大文件的情况,调整一些参数可以提升吞吐量。在[global]节或特定共享节中添加:

socket options = TCP_NODELAY SO_RCVBUF=131072 SO_SNDBUF=131072 read raw = yes write raw = yes large readwrite = yes max xmit = 65535 dead time = 15
  • socket options:调整TCP套接字参数,减少延迟,增大缓冲区。
  • read raw/write raw:启用原始读写,提升大文件传输效率。
  • large readwrite:支持大的读写请求。
  • max xmit:增大单个传输块的大小。
  • dead time:设置空闲连接断开时间为15分钟,释放资源。

这些参数在网络状况良好的局域网内通常能带来可观的性能提升。修改后同样需要重启服务。

6. 常见问题与故障排查实录

即使按照步骤操作,也可能会遇到一些问题。这里记录几个我踩过的坑和解决方案。

6.1 Windows提示“无法访问。你可能没有权限使用网络资源”

这是最常见的问题,原因多样。

  1. 凭据错误:Windows会缓存旧的凭据。去“控制面板” -> “用户账户” -> “管理Windows凭据”,找到关于你Ubuntu服务器地址的凭据,删除它,然后重新连接并输入用户名密码。
  2. Samba用户未激活smbpasswd -a只是添加用户,默认是禁用的。确保用户是激活状态:sudo smbpasswd -e sambauser
  3. 安全策略限制:对于Windows 10/11,它默认启用了更严格的安全策略。可以尝试在Ubuntu的[global]节添加以下两行来兼容:
    ntlm auth = yes client min protocol = SMB2 server min protocol = SMB2
    这强制使用SMB2及以上协议,并启用NTLM认证。

6.2 能看到共享文件夹,但打开时提示“拒绝访问”

这基本是Linux文件系统权限与Samba权限不匹配导致的。

  1. 目录的本地权限:用ls -ld /srv/samba/shared检查。确保Samba用户(或其所属的组)对该目录至少有rx(读取和执行)权限。执行权限对于进入目录是必须的。
  2. SELinux/AppArmor:Ubuntu默认使用AppArmor,可能会限制Samba。查看日志sudo dmesg | tail/var/log/syslog有无拒绝信息。可以尝试将共享目录移到/home/var/lib/samba下,这些地方通常有预设的访问规则。或者暂时禁用AppArmor对Samba的配置进行测试:sudo aa-complain /usr/sbin/smbd
  3. 有效用户列表:确认你的用户确实在valid users列表中,或者属于valid users指定的组。

6.3 连接速度慢,列表目录卡顿

  1. 名称解析问题:Windows在连接前会尝试进行NetBIOS名称解析等,可能耗时。直接使用IP地址连接(\\192.168.1.100)通常最快。
  2. 关闭smb.conf中不必要的共享:如果配置了[homes]但不需要,可以注释掉。客户端会尝试枚举所有共享。
  3. 调整smb.conf中的socket options:如前文性能优化部分所述,调整TCP参数可能改善速度。

6.4 如何让共享在互联网上不可见(仅限局域网)

这是重要的安全实践。在[global]节添加绑定网卡和限制访问来源:

interfaces = lo eth0 192.168.1.0/24 bind interfaces only = yes
  • interfaces:指定Samba只监听本地回环(lo)和局域网网卡(如eth0)以及指定的局域网网段。
  • bind interfaces only = yes:确保只绑定在上述接口上。

这样,即使服务器有公网IP,Samba服务也不会在公网上响应。

搭建和调试Samba服务的过程,本质上是一个不断对齐“Linux文件权限”、“Samba共享权限”和“客户端期望”这三者的过程。最稳妥的调试方法是:先确保本地权限通,再验证Samba配置通,最后排查网络和客户端问题。多利用testparm和Samba日志,它们能提供最直接的错误线索。当一切配置妥当,看着不同系统的设备流畅地存取同一份文件时,这种打破壁垒的掌控感,正是自建服务的乐趣所在。