CentOS 7 vsftpd.conf 配置文件详解:监听、用户、权限、被动模式与 TLS

# CentOS 7 vsftpd.conf 配置文件详解:监听、用户、权限、被动模式与 TLS

1. 服务介绍

/etc/vsftpd/vsftpd.conf 是 CentOS 7 上 vsftpd 的主配置文件,用于控制监听方式、匿名和本地用户、写入权限、目录隔离、被动端口、日志、超时及 TLS 加密。

vsftpd 配置项大多采用 参数=值,等号两侧不要留空格。配置文件中的账号策略、Linux 目录权限、防火墙和 SELinux 会共同决定最终结果。只修改一个开关,未必能完成登录或上传。

2. 准备运行环境

• 操作系统:CentOS 7.x。

• 服务软件:YUM 安装的 vsftpd

• 主配置文件:/etc/vsftpd/vsftpd.conf

• PAM 配置:/etc/pam.d/vsftpd

• 用户限制文件:/etc/vsftpd/ftpusers/etc/vsftpd/user_list

• 默认控制端口:TCP 21

• 操作权限:root 或具备 sudo 权限的管理员账号。

• 测试客户端:Linux lftp 或 Windows FTP/FTPS 客户端。

安装工具并备份配置:

bash 复制代码
yum install -y vsftpd lftp policycoreutils-python
cp -a /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak.$(date +%F-%H%M%S)
rpm -q vsftpd

查看当前生效的非注释配置:

bash 复制代码
grep -Ev '^#|^$' /etc/vsftpd/vsftpd.conf

3. 相关知识

3.1 参数格式

配置写法:

conf 复制代码
option=value

布尔值通常使用 YESNO。选项名拼写错误、值格式错误、同一选项重复出现都可能导致服务启动失败。修改后要检查 systemctl status 和 journal。CentOS 7 的 vsftpd 没有类似 nginx -t 的常用独立语法检查命令。

3.2 FTP 有控制连接和数据连接

客户端先连接 TCP 21 建立控制会话。目录列表、上传和下载使用额外数据连接。被动模式下,客户端还要连接服务器返回的高位端口,因此被动端口范围必须在配置文件、防火墙和 NAT 上保持一致。

3.3 功能开关不等于文件权限

write_enable=YES 只允许服务处理写请求。目标目录仍需具备正确属主、权限和 SELinux 类型。排障时要同时检查:

bash 复制代码
namei -l /path/to/ftp/directory
ls -Zd /path/to/ftp/directory
ausearch -m AVC -ts recent

3.4 chroot 根目录安全

chroot_local_user=YES 把本地用户限制在 FTP 根目录。安全做法:根目录由 root 管理并保持不可写,根目录下创建用户可写的 upload 子目录。allow_writeable_chroot=YES 能绕过可写根目录检查,但不应作为默认方案。

3.5 FTPS 和 SFTP

FTPS 是 FTP 加 TLS,仍使用 TCP 21 和数据端口;SFTP 是 SSH 子系统,通常使用 TCP 22。ssl_enable=YES 配置的是 FTPS,不会把 vsftpd 变成 SFTP 服务。

4. 实验步骤

4.1 监听参数

conf 复制代码
listen=YES
listen_ipv6=NO
listen_port=21

listen=YES:独立监听 IPv4。

listen_ipv6=YES:监听 IPv6 套接字;部分系统也可接受 IPv4 映射连接。

listenlisten_ipv6 不应同时设置为 YES

listen_address=10.1.100.101:只绑定指定 IPv4 地址。

listen_port=21:修改控制端口;非标准端口还要同步调整防火墙和客户端。

4.2 匿名用户参数

conf 复制代码
anonymous_enable=YES
no_anon_password=YES
anon_root=/var/ftp/pub
anon_world_readable_only=YES
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
anon_umask=022
ftp_username=ftp

anonymous_enable:允许 anonymousftp 登录。

no_anon_password:匿名登录不校验邮件格式密码。

