Ubuntu 上 vsftpd 启用 SSL 加密
一 准备与证书
- 安装组件:sudo apt update && sudo apt install vsftpd openssl。
- 证书方案(二选一):
- 自签名(测试/内网):
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048
-keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/certs/vsftpd.pem
提示输入国家、组织等信息;生产环境不建议长期使用自签名。
- Let’s Encrypt(公网/可被信任):
sudo apt install certbot python3-certbot-nginx
sudo certbot certonly --standalone -d yourdomain.com
证书路径:/etc/letsencrypt/live/yourdomain.com/fullchain.pem 与 privkey.pem。
二 配置 vsftpd 启用 SSL
- 编辑配置文件:sudo nano /etc/vsftpd.conf,建议的基础与 SSL 关键项如下:
- 基础与访问
- listen=YES
- anonymous_enable=NO
- local_enable=YES
- write_enable=YES
- chroot_local_user=YES
- pam_service_name=vsftpd
- SSL/TLS
- ssl_enable=YES
- allow_anon_ssl=NO
- force_local_data_ssl=YES
- force_local_logins_ssl=YES
- ssl_tlsv1=YES
- ssl_sslv2=NO
- ssl_sslv3=NO
- rsa_cert_file=/etc/letsencrypt/live/yourdomain.com/fullchain.pem(或 /etc/ssl/certs/vsftpd.pem)
- rsa_private_key_file=/etc/letsencrypt/live/yourdomain.com/privkey.pem(或 /etc/ssl/private/vsftpd.pem)
- 说明:上述组合启用显式 FTPS(FTP over SSL/TLS),并强制本地用户登录与数据传输均使用加密。
三 防火墙与被动模式端口
- 放行端口(UFW 示例):sudo ufw allow 21/tcp;sudo ufw allow 990/tcp;sudo ufw reload。
- 被动模式(如启用)需开放一段高位端口,并在 vsftpd.conf 中设置:
- pasv_enable=YES
- pasv_min_port=10090
- pasv_max_port=10100
同时在防火墙放行该端口段:sudo ufw allow 10090:10100/tcp。
四 验证与客户端连接
- 命令行验证 SSL 握手:
openssl s_client -connect your_server_ip:21 -starttls ftp
看到 TLS 握手与证书链信息即表明 SSL 配置生效。
- 图形客户端(FileZilla):协议选择 FTP - FTPS(显式),主机填域名或 IP,端口 21,输入用户名与密码连接;若使用自签名证书,首次会提示信任。
- 服务重启与状态:
sudo systemctl restart vsftpd;sudo systemctl status vsftpd。
五 常见问题与优化
- 协议选择:vsftpd 的 SSL 配置对应显式 FTPS(FTPES,端口 21 + STARTTLS),并非 SFTP(基于 SSH 的 22 端口)。
- 证书权限:证书与私钥建议权限为 600,属主 root,防止其他用户读取私钥。
- 加密套件与协议:生产环境建议仅启用 TLSv1.2/1.3,禁用 SSLv2/3 与不安全套件;可结合 ssl_ciphers 限制为 HIGH。
- 被动端口范围:若客户端在 NAT/云环境,务必正确设置 pasv_min_port/pasv_max_port 并在防火墙放行,否则数据通道会失败。
- 证书更新:Let’s Encrypt 证书有效期 90 天,建议配置自动续期(如 systemd 定时器或 certbot 续期钩子),续期后重启 vsftpd 使新证书生效。