Ubuntu 系统系列 | 第 19 天:文件共享服务——Samba、NFS、FTP 服务器搭建

第 19/30 天

引言

在多设备、多系统共存的网络环境中,文件共享是一项基础而又关键的需求。你可能需要让 Windows 和 Linux 电脑之间共享文件,在多台 Linux 服务器之间共享数据目录,或者搭建一个临时的文件传输通道供团队成员下载资料。Ubuntu 提供了三种主流的文件共享方案:Samba(Windows 兼容)、NFS(Linux 原生高效)和 FTP/VSFTPD(轻量级传输协议)。

今天,我们将在 Ubuntu 22.04/24.04 LTS 上逐一部署这三种文件共享服务,并涵盖安全加固、性能调优和常见故障排查,让你能根据实际场景选择最合适的方案。


一、Samba——跨平台文件共享之王

Samba 实现了 SMB/CIFS 协议,使 Linux 服务器能够无缝融入 Windows 网络环境,同时也能被 macOS 和 Linux 客户端访问。

1.1 安装 Samba

# 更新包索引并安装 Samba
sudo apt update
sudo apt install samba samba-common smbclient -y

# 检查服务状态
sudo systemctl status smbd
sudo systemctl status nmbd
  • smbd:SMB/CIFS 核心服务,处理文件共享和打印服务
  • nmbd:NetBIOS 名称服务,负责主机名解析和浏览

1.2 配置共享目录

创建共享目录并配置权限:

# 创建共享目录
sudo mkdir -p /srv/shares/public
sudo mkdir -p /srv/shares/team

# 设置目录权限(public 可读写,team 仅组可写)
sudo chmod 777 /srv/shares/public
sudo chown root:sambashare /srv/shares/team
sudo chmod 775 /srv/shares/team

编辑 Samba 主配置文件:

sudo nano /etc/samba/smb.conf

在文件末尾添加共享定义:

[global]
   workgroup = WORKGROUP
   server string = Ubuntu File Server
   netbios name = ubuntu-fs
   security = user
   map to guest = bad user
   guest account = nobody

[public]
   comment = Public Shared Files
   path = /srv/shares/public
   browseable = yes
   guest ok = yes
   read only = no
   create mask = 0644
   directory mask = 0755

[team]
   comment = Team Shared Folder
   path = /srv/shares/team
   browseable = yes
   valid users = @sambashare
   read only = no
   create mask = 0640
   directory mask = 0750

1.3 创建 Samba 用户

Samba 有独立的用户数据库,需要将系统用户添加到 Samba 中:

# 创建系统用户
sudo useradd -m -s /bin/bash -G sambashare alice

# 设置系统密码
sudo passwd alice

# 添加到 Samba 用户数据库(设置 Samba 密码)
sudo smbpasswd -a alice

# 启用 Samba 用户
sudo smbpasswd -e alice

# 查看 Samba 用户列表
sudo pdbedit -L

1.4 重启服务并测试

# 配置文件语法检查
sudo testparm

# 重启 Samba 服务
sudo systemctl restart smbd nmbd

# 防火墙放行 Samba
sudo ufw allow samba
sudo ufw reload

从 Windows 客户端访问:在文件资源管理器地址栏输入 \192.168.1.100public(替换为你的 Ubuntu 服务器 IP)。

从 Linux 客户端测试

# 列出共享
smbclient -L //192.168.1.100 -U alice

# 挂载到本地
sudo mount -t cifs //192.168.1.100/team /mnt/team -o username=alice,uid=1000,gid=1000

1.5 Samba 安全加固要点

配置项 推荐值 说明
server min protocol SMB2_10 禁用脆弱的 SMB1 协议(永恒之蓝漏洞利用的就是 SMBv1)
restrict anonymous 2 禁止匿名访问枚举
hosts allow 192.168.1.0/24 限制仅内网可访问
encrypt passwords yes 强制加密传输
# 在 [global] 段添加
server min protocol = SMB2_10
restrict anonymous = 2
hosts allow = 192.168.1.0/24 127.0.0.1