anon_root:匿名用户根目录。

anon_world_readable_only=YES:只允许下载其他用户也可读的文件。

anon_upload_enable:允许上传,必须同时设置全局 write_enable=YES,并保证目录权限和 SELinux 允许。

anon_mkdir_write_enable:允许新建目录。

anon_other_write_enable:允许删除、重命名等其他写操作,风险高,默认应关闭。

如需匿名上传,只给独立子目录写权限:

bash 复制代码
mkdir -p /var/ftp/pub/upload
chown root:root /var/ftp/pub
chmod 755 /var/ftp/pub
chown ftp:ftp /var/ftp/pub/upload
chmod 733 /var/ftp/pub/upload
semanage fcontext -a -t public_content_rw_t '/var/ftp/pub/upload(/.*)?'
restorecon -Rv /var/ftp/pub/upload
setsebool -P ftpd_anon_write on

4.3 本地用户和写权限

conf 复制代码
local_enable=YES
write_enable=YES
local_umask=022
file_open_mode=0666
local_root=/srv/ftp/$USER

local_enable:允许 Linux 本地账号认证。

write_enable:全局写入总开关,匿名和本地用户写入都依赖它。

local_umask=022:新文件权限通常为 0666-0022=0644,新目录通常为 0777-0022=0755

file_open_mode:上传文件可用的最大权限,与 umask 共同计算。

local_root:本地用户登录后的 FTP 根目录。变量支持情况取决于具体参数组合;统一按用户名分目录时常与 user_sub_token=$USER 配合。

示例:

conf 复制代码
user_sub_token=$USER
local_root=/srv/ftp/$USER

4.4 用户目录隔离

conf 复制代码
chroot_local_user=YES
chroot_list_enable=NO
allow_writeable_chroot=NO

常见组合:

| chroot_local_user | chroot_list_enable | 结果 |

|---|---|---|

| YES | NO | 所有本地用户被限制在根目录 |

| YES | YES | 默认限制;chroot_list_file 中用户作为例外,不限制 |

| NO | YES | 默认不限制;列表中用户被限制 |

| NO | NO | 所有用户不限制,不推荐 |

启用列表时指定:

conf 复制代码
chroot_list_file=/etc/vsftpd/chroot_list

用户根目录建议这样创建:

bash 复制代码
mkdir -p /srv/ftp/qwe/upload
chown root:root /srv/ftp/qwe
chmod 755 /srv/ftp/qwe
chown qwe:qwe /srv/ftp/qwe/upload
chmod 750 /srv/ftp/qwe/upload

4.5 ftpusers 与 user_list

/etc/vsftpd/ftpusers 通常由 PAM 使用,列出的高权限或系统账号禁止 FTP 登录。不要删除其中的 root 等账号。

userlist_enableuserlist_deny 控制 /etc/vsftpd/user_list

conf 复制代码
userlist_enable=YES
userlist_deny=YES
userlist_file=/etc/vsftpd/user_list

此时列表是黑名单。改为白名单:

conf 复制代码
userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd/user_list

白名单模式下,仅列表内用户可继续认证。修改前确认管理账号,避免把所有用户拒绝在外。

4.6 被动模式和 NAT

conf 复制代码
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=31000

服务器位于 NAT 后,客户端需要访问公网地址时增加:

conf 复制代码
pasv_address=203.0.113.10
pasv_addr_resolve=NO

使用域名作为被动地址时:

conf 复制代码
pasv_address=ftp.example.com
pasv_addr_resolve=YES

放行防火墙:

bash 复制代码
firewall-cmd --permanent --add-service=ftp
firewall-cmd --permanent --add-port=30000-31000/tcp
firewall-cmd --reload

4.7 主动模式和数据端口

conf 复制代码
connect_from_port_20=YES
ftp_data_port=20
port_enable=YES

connect_from_port_20:主动模式数据连接从 TCP 20 发起。

port_enable:允许 PORT 主动模式。

