一、安装 vsftpd
1. RPM 系(AlmaLinux、CentOS、麒麟服务器)
方式 1:yum 在线安装(推荐) bash 运行 yum install -y vsftpd 方式 2:离线安装(无外网服务器) 有网机器下载 rpm 包 yum install --downloadonly --downloaddir=/tmp/vsftpd vsftpd 将 /tmp/vsftpd 文件夹传到麒麟服务器 离线安装 cd /tmp/vsftpd rpm -ivh *.rpm --nodeps2. 设置开机自启、启动服务
# 开机自启 systemctl enable vsftpd # 启动服务 systemctl start vsftpd # 查看运行状态 systemctl status vsftpd二、核心配置文件说明
主配置文件:/etc/vsftpd/vsftpd.conf黑白名单文件:
/etc/vsftpd/user_list:黑名单,匹配用户直接断开连接,不弹出密码框/etc/vsftpd/ftpusers:终极黑名单,PAM 层拦截,不受配置控制,root 永久在此
三、修改完整可用配置(覆盖默认缺陷,生产标准)
vim /etc/vsftpd/vsftpd.conf全部替换为下面内容:
# 关闭匿名登录 anonymous_enable=NO # 允许系统本地账号登录 local_enable=YES # 开启上传、新建、删除权限 write_enable=YES # 上传文件权限 644,文件夹755 local_umask=022 # 目录提示、传输日志 dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES xferlog_std_format=YES # 核心安全:禁锢用户家目录,防止访问系统文件 chroot_local_user=YES allow_writeable_chroot=YES # 被动模式端口范围(FileZilla等客户端默认使用) pasv_min_port=40000 pasv_max_port=50000 # 监听IPv4,关闭纯IPv6监听(Windows客户端才能连上) listen=YES listen_ipv6=NO # 认证与黑名单开关 pam_service_name=vsftpd userlist_enable=YES # 关闭反向解析,加快连接速度 reverse_lookup_enable=NO # 禁止递归ls,降低服务器IO压力 ls_recurse_enable=NO配置生效
systemctl restart vsftpd四、防火墙放行端口(必须操作,否则外网连不上)
FTP 控制端口 21,被动数据端口 40000-50000
# 永久放行端口 firewall-cmd --permanent --add-port=21/tcp firewall-cmd --permanent --add-port=40000-50000/tcp # 重载防火墙规则 firewall-cmd --reload # 验证端口是否放行 firewall-cmd --list-ports五、关闭 SELinux(避免上传 / 目录权限报错)
# 临时关闭,重启失效 setenforce 0 # 永久关闭 sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config六、创建 FTP 专用登录账号(禁止 root 登录 FTP)
1. 创建用户 + 指定文件存储目录
# 创建ftpuser用户,家目录/data/ftp_file(FTP虚拟根目录) useradd -d /data/ftp_file ftpuser # 设置登录密码(FTP登录密码和系统密码一致) passwd ftpuser输入两次密码,即为客户端 FTP 登录密码。
2. 目录权限修复(防 500 chroot 报错)
# 目录归属为ftpuser chown ftpuser:ftpuser /data/ftp_file # 权限755,不能777 chmod 755 /data/ftp_file七、黑白名单规则说明(默认无需修改)
/etc/vsftpd/user_list内 root、bin、daemon、nobody 等系统账号:直接拒绝连接/etc/vsftpd/ftpusers同上名单:二次拦截,哪怕删除 user_list 里的 root 也无法登录- 自建用户 ftpuser 不在两份名单,可正常登录
可选:白名单模式(只允许指定用户登录)
如需严格管控,修改 vsftpd.conf 增加一行
userlist_deny=NO然后清空user_list,只写入允许登录的账号:
ftpuser testuser重启服务后,只有文件内用户能登录 FTP。
八、主动模式 / 被动模式区分
- 控制通道固定 21 端口:传输账号、ls、cd 等命令
- 被动模式(推荐,FileZilla / 浏览器默认)客户端主动连服务器 40000-50000 端口传输文件,适配内网、家庭宽带、云服务器,无 NAT 拦截问题。
- 主动模式(不推荐)服务器 20 端口主动连客户端,家用路由器会拦截,现象:能登录,但看不到文件列表。
九、登录后目录逻辑(重点)
配置开启chroot_local_user=YES禁锢后:
- 客户端 FTP 里看到的虚拟根
/= 服务器物理路径/data/ftp_file - 用户无法 cd 切换到 /etc、/usr、/root等系统目录,只能操作 /data/ftp_file 内部文件
- 所有上传下载文件全部保存在 /data/ftp_file 下
如果注释掉 chroot 两行(默认裸配置): 仅默认进入 /data/ftp_file,但可随意浏览服务器全部系统文件,极度不安全。
十、客户端连接操作(FileZilla 为例)
- 协议:FTP
- 主机:服务器 IP
- 端口:21
- 用户:ftpuser
- 密码:你 passwd 设置的密码
- 传输设置:保持默认「被动模式」 连接成功后,只能看到 /data/ftp_file 内的文件,无法访问服务器系统目录。
十一、常见故障快速排查
- 客户端连不上 FTP:listen=NO(只监听 IPv6)、防火墙 21 端口未放行
- 登录成功看不到文件列表:未配置 pasv 端口、防火墙 40000-50000 未放行
- 登录报 500 OOPS: chroot:缺少 allow_writeable_chroot=YES 或目录权限 777
- 账号 root 无法登录:属于黑名单机制,正常安全设计,不要解除
- 无法上传文件:write_enable=NO、目录归属不是 ftpuser、SELinux 拦截