二、NFS——Linux 原生高效共享

NFS(Network File System)是 Linux/Unix 环境下的标准文件共享协议,性能优于 Samba,但无法直接与 Windows 互通。

2.1 安装 NFS 服务器

sudo apt install nfs-kernel-server -y

# 安装客户端工具(可选,用于测试)
sudo apt install nfs-common -y

# 检查服务状态
sudo systemctl status nfs-server
sudo systemctl status nfs-kernel-server

2.2 导出目录配置

# 创建导出目录
sudo mkdir -p /srv/nfs/data
sudo mkdir -p /srv/nfs/backup

# 设置权限(NFS 使用 UID/GID 映射,注意客户端 UID 一致性)
sudo chown nobody:nogroup /srv/nfs/data
sudo chmod 755 /srv/nfs/data

编辑 /etc/exports 文件:

sudo nano /etc/exports
# 格式:<导出目录> <客户端>(<选项>)

# 允许整个子网访问,同步写入,root 映射为匿名
/srv/nfs/data     192.168.1.0/24(rw,sync,no_subtree_check,no_root_squash)
/srv/nfs/backup   10.0.0.0/8(rw,sync,no_subtree_check,root_squash)

# 允许特定主机以只读方式访问
/srv/nfs/data     192.168.1.50(ro,sync,no_subtree_check)

NFS 导出选项详解:

选项 说明
rw / ro 读写 / 只读
sync 数据写入磁盘后才返回成功(数据安全,但略慢)
async 数据先写入内存缓存,提升性能(宕机可能丢数据)
no_subtree_check 禁用子树检查,提升稳定性
root_squash 客户端的 root 映射为匿名用户(安全)
no_root_squash 客户端 root 保留 root 权限(慎用)
all_squash 所有用户映射为匿名用户(最安全)

2.3 应用导出配置

# 导出配置并应用
sudo exportfs -arv

# 查看当前导出列表
sudo exportfs -v

# 重启 NFS 服务
sudo systemctl restart nfs-server

输出示例:

exporting 192.168.1.0/24:/srv/nfs/data
exporting 10.0.0.0/8:/srv/nfs/backup
exporting 192.168.1.50:/srv/nfs/data

2.4 客户端挂载 NFS

# 在客户端安装 nfs-common
sudo apt install nfs-common -y

# 查看 NFS 服务器共享列表
showmount -e 192.168.1.100

# 挂载 NFS 共享
sudo mount -t nfs 192.168.1.100:/srv/nfs/data /mnt/data

# 查看挂载信息
df -h | grep nfs

# 永久挂载(编辑 /etc/fstab)
echo "192.168.1.100:/srv/nfs/data  /mnt/data  nfs  defaults,timeo=600,retrans=2  0  0" | sudo tee -a /etc/fstab

2.5 NFS 性能调优

# 调整 NFS 线程数(默认 8,可按需增加)
echo "RPCNFSDCOUNT=32" | sudo tee -a /etc/default/nfs-kernel-server

# 调整 rsize/wsize 块大小(提升大文件传输速度)
# 在客户端挂载时指定
sudo mount -t nfs -o rsize=1048576,wsize=1048576,hard,intr 192.168.1.100:/srv/nfs/data /mnt/data

rsize/wsize 最佳实践:对于 1GbE 网络,rsize=1048576,wsize=1048576(1MB)通常可获得最佳性能;对于 10GbE 网络,可尝试 rsize=4194304,wsize=4194304(4MB)。


三、VSFTPD——轻量级 FTP 服务器

FTP 虽已不是主流,但作为快速文件传输通道仍有其用武之地(尤其是匿名下载和特定场景的自动化脚本)。

3.1 安装 VSFTPD

sudo apt update
sudo apt install vsftpd -y