• 客户端处于 NAT 或严格防火墙后时,优先使用被动模式。

4.8 日志参数

conf 复制代码
xferlog_enable=YES
xferlog_std_format=YES
xferlog_file=/var/log/xferlog
dual_log_enable=YES
vsftpd_log_file=/var/log/vsftpd.log
log_ftp_protocol=YES
syslog_enable=NO

xferlog_enable:记录上传和下载。

xferlog_std_format:使用标准 xferlog 格式。

dual_log_enable:同时写标准传输日志和 vsftpd 自有日志。

log_ftp_protocol:记录 FTP 请求和响应,排障有用,但日志量更大,也可能记录敏感操作信息。

syslog_enable=YES:把 vsftpd 日志写入系统日志,而不是独立日志文件。

4.9 超时和连接限制

conf 复制代码
idle_session_timeout=600
data_connection_timeout=120
accept_timeout=60
connect_timeout=60
max_clients=100
max_per_ip=10
local_max_rate=0
anon_max_rate=1048576

idle_session_timeout:控制会话空闲超时,单位秒。

data_connection_timeout:数据连接超时。

max_clients:总客户端上限,0 表示不限制。

max_per_ip:单 IP 并发上限。

local_max_rateanon_max_rate:每秒字节数,0 表示不限速。

4.10 虚拟用户参数

conf 复制代码
guest_enable=YES
guest_username=ftpvirtual
virtual_use_local_privs=YES
pam_service_name=vsftpd-virtual
user_sub_token=$USER
local_root=/srv/ftp/virtual/$USER
user_config_dir=/etc/vsftpd/vconfig

guest_enable:把非匿名登录映射为宿主账号。

guest_username:虚拟用户统一映射到的 Linux 账号。

virtual_use_local_privs=YES:虚拟用户使用本地用户权限模型;设为 NO 时更接近匿名用户权限模型。

pam_service_name:对应 /etc/pam.d/ 下的 PAM 文件名。

user_config_dir:每个用户单独配置目录,文件名必须与登录用户名一致。

4.11 TLS 参数

conf 复制代码
ssl_enable=YES
rsa_cert_file=/etc/pki/tls/certs/vsftpd.crt
rsa_private_key_file=/etc/pki/tls/private/vsftpd.key
force_local_logins_ssl=YES
force_local_data_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
require_ssl_reuse=NO

ssl_enable:启用 FTPS。

force_local_logins_ssl:本地用户登录必须加密。

force_local_data_ssl:本地用户数据连接必须加密。

require_ssl_reuse=NO:解决部分客户端不支持 TLS 会话复用的问题,但会降低严格性;应先测试客户端兼容性。

• 私钥权限建议设置为 600

CentOS 7 自带 vsftpd/OpenSSL 较旧。面向公网前应评估系统生命周期、TLS 协议和密码套件,不应继续使用 SSLv2、SSLv3。

4.12 欢迎信息与目录消息

conf 复制代码
ftpd_banner=Authorized FTP service only.
dirmessage_enable=YES
message_file=.message

登录欢迎语不要暴露系统版本、内部地址或运维联系人私人信息。目录中的 .message 可用于说明上传规则。

4.13 不建议继续依赖 tcp_wrappers

旧配置常见:

conf 复制代码
tcp_wrappers=YES

该功能依赖编译选项和系统 libwrap 支持,新版本生态已逐步弃用。CentOS 7 实验可验证是否生效,但生产访问控制应优先使用 firewalld、上级防火墙和明确的来源网段策略,不应只依赖 /etc/hosts.allow/etc/hosts.deny

4.14 完整安全基线示例

conf 复制代码
listen=YES
listen_ipv6=NO
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
use_localtime=YES

chroot_local_user=YES
allow_writeable_chroot=NO
user_sub_token=$USER
local_root=/srv/ftp/$USER

userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd/user_list
pam_service_name=vsftpd

