启用TLS前必须禁用匿名登录并启用本地用户,证书须合并为无密钥PEM文件,强制显式FTPS并配置SSL选项,同步调整SELinux策略与防火墙被动端口范围。

vsftpd 启用 TLS 加密前必须关闭匿名登录
默认配置下 vsftpd 允许匿名访问,但启用 TLS 后若未显式禁用,客户端可能绕过证书验证直接连入,导致“加密形同虚设”。必须确认 /etc/vsftpd.conf 中包含以下两项:
anonymous_enable=NO-
local_enable=YES(否则本地用户也无法登录)
仅设置 ssl_enable=YES 不足以保证安全——匿名入口不关,加密通道就只是给非法访问加了个“锁屏密码”。
生成符合 vsftpd 要求的 PEM 格证书文件
vsftpd 不支持单独的密钥 + 证书双文件加载,必须合并为单个 rsa_cert_file 指向的 PEM 文件,且私钥不能加密(即无密码保护)。常见错误是用 openssl req -newkey rsa:2048 -keyout key.pem -x509 -out cert.pem 分开生成,再错误地只配置 rsa_cert_file=/path/to/cert.pem。
正确做法是:
- 执行
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.key -out /etc/ssl/private/vsftpd.crt - 合并:
cat /etc/ssl/private/vsftpd.crt /etc/ssl/private/vsftpd.key > /etc/ssl/private/vsftpd.pem - 在配置中设
rsa_cert_file=/etc/ssl/private/vsftpd.pem,并确保权限为600(chown root:root+chmod 600)
强制客户端使用显式 FTPS(AUTH TLS)而非隐式 FTPS
隐式 FTPS(端口 990)已被现代客户端广泛弃用,且 vsftpd 自 3.0.0 起默认禁用 implicit_ssl。强行开启不仅增加配置复杂度,还会让 FileZilla、curl 等工具报 Could not connect to server。
应使用显式模式,并在配置中明确:
ssl_enable=YES-
allow_anonymous_ssl=NO(再次强调) -
force_local_data_ssl=YES(数据连接也加密) -
force_local_logins_ssl=YES(登录凭据加密) -
ssl_tlsv1=YES(可选,禁用 SSLv2/v3,但至少保留 TLSv1.2)
客户端连接时需指定协议为 ftps:// 或在 FileZilla 中选择“Require explicit FTP over TLS”。
SELinux 和防火墙放行 FTPS 的被动端口范围
启用 TLS 后,被动模式(PASV)的数据连接仍走非标准端口,而 SELinux 默认阻止 vsftpd 绑定高位端口,防火墙也不放行——这会导致客户端卡在 Retrieving directory listing...。
必须同步处理两处:
- 修改 SELinux 策略:
setsebool -P ftpd_full_access on(或更细粒度地setsebool -P allow_ftpd_anon_write off; setsebool -P allow_ftpd_full_access on) - 在
/etc/vsftpd.conf中定义被动端口段,例如:pasv_min_port=50000,pasv_max_port=50100 - 开放对应端口:
firewall-cmd --permanent --add-port=50000-50100/tcp,然后firewall-cmd --reload
漏掉任意一项,FTP 客户端都能连上控制通道(21 端口),但列目录或传文件会静默失败。











