快速搭建FTP服务

10 分钟搭好 FTP:装包、添用户、拷脚本、开防火墙,本地验证登录。

1. 安装 vsftpd

sudo yum -y install vsftpd   # CentOS 7/8
# Ubuntu/Debian 用 sudo apt -y install vsftpd

2. 建系统用户

sudo adduser blazehu
sudo passwd blazehu

3. 目录准备

sudo mkdir -p /data/client
sudo chown -R blazehu:blazehu /data/client
sudo chmod 755 /data/client

4. 配置 vsftpd

sudo mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
sudo tee /etc/vsftpd/vsftpd.conf >/dev/null <<'EOF'
#==========================================
# vsftpd 最小可用模板(系统账号 + 被动模式)
# 适用:CentOS 7/8 | Rocky | Alma | RHEL
#==========================================

# 关闭匿名登录
anonymous_enable=NO

# 允许系统账号登录
local_enable=YES
# 上传/删除/重命名总开关
write_enable=YES
# 新建文件 644,目录 755
local_umask=022

# 进入目录时显示 .message 文件(如有)
dirmessage_enable=YES
# 记录上传/下载日志
xferlog_enable=YES
# 使用标准 xferlog 格式
xferlog_std_format=YES
# PORT 模式数据端口 20
connect_from_port_20=YES
# 独立守护进程(IPv4)
listen=YES

# 使用 /etc/pam.d/vsftpd 认证
pam_service_name=vsftpd
# 启用白名单
userlist_enable=YES
# NO=仅允许 user_list 内用户登录
userlist_deny=NO
# 支持 /etc/hosts.allow|deny 访问控制
tcp_wrappers=YES

# 强制登录后落在 /data/client,不再进系统家目录
local_root=/data/client
# 所有用户被锁在家目录
chroot_local_user=YES
# 家目录可写时也接受(必加,否则 530)
allow_writeable_chroot=YES
# 启用“例外名单”
chroot_list_enable=YES
# 文件内用户不被禁锢(留空=全员禁锢)
chroot_list_file=/etc/vsftpd/chroot_list

# 开启被动模式
pasv_enable=YES
# 数据端口下限
pasv_min_port=20000
# 数据端口上限(共 11 个端口够用)
pasv_max_port=20010
EOF

5. 白名单 & 空例外文件

echo blazehu > /etc/vsftpd/user_list
sudo touch /etc/vsftpd/chroot_list # 留空 = 全部用户都被 chroot

6. 防火墙

sudo firewall-cmd --permanent --add-service=ftp           # 放行 21
sudo firewall-cmd --permanent --add-port=20000-20010/tcp # 被动端口段
sudo firewall-cmd --reload

7. 重载

sudo systemctl restart vsftpd
systemctl status vsftpd

8. 验证

[blazehu@centos7 ~]$ ftp 127.0.0.1
Connected to 127.0.0.1 (127.0.0.1).
220 (vsFTPd 3.0.2)
Name (127.0.0.1:blazehu): blazehu
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.

9.匿名下载

后续如果希望开启匿名下载需要添加以下配置:

#======== 匿名只读下载(与系统用户同目录) ========
anonymous_enable=YES
no_anon_password=YES
anon_world_readable_only=NO
# 把匿名根目录强行指到系统用户目录
anon_root=/data/client
# 以下两行显式关闭匿名写权限,覆盖全局 write_enable=YES
anon_upload_enable=NO
anon_mkdir_write_enable=NO

更新名单:

echo ftp >> /etc/vsftpd/user_list
echo ftp >> /etc/vsftpd/chroot_list
# 同时兼容 macOS 的 anonymous
echo anonymous >> /etc/vsftpd/user_list
echo anonymous >> /etc/vsftpd/chroot_list