pasv_enable=YES
pasv_min_port=30000
pasv_max_port=31000

xferlog_enable=YES
xferlog_std_format=YES
dual_log_enable=YES
log_ftp_protocol=YES

idle_session_timeout=600
data_connection_timeout=120
max_clients=100
max_per_ip=10

应用配置:

bash 复制代码
systemctl restart vsftpd
systemctl status vsftpd --no-pager

如果重启失败,立即恢复备份并查看日志,不要反复覆盖配置:

bash 复制代码
journalctl -u vsftpd -n 100 --no-pager

5. 验证结果

5.1 服务端状态

bash 复制代码
systemctl status vsftpd --no-pager
ss -lntp | grep ':21'
firewall-cmd --list-services
firewall-cmd --list-ports
journalctl -u vsftpd -n 80 --no-pager

预期:服务为 active (running),TCP 21 监听正常,被动端口已放行,日志无持续启动错误。

5.2 配置核对

bash 复制代码
grep -Ev '^#|^$' /etc/vsftpd/vsftpd.conf
systemctl cat vsftpd
rpm -q vsftpd

确认没有重复冲突参数,systemd 启动命令使用预期配置文件。

5.3 客户端连接

Linux 客户端:

bash 复制代码
lftp -u qwe ftp://10.1.100.101

Windows 客户端:

powershell 复制代码
Test-NetConnection 10.1.100.101 -Port 21
ftp 10.1.100.101

登录后测试:

text 复制代码
pwd
ls
cd upload
put test.txt
get test.txt
cd ..

5.4 被动模式验证

lftp 中执行:

text 复制代码
set ftp:passive-mode true
ls
put test.txt

服务端同时查看连接:

bash 复制代码
ss -ntp | grep vsftpd

预期除 TCP 21 外,还能看到配置范围内的数据连接端口。若能登录但 ls 卡住,优先检查被动端口、防火墙和 NAT 地址。

5.5 日志和权限验证

bash 复制代码
tail -n 100 /var/log/xferlog
tail -n 100 /var/log/vsftpd.log 2>/dev/null
namei -l /srv/ftp/qwe/upload
ls -Zd /srv/ftp/qwe/upload
ausearch -m AVC -ts recent

530 Login incorrect:检查密码、PAM、ftpusersuser_list

500 OOPS:检查错误参数、重复选项和 chroot 根目录写权限。

550 Permission denied:检查 write_enable、目录权限和 SELinux。

• 登录成功但目录列表超时:检查被动端口范围、防火墙、NAT 和客户端模式。

• FTPS 握手失败:检查证书路径、私钥权限、协议版本及客户端是否使用显式 FTPS。

相关推荐
风曦Kisaki1 小时前
Kubernetes(K8s)笔记Day04:控制器(ReplicaSet 与Deployment),滚动更新及回滚,滚动更新策略,Pod 的 DNS 策略
linux·运维·笔记·docker·容器·kubernetes
code_whiter1 小时前
初阶linux2环境基础开发工具完整教程
linux
薛定e的猫咪1 小时前
零基础选型指南:Make / 扣子 Coze/n8n/Dify 四大自动化平台完整对比
运维·自动化
AmazingEgg1 小时前
RHCSA 第三天学习笔记
linux
数聚天成DeepSData1 小时前
外贸海关进出口数据去哪免费下载?从统计到明细的查找指南
linux·服务器·开发语言·前端·网络·人工智能·自然语言处理
Huangjin007_1 小时前
【Linux 系统篇(十)】基础开发工具(五) —— 第一个系统程序 - 进度条
linux·运维·服务器
MetrixAeroCore2 小时前
出海餐厅手持POS机物联网卡:多币种计费稳定传输与跨境税务合规对接方案
运维
路由侠内网穿透.2 小时前
本地部署开源日志收集系统 Log Bull 并实现外部访问
运维·服务器·网络·数据库·开源
时空无限2 小时前
linux mellanox 网卡队列 irq rps 相关
linux·运维