【Linux从入门到精通】第34篇:搭建FTP与Samba——跨平台文件共享解决方案

目录

一、引言:FTP还是Samba?

二、vsftpd:Linux的FTP服务

[2.1 安装与基础配置](#2.1 安装与基础配置)

[2.2 场景一:匿名只读FTP(快速分发文件)](#2.2 场景一:匿名只读FTP(快速分发文件))

[2.3 场景二:虚拟用户FTP(更安全的多用户方案)](#2.3 场景二:虚拟用户FTP(更安全的多用户方案))

[2.4 FTP防火墙配置](#2.4 FTP防火墙配置)

三、Samba:让Linux目录出现在Windows网络邻居

[3.1 安装Samba](#3.1 安装Samba)

[3.2 创建共享目录](#3.2 创建共享目录)

[3.3 配置共享](#3.3 配置共享)

[3.4 配置Samba用户(可选,如果需要身份认证)](#3.4 配置Samba用户(可选,如果需要身份认证))

[3.5 重启并配置防火墙](#3.5 重启并配置防火墙)

[3.6 从Windows访问](#3.6 从Windows访问)

四、权限冲突排查:FTP和Samba的常见困境

[4.1 问题的本质](#4.1 问题的本质)

[4.2 根本原因分析](#4.2 根本原因分析)

[4.3 通用解决方案](#4.3 通用解决方案)

[4.4 排查清单](#4.4 排查清单)

五、本篇小结

动手练习

六、下篇预告


一、引言:FTP还是Samba?

在开始搭建之前,先搞清楚两种方案的定位:

对比维度 FTP(vsftpd) Samba
协议 FTP(File Transfer Protocol) SMB/CIFS(Server Message Block)
最佳客户端 FileZilla、WinSCP等专业工具 Windows资源管理器直接访问
跨平台性 所有系统都有FTP客户端 Windows原生支持,macOS/Linux需额外配置
安全性 传统FTP明文传输,需配合FTPS或SFTP SMB 3.0+支持加密
典型场景 公网文件分发、自动化脚本上传 局域网内像本地文件夹一样使用

选择建议

  • 需要从公网传文件、使用专业FTP客户端 → vsftpd

  • 局域网内想让Windows用户像用U盘一样直接拖拽文件 → Samba

  • 两者不冲突,同一台服务器可以同时部署

二、vsftpd:Linux的FTP服务

2.1 安装与基础配置

vsftpd意为"Very Secure FTP Daemon",是Linux下最主流的FTP服务器,以安全性著称。

bash

复制代码
# 安装
sudo apt update && sudo apt install vsftpd -y   # Ubuntu/Debian
sudo dnf install vsftpd -y                      # CentOS/RHEL

# 启动并设为开机自启
sudo systemctl start vsftpd
sudo systemctl enable vsftpd

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

2.2 场景一:匿名只读FTP(快速分发文件)

匿名FTP允许任何人无需账号密码下载文件,适合公开文件分发(如软件下载站、公开文档)。安全起见,通常只开放读取、禁止上传和修改

bash

复制代码
sudo vim /etc/vsftpd.conf

修改或确认以下配置:

ini

复制代码
# 允许匿名访问
anonymous_enable=YES

# 匿名用户根目录(所有共享文件放在这里)
anon_root=/srv/ftp

# 匿名用户只允许下载,禁止上传和修改
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO

# 本地用户不允许登录(安全措施:服务器上真实的系统用户不能用FTP登录)
local_enable=NO

创建共享目录并放入测试文件:

bash

复制代码
sudo mkdir -p /srv/ftp/pub
sudo chown -R ftp:ftp /srv/ftp
echo "This is a public file" | sudo tee /srv/ftp/pub/readme.txt
sudo systemctl restart vsftpd

测试匿名访问(FTP的匿名用户名默认是ftpanonymous,任意密码即可登录):

bash

复制代码
# 安装ftp客户端测试
sudo apt install ftp -y
ftp localhost
# 用户名:anonymous,密码:直接回车
# 进入后执行 ls 查看文件,get 文件名 下载测试
# quit 退出

2.3 场景二:虚拟用户FTP(更安全的多用户方案)

生产环境中,直接用Linux系统用户登录FTP有安全隐患------一旦FTP密码泄露,攻击者就能通过SSH登录服务器。虚拟用户解决了这个问题:FTP账号只存在于数据库中,与Linux系统账号完全隔离。

第一步:安装虚拟用户依赖包

bash

复制代码
sudo apt install libpam-pwdfile -y

CentOS/RHEL:sudo dnf install pam_mysql,或使用db_load工具创建Berkeley DB用户数据库。此处以Ubuntu的libpam-pwdfile为例,原理相同。

第二步:创建虚拟用户数据库

bash

复制代码
# 安装htpasswd工具(用于生成密码哈希)
sudo apt install apache2-utils -y

# 创建用户数据库文件,添加两个用户
sudo mkdir -p /etc/vsftpd
sudo htpasswd -c /etc/vsftpd/virtual_users.pwd user1
# 输入密码,-c 表示创建新文件(仅第一次使用)
sudo htpasswd /etc/vsftpd/virtual_users.pwd user2
# 追加第二个用户(不加 -c)

第三步:配置PAM认证

PAM(Pluggable Authentication Modules)告诉vsftpd如何验证用户:

bash

复制代码
sudo vim /etc/pam.d/vsftpd

清空原有内容,写入:

text

复制代码
auth    required    pam_pwdfile.so pwdfile /etc/vsftpd/virtual_users.pwd
account required    pam_permit.so

第四步:配置vsftpd使用虚拟用户

bash

复制代码
sudo vim /etc/vsftpd.conf

ini

复制代码
# 禁用匿名
anonymous_enable=NO

# 启用虚拟用户
local_enable=YES
guest_enable=YES
guest_username=ftp      # 所有虚拟用户映射为系统用户ftp

# 虚拟用户配置文件目录
user_config_dir=/etc/vsftpd/user_conf

# 其他安全设置
write_enable=YES
chroot_local_user=YES   # 锁定在家目录

第五步:为每个虚拟用户创建独立配置

bash

复制代码
sudo mkdir -p /etc/vsftpd/user_conf
sudo mkdir -p /home/vftp/user1
sudo mkdir -p /home/vftp/user2

为user1创建配置文件,设置其家目录和权限:

bash

复制代码
sudo vim /etc/vsftpd/user_conf/user1

text

复制代码
local_root=/home/vftp/user1
write_enable=YES

同理为user2创建配置文件(只读):

bash

复制代码
sudo vim /etc/vsftpd/user_conf/user2

text

复制代码
local_root=/home/vftp/user2
write_enable=NO

第六步:重启并测试

bash

复制代码
sudo systemctl restart vsftpd
ftp localhost
# 用 user1 / user2 分别登录,验证各自家目录和权限是否一致

2.4 FTP防火墙配置

FTP使用两个端口:21(命令通道)和20(数据通道)。被动模式下数据通道使用随机高端口,需要额外配置:

bash

复制代码
# 在vsftpd.conf中添加被动模式端口范围
echo "pasv_min_port=30000" | sudo tee -a /etc/vsftpd.conf
echo "pasv_max_port=31000" | sudo tee -a /etc/vsftpd.conf
sudo systemctl restart vsftpd

# 放行防火墙
sudo firewall-cmd --permanent --add-port=20-21/tcp
sudo firewall-cmd --permanent --add-port=30000-31000/tcp
sudo firewall-cmd --reload

三、Samba:让Linux目录出现在Windows网络邻居

3.1 安装Samba

bash

复制代码
sudo apt update && sudo apt install samba -y      # Ubuntu/Debian
sudo dnf install samba samba-client -y            # CentOS/RHEL
sudo systemctl enable --now smbd

3.2 创建共享目录

bash

复制代码
# 创建需要共享的目录
sudo mkdir -p /srv/samba/shared

# 设置权限(先用宽松权限让共享跑通,后续再收紧)
sudo chmod 777 /srv/samba/shared

注意:这里先用777权限让共享跑通。下一节会专门讲权限收紧和排查。

3.3 配置共享

编辑Samba配置文件:

bash

复制代码
sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak
sudo vim /etc/samba/smb.conf

在文件末尾追加以下内容:

ini

复制代码
[shared]
   comment = Shared Folder
   path = /srv/samba/shared
   browseable = yes
   read only = no
   guest ok = yes
   create mask = 0664
   directory mask = 0775

参数解读

  • [shared]:共享名,Windows用户看到的就是这个名称

  • path:共享的Linux目录路径

  • browseable = yes:在网络邻居中可见

  • read only = no:允许写入(否则只读)

  • guest ok = yes:允许匿名访问(如果环境需要身份认证,设为no并配置Samba用户)

  • create mask:新建文件的默认权限

  • directory mask:新建目录的默认权限

3.4 配置Samba用户(可选,如果需要身份认证)

bash

复制代码
# 创建系统用户(不能登录Shell)
sudo useradd -m -s /sbin/nologin smbuser

# 设置Samba密码(独立于系统密码)
sudo smbpasswd -a smbuser
# 输入两次密码

# 修改 [shared] 配置段移除 guest ok,添加:
# valid users = smbuser

3.5 重启并配置防火墙

bash

复制代码
# 检查配置语法
testparm

sudo systemctl restart smbd

# 放行Samba端口
sudo firewall-cmd --permanent --add-service=samba
sudo firewall-cmd --reload

3.6 从Windows访问

在Windows资源管理器地址栏输入:

text

复制代码
\\<Linux服务器IP>\shared

输入之前设置的Samba用户名和密码(或匿名访问),即可看到共享目录的内容。可以直接拖拽文件,像操作本地文件夹一样。

四、权限冲突排查:FTP和Samba的常见困境

4.1 问题的本质

文件共享中最令人头疼的问题是:同一个目录被多个服务、多个用户同时访问时,权限冲突

举个例子:开发人员小王通过Samba上传了一个文件,属主是smbuser,权限是0664。运维通过FTP需要覆盖这个文件,但FTP虚拟用户映射的是ftp系统用户,权限不足写不进去。

4.2 根本原因分析

权限冲突的核心是三种权限体系的交集

权限层 FTP Samba
服务层 vsftpd的配置项 smb.conf的read onlywrite list
用户层 虚拟用户映射的系统用户 Samba用户的关联系统账户
文件系统层 目录和文件本身的rwx权限 完全相同

三层权限都需要放行,最终才能写入。任何一层拒绝,操作都会失败。

4.3 通用解决方案

方案一:统一用户(推荐,简单可靠)

让FTP和Samba使用同一个系统用户作为最终文件属主:

bash

复制代码
# 创建一个专门的共享用户
sudo useradd -m -s /sbin/nologin shareuser

# FTP侧:让虚拟用户映射到这个用户
# 在 vsftpd.conf 中设置:
#   guest_username=shareuser
# 在 user_conf/user1 中设置:
#   local_root=/srv/shared

# Samba侧:让Samba服务也使用这个用户
# 在 smb.conf 中设置:
#   force user = shareuser
#   force group = shareuser

# 文件系统侧:共享目录的属主设为这个用户
sudo chown -R shareuser:shareuser /srv/shared

方案二:使用SGID让目录自动继承组

如果有多个用户需要共享访问(比如开发组和运维组),利用第9篇学过的SGID:

bash

复制代码
# 创建共享组
sudo groupadd fileshare

# 将相关用户加入组
sudo usermod -aG fileshare ftp
sudo usermod -aG fileshare smbuser

# 设置共享目录的SGID和权限
sudo chgrp -R fileshare /srv/shared
sudo chmod 2775 /srv/shared      # 2 = SGID,新增文件继承目录的组

SGID确保任何人创建的文件的所属组都自动是fileshare,同组用户都能读写。

4.4 排查清单

当遇到"无法写入""权限拒绝"时,按以下清单依次检查:

bash

复制代码
# 1. 检查服务层是否允许写入(smb.conf 的 read only,vsftpd.conf 的 write_enable)
# 2. 检查SELinux是否拒绝(CentOS/RHEL特别注意)
getenforce
# 如果输出Enforcing,临时测试关闭:sudo setenforce 0
# 如果关闭SELinux后问题解决,说明是SELinux上下文问题

# 3. 检查文件系统权限
ls -la /srv/shared

# 4. 查看是谁上传的文件(属主属组是否一致)
stat /srv/shared/some_file

# 5. 实时监控日志
sudo tail -f /var/log/syslog | grep -E 'smbd|vsftpd'

五、本篇小结

vsftpd配置要点

模式 关键配置 适用场景
匿名只读 anonymous_enable=YES + 禁用写入 公开文件分发
虚拟用户 guest_enable=YES + PAM认证 多用户安全共享

Samba配置要点

ini

复制代码
[sharename]
   path = /共享目录
   read only = no
   guest ok = yes            # 匿名:不加用户验证
   # 或
   valid users = username    # 需认证:指定合法用户

权限冲突解决方案

  • 最简单:统一用户(force user

  • 多用户场景:SGID + 共享组

  • 排查顺序:服务层 → 文件系统层 → SELinux

动手练习

bash

复制代码
# 1. 快速搭建匿名FTP并测试
sudo apt install vsftpd -y
echo "anonymous_enable=YES" | sudo tee -a /etc/vsftpd.conf
echo "anon_root=/srv/ftp" | sudo tee -a /etc/vsftpd.conf
sudo mkdir -p /srv/ftp/pub
echo "test file" | sudo tee /srv/ftp/pub/test.txt
sudo systemctl restart vsftpd
ftp localhost   # 匿名登录,ls查看文件

# 2. 快速搭建Samba共享并测试
sudo apt install samba -y
sudo mkdir -p /srv/samba/test
sudo chmod 777 /srv/samba/test
echo "[test]" | sudo tee -a /etc/samba/smb.conf
echo "   path = /srv/samba/test" | sudo tee -a /etc/samba/smb.conf
echo "   guest ok = yes" | sudo tee -a /etc/samba/smb.conf
echo "   read only = no" | sudo tee -a /etc/samba/smb.conf
sudo systemctl restart smbd
# 在Windows文件管理器地址栏输入 \\服务器IP\test

六、下篇预告

FTP和Samba适合手动传输文件,但如果需要实时同步------比如网站文件一旦更新就立即同步到多台服务器,还需要更高效的工具。

下一篇我们将学习rsync与inotify,rsync负责增量同步(只传变化的部分),inotify负责监控文件变化并触发同步。两者组合,可以实现"文件一写入,秒级同步到备份服务器"的效果。


延伸思考:Samba是SMB协议的开源实现,SMB协议最初由IBM和微软在80年代开发。近40年后,SMB仍然是局域网文件共享的事实标准,只是版本从1.0演进到了3.x,安全性大幅增强。这也说明一个道理:好的设计不一定是最精巧的,而是最能解决用户实际问题的。

相关推荐
乌恩大侠1 小时前
【AI-RAN】在空ubuntu服务器安装环境和生成TV,高达430G文件
服务器·人工智能·ubuntu·fpga开发·o-ru
日取其半万世不竭2 小时前
用 Netdata 实时监控服务器,比 Prometheus + Grafana 轻量得多
linux·服务器·网络·系统架构·负载均衡·zabbix·grafana
jamon_tan2 小时前
Linux下cmake构建方法
linux
JiaWen技术圈2 小时前
内核子系统 nf_tables 深度解析
linux·服务器·安全·运维开发
信徒_2 小时前
负载均衡技术选型
运维·负载均衡
计算机安禾2 小时前
【Linux从入门到精通】第32篇:Nginx入门——高性能Web服务器搭建
linux·服务器·nginx
动恰客流管家2 小时前
动恰3DV3丨客流统计系统:旺季人手不够淡季闲人太多?客流统计帮你科学优化人力成本
大数据·运维·人工智能·3d
乐维_lwops2 小时前
智变2026:中国IT运维管理软件行业全景洞察——从AI重塑到信创深水区
运维·人工智能
ZenosDoron2 小时前
Linux 中,rm -r 和 -f
linux·运维·服务器