第 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 | 即将发布 |















暂无评论内容