# 备份默认配置
sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.bak

# 检查服务状态
sudo systemctl status vsftpd

3.2 配置安全 FTP 服务器

编辑 /etc/vsftpd.conf

sudo nano /etc/vsftpd.conf
# 基本设置
listen=YES
listen_port=21
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022

# 限制用户在家目录(chroot jail)
chroot_local_user=YES
allow_writeable_chroot=YES
user_sub_token=$USER
local_root=/home/$USER/ftp

# 被动模式端口范围(用于防火墙配置)
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=30100

# 日志
xferlog_enable=YES
xferlog_file=/var/log/vsftpd.log
log_ftp_protocol=YES

# 超时设置
idle_session_timeout=600
data_connection_timeout=120

3.3 创建 FTP 用户和目录

# 创建 FTP 专用用户
sudo useradd -m -s /bin/bash ftpuser
sudo passwd ftpuser

# 创建 FTP 上传目录
sudo mkdir -p /home/ftpuser/ftp/upload
sudo chmod 755 /home/ftpuser/ftp
sudo chmod 755 /home/ftpuser/ftp/upload
sudo chown ftpuser:ftpuser /home/ftpuser/ftp/upload

3.4 配置防火墙和 TLS 安全

# 防火墙放行 FTP 端口
sudo ufw allow 20/tcp      # FTP 数据端口
sudo ufw allow 21/tcp      # FTP 控制端口
sudo ufw allow 30000:30100/tcp  # 被动模式端口
sudo ufw reload

强制使用 TLS 加密(防止明文传输密码):

# 生成自签名证书
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 
  -keyout /etc/ssl/private/vsftpd.key 
  -out /etc/ssl/certs/vsftpd.crt

# 在 /etc/vsftpd.conf 中添加 TLS 配置
echo "rsa_cert_file=/etc/ssl/certs/vsftpd.crt" | sudo tee -a /etc/vsftpd.conf
echo "rsa_private_key_file=/etc/ssl/private/vsftpd.key" | sudo tee -a /etc/vsftpd.conf
echo "ssl_enable=YES" | sudo tee -a /etc/vsftpd.conf
echo "allow_anon_ssl=NO" | sudo tee -a /etc/vsftpd.conf
echo "force_local_data_ssl=YES" | sudo tee -a /etc/vsftpd.conf
echo "force_local_logins_ssl=YES" | sudo tee -a /etc/vsftpd.conf
echo "ssl_tlsv1=YES" | sudo tee -a /etc/vsftpd.conf
echo "ssl_sslv2=NO" | sudo tee -a /etc/vsftpd.conf
echo "ssl_sslv3=NO" | sudo tee -a /etc/vsftpd.conf

# 重启服务
sudo systemctl restart vsftpd

3.5 测试 FTP 连接

# 命令行测试
ftp 192.168.1.100

# 使用 lftp(支持 TLS)
sudo apt install lftp -y
lftp -u ftpuser -e "set ftp:ssl-force true; ls; quit" 192.168.1.100

四、三种方案对比与选型建议

特性 Samba NFS FTP/VSFTPD
跨平台 ✅ Windows/Linux/macOS 全支持 ❌ 仅 Linux/Unix 原生 ✅ 几乎所有平台有客户端
性能 中等(协议开销较大) ⭐ 最佳(内核级实现) 一般(明文协议,高延迟)
安全性 良好(SMB2/3 加密) 依赖网络隔离 ⚠️ 需额外配置 TLS
配置复杂度 中等 简单 简单
用户认证 独立 Samba 用户库 系统 UID/GID 映射 系统用户
适用场景 混合环境文件共享 Linux 服务器间高速传输 临时文件传输/下载站
防火墙端口 445/tcp 等 2049/tcp, 111/tcp 20-21/tcp, 30000-30100

选型决策树

需要与 Windows 共享文件?
  ├─ ✅ → Samba
  └─ ❌
      ↓
