在Linux系统中搭建FTP服务器是企业日常运维和个人文件共享的常见需求,本文将以主流的vsftpd(Very Secure FTP Daemon)为例,详细介绍从环境准备到安全配置的完整流程,帮助读者快速搭建稳定、安全的FTP服务。

环境准备与系统要求
在开始搭建前,需确保服务器满足基本要求:操作系统为CentOS 7+/Ubuntu 18.04+,具有root或sudo权限,且服务器与客户端网络互通(默认FTP服务使用21端口),若需通过公网访问,需确保服务器的防火墙和云平台安全组已开放相关端口。
安装vsftpd服务
vsftpd是Linux下轻量级、高安全性的FTP服务器软件,安装过程简单。
CentOS/RHEL系统
使用yum包管理器安装:
sudo yum update -y sudo yum install vsftpd -y
Ubuntu/Debian系统
使用apt包管理器安装:
sudo apt update && sudo apt upgrade -y sudo apt install vsftpd -y
安装完成后,启动vsftpd服务并设置为开机自启:
# CentOS系统 sudo systemctl start vsftpd sudo systemctl enable vsftpd # Ubuntu系统 sudo systemctl start vsftpd sudo systemctl enable vsftpd
配置vsftpd核心参数
vsftpd的主配置文件为/etc/vsftpd/vsftpd.conf,通过修改该文件可控制FTP服务的行为,建议先备份原配置文件:
sudo cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
关键配置项说明
-
允许匿名登录(默认禁止):
匿名用户无需密码即可访问,适用于公开文件共享场景,但存在安全风险,生产环境建议关闭。anonymous_enable=NO # 禁止匿名登录
-
允许本地用户登录:
系统中的合法用户可通过FTP服务访问其家目录。
local_enable=YES
-
限制用户访问目录(安全加固):
开启后,用户被限制在其家目录下,无法切换到其他目录(类似chroot效果)。chroot_local_user=YES allow_writeable_chroot=YES # 允许chroot目录下可写(需配合write_enable=YES)
-
启用文件上传功能:
write_enable=YES
-
设置被动模式端口(推荐):
主动模式(PORT)在客户端有防火墙时可能连接失败,被动模式(PASV)可解决此问题,需指定端口范围,避免与系统端口冲突。pasv_enable=YES pasv_min_port=10020 pasv_max_port=10040
-
禁止匿名用户上传和创建目录:
若匿名登录已开启,需限制其权限:anon_upload_enable=NO anon_mkdir_write_enable=NO
修改配置后,重启vsftpd服务使生效:
sudo systemctl restart vsftpd
创建FTP专用用户与权限管理
为提升安全性,建议为FTP服务创建独立用户,而非直接使用系统用户。
创建FTP用户
sudo useradd -m -s /sbin/nologin ftpuser # 创建用户,禁止SSH登录 sudo passwd ftpuser # 设置用户密码
设置用户目录权限
确保FTP用户对其家目录有读写权限,但需限制其他用户访问:
sudo chmod 755 /home/ftpuser # 目录权限:所有者rwx,组和其他用户rx sudo chown ftpuser:ftpuser /home/ftpuser # 设置目录所有者
限制用户访问特定目录(可选)
若需让用户访问指定目录(如/var/ftp/share),而非家目录:

sudo mkdir -p /var/ftp/share sudo chown -R ftpuser:ftpuser /var/ftp/share sudo usermod -d /var/ftp/share ftpuser # 修改用户家目录
防火墙与SELinux配置
防火墙开放端口
以CentOS 7+的firewalld为例:
sudo firewall-cmd --permanent --add-service=ftp # 开放FTP服务(自动处理21端口) sudo firewall-cmd --permanent --add-port=10020-10040/tcp # 开放被动模式端口 sudo firewall-cmd --reload
Ubuntu系统使用ufw:
sudo ufw allow 21/tcp sudo ufw allow 10020:10040/tcp sudo ufw reload
SELinux配置(CentOS系统)
若SELinux处于启用状态(getenforce查看),需调整策略以允许FTP服务:
sudo setsebool -P ftpd_full_access on
测试FTP服务器连接
命令行测试(Linux/macOS客户端)
ftp [服务器IP地址] # 输入用户名和密码,登录后可执行上传(put)、下载(get)、列出文件(ls)等命令
图形化工具测试(Windows客户端)
推荐使用FileZilla,在“主机”处输入服务器IP,“用户名”和“密码”为FTP账户信息,“端口”默认21,连接成功后即可拖拽文件传输。
常见问题排查
- 无法连接:检查防火墙、安全组端口是否开放,vsftpd服务是否运行(
systemctl status vsftpd)。 - 用户无法上传:确认
write_enable=YES,用户目录权限是否正确(755),SELinux策略是否生效。 - 被动模式连接失败:检查被动模式端口范围是否在防火墙中开放,客户端是否配置了相同的端口范围。
安全加固建议
- 启用SSL/TLS加密:通过配置SSL证书,实现FTP over SSL(FTPS),避免数据明文传输。
- 限制用户登录IP:在vsftpd.conf中添加
tcp_wrappers=YES,并通过/etc/hosts.allow和/etc/hosts.deny控制访问来源。 - 定期更新软件:及时更新vsftpd至最新版本,修复已知漏洞。
FAQs
Q1: 连接FTP服务器时提示“530 Login incorrect”,如何解决?
A: 可能原因包括:用户名或密码错误;用户被锁定(多次输错密码);SELinux或防火墙阻止登录,可通过以下步骤排查:
- 确认用户名密码正确(
su - ftpuser切换用户验证); - 检查
/etc/vsftpd/ftpusers和/etc/vsftpd/user_list文件,确认用户未被禁止; - 若使用SELinux,执行
getsebool -a | grep ftpd查看相关策略,必要时用setsebool调整。
Q2: 如何让FTP用户只能访问指定目录,且无法切换到上级目录?
A: 通过chroot_local_user=YES和allow_writeable_chroot=YES实现用户目录限制,若需访问非家目录的特定路径(如/data/ftp),需确保:
- 创建目录并设置权限:
mkdir -p /data/ftp && chown ftpuser:ftpuser /data/ftp && chmod 755 /data/ftp; - 修改用户家目录:
usermod -d /data/ftp ftpuser; - 确保目录及其父目录权限正确(上级目录需有rx权限,否则无法进入)。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/55213.html