小易说IT 小易说IT

Linux vsftpd 安装配置保姆级教程

vsftpd:Very Secure FTP Daemon,主流轻量 FTP 服务;下面分 Ubuntu/Debian、CentOS/RHEL/openEuler/ 麒麟 两套,附带完整配置、防火墙、被动模式、用户权限、开机自启。 ⚠️ 注意:FTP 明文传输,生产优先 sftp;如果必须用 FTP,尽量搭配 SSL(ftps)。

一、Ubuntu / Debian(含 WSL Ubuntu)

1. 安装

apt update
apt install vsftpd -y

2. 查看状态 & 开机自启

# 查看状态
systemctl status vsftpd
# 开机自启
systemctl enable --now vsftpd

二、CentOS7 / RHEL7 /openEuler/ 银河麒麟(rpm 系)

# CentOS7
yum install vsftpd -y
# CentOS8+/openEuler
dnf install vsftpd -y

# 启动+开机自启
systemctl enable --now vsftpd
systemctl status vsftpd

三、前置准备:创建 FTP 用户(推荐独立用户,不要用 root)

# 创建用户 ftpuser,指定家目录 /data/ftp
useradd -d /data/ftp -s /sbin/nologin ftpuser
# 设置密码
passwd ftpuser
# 创建目录并授权
mkdir -p /data/ftp
chown ftpuser:ftpuser /data/ftp
chmod 755 /data/ftp

-s /sbin/nologin:禁止 ssh 登录,只能 ftp 登录,安全最佳实践

四、主配置文件 /etc/vsftpd.conf(Ubuntu) | /etc/vsftpd/vsftpd.conf(CentOS/openEuler)

先备份!必做

# Debian/Ubuntu
cp /etc/vsftpd.conf /etc/vsftpd.conf.bak

# CentOS/openEuler
cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak

基础可用配置(本地用户登录,被动模式,禁止匿名)

打开编辑 vim /etc/vsftpd.conf

# 关闭匿名访问(安全)
anonymous_enable=NO
# 允许本地系统用户登录
local_enable=YES
# 开启上传写入
write_enable=YES
# 本地用户umask,文件权限 644,目录755
local_umask=022
# 开启被动模式(路由器/防火墙必须,客户端最常用)
pasv_enable=YES
# 被动端口范围,防火墙放行这个区间
pasv_min_port=40000
pasv_max_port=40100
# 被动模式对外IP(云服务器填公网IP,内网不用改)
# pasv_address=你的公网IP
# 禁锢用户在家目录(chroot,防止跳出目录,强烈开启)
chroot_local_user=YES
# chroot需要目录不能是可写!
allow_writeable_chroot=NO

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

# 监听IPv4
listen=YES
listen_ipv6=NO

✅ 重点坑:chroot_local_user=YES 时,用户根目录不能是 777 可写,否则拒绝登录! 刚才我们 /data/ftp 权限 755 是没问题的。

配置修改后重载服务

# Ubuntu/Debian
systemctl restart vsftpd

# CentOS/openEuler
systemctl restart vsftpd

五、防火墙放行端口

FTP 需要 21 端口(控制端口) + 被动端口区间 40000-40100

ufw(Ubuntu)

ufw allow 21/tcp
ufw allow 40000:40100/tcp
ufw reload

firewalld(CentOS/openEuler)

firewall-cmd --add-service=ftp --permanent
firewall-cmd --add-port=40000-40100/tcp --permanent
firewall-cmd --reload

云服务器(阿里云 / 腾讯云):控制台安全组也要放行 21 + 40000-40100,很多人卡在这!

六、测试连接

客户端:FileZilla、xftp

  • 协议:FTP

  • 主机:服务器 IP

  • 端口:21

  • 用户:ftpuser

  • 密码:刚才设置的密码

七、常见问题 & 排错

  1. 500 OOPS: vsftpd: refusing to run with writable root inside chroot() 原因:家目录权限 777 修复:chmod 755 /data/ftp

  2. 能连上,但是列表卡住、无法打开目录 → 被动端口没放行、pasv_address 公网 IP 没配置(云服务器必配)

  3. 匿名登录 需要把 anonymous_enable=YES,不推荐生产使用

八、可选:FTP over TLS(FTPS 加密,替代明文 FTP)

在 vsftpd.conf 追加:

ssl_enable=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1_2=YES
ssl_sslv2=NO
ssl_sslv3=NO
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key

客户端连接方式改成 FTPS(显式,端口 21)