Linux 到 Linux 高性能传输?
  ├─ ✅ → NFS
  └─ ❌
      ↓
临时下载/上传通道?
  ├─ ✅ → FTP (vsftpd + TLS)
  └─ ❌ → 考虑 SCP/rsync 替代

五、常见问题与故障排查

5.1 Samba 连接失败

现象:Windows 无法访问 \ubuntu-servershare

排查步骤

# 1. 检查 Samba 服务是否运行
sudo systemctl status smbd

# 2. 检查防火墙
sudo ufw status verbose | grep 445

# 3. 测试 SMB 协议版本
smbclient -L //127.0.0.1 -N -m SMB3

# 4. 查看 Samba 日志
sudo tail -f /var/log/samba/log.smbd

常见原因:Windows 默认启用 SMB3,Samba 配置了 server min protocol = SMB2_10 通常没问题。如果使用旧版 Windows,需检查协议兼容性。

5.2 NFS 挂载卡死

现象mount 命令无响应或超时

# 检查 NFS 服务器导出
showmount -e 192.168.1.100

# 检查服务端防火墙
sudo ufw status | grep 2049

# 使用 soft 挂载避免卡死(生产环境慎用,可能导致数据损坏)
sudo mount -t nfs -o soft,timeo=30 192.168.1.100:/srv/nfs/data /mnt/data

5.3 FTP 被动模式连接失败

现象:登录成功,但 ls 或文件传输时卡住

原因:FTP 有主动和被动两种模式。被动模式下,客户端需要连接到服务器指定范围内的端口,防火墙必须放行。

# 确认 vsftpd 被动端口配置正确
grep -E "pasv_min|pasv_max" /etc/vsftpd.conf

# 确认防火墙放行
sudo ufw status | grep 30000

# 客户端使用被动模式(大多数 FTP 客户端默认)
ftp -p 192.168.1.100

总结与下期预告

今天我们深入了解了 Ubuntu 上的三种主流文件共享方案:

  • Samba 让 Ubuntu 无缝融入 Windows 环境,是混合网络的标配
  • NFS 提供 Linux 原生高性能共享,是服务器集群的最佳选择
  • VSFTPD 虽老但轻量,配合 TLS 加密后仍可胜任临时传输场景

关键实操要点
1. 无论哪种方案,防火墙配置是排在第一位的故障点
2. Samba 的 testparm 和 NFS 的 exportfs -v 是配置检查的利器
3. 生产环境务必禁用不安全协议(SMB1、FTP 明文)
4. 对于高安全需求场景,考虑使用 SSHFS 或 Syncthing 替代传统共享方案

明天预告:第 20 天我们将进入监控领域,部署 Prometheus + Grafana + Netdata 一整套监控与告警系统,让你的 Ubuntu 服务器状态一目了然!


系列目录

天数 文章标题 链接
第 1 天 Ubuntu 简介与版本选择 阅读
第 2 天 手把手安装 Ubuntu 阅读
第 3 天 Ubuntu 桌面环境初探 阅读
第 4 天 Ubuntu 终端基础 阅读
第 5 天 用户与权限管理 阅读
第 6 天 软件包管理 阅读
第 7 天 文件与文本操作 阅读
第 8 天 系统服务管理 systemd 阅读
第 9 天 磁盘与文件系统管理 阅读
第 10 天 网络配置与管理 阅读
第 11 天 进程管理与监控 阅读
第 12 天 计划任务与自动化 阅读
第 13 天 备份与恢复策略 阅读
第 14 天 系统更新与升级管理 阅读
第 15 天 SSH 远程管理与安全加固 阅读
第 16 天 Web 服务器搭建 阅读
第 17 天 数据库服务器部署 阅读
第 18 天 Docker 安装与容器化管理 阅读
第 19 天 文件共享服务 Samba/NFS/FTP 👈 本文
第 20 天 监控与告警系统 Prometheus/Grafana/Netdata 即将发布
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容