Linux vsftpd 防火墙设置与安全加固指南
一 防火墙放行与模式选择
- 明确 FTP 的两种数据通道:控制通道为21/TCP;主动模式数据通道由服务器从20/TCP主动连客户端;被动模式数据通道由服务器在配置的端口范围内监听,客户端来连。若使用显式 FTPS,控制通道通常为990/TCP。为减少攻击面,建议禁用匿名访问,仅开放必要端口与网段。
- firewalld 示例(推荐固定被动端口范围,便于精确放行):
- 放行控制端口与被动端口段(示例范围:40000–50000/TCP)
- firewall-cmd --permanent --add-port=21/tcp
- firewall-cmd --permanent --add-port=40000-50000/tcp
- firewall-cmd --reload
- 如需显式 FTPS,额外放行:firewall-cmd --permanent --add-port=990/tcp && firewall-cmd --reload
- 按需限制来源 IP(示例仅允许办公网段):
- firewall-cmd --permanent --zone=public --add-rich-rule=‘rule family=“ipv4” source address=“203.0.113.0/24” port port=“21” protocol=“tcp” accept’
- firewall-cmd --permanent --zone=public --add-rich-rule=‘rule family=“ipv4” source address=“203.0.113.0/24” port port=“40000-50000” protocol=“tcp” accept’
- firewall-cmd --reload
- UFW 示例(Debian/Ubuntu 常用):
- 放行控制端口与被动端口段:ufw allow 21/tcp;ufw allow 40000:50000/tcp
- 如需显式 FTPS:ufw allow 990/tcp
- 启用防火墙:ufw enable
- 主动模式与被动模式要点:
- 主动模式需服务器主动出站到客户端高位端口,通常需放行服务器20/TCP出站(云环境/严格 egress 策略下可能受限)。
- 被动模式更利于穿越防火墙/NAT,务必固定并放行被动端口段,否则会出现“能登录但列目录失败”。
二 使用连接追踪简化被动模式放行(可选)
- 若不想固定被动端口段,可启用内核连接追踪模块以自动放行 FTP 数据连接(适合测试或端口不固定的环境):
- 加载模块:modprobe nf_conntrack_ftp
- 持久化(RHEL/CentOS):在 /etc/sysconfig/iptables-config 中加入:IPTABLES_MODULES=“nf_conntrack_ftp”
- 放行控制端口并允许已建立/相关连接:
- iptables -I INPUT -p tcp --dport 21 -j ACCEPT
- iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
- 注意:连接追踪对 FTP 的控制通道有依赖,且在高并发/复杂 NAT 场景下可能不如“固定被动端口段”稳定。
三 vsftpd 关键配置与防火墙联动
- 建议的基础安全配置(/etc/vsftpd.conf):
- 禁用匿名、启用本地用户、限制在家目录、按需开启写入:
- anonymous_enable=NO
- local_enable=YES
- chroot_local_user=YES
- allow_writeable_chroot=YES(vsftpd ≥ 3.0.2 推荐;旧版本可用“写权限+不可写根”的替代方案)
- write_enable=YES(仅在确需上传时开启)
- 启用并固定被动端口范围(与防火墙放行保持一致):
- pasv_enable=YES
- pasv_min_port=40000
- pasv_max_port=50000
- pasv_address=SERVER_PUBLIC_IP(NAT/云主机建议显式指定公网地址)
- 显式 FTPS(推荐):生成证书并启用加密
- 生成自签名证书(示例):
- openssl req -x509 -nodes -days 365 -newkey rsa:2048
-keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem
- vsftpd.conf 关键项:
- ssl_enable=YES
- allow_anon_ssl=NO
- force_local_logins_ssl=YES
- force_local_data_ssl=YES
- rsa_cert_file=/etc/ssl/private/vsftpd.pem
- rsa_private_key_file=/etc/ssl/private/vsftpd.pem
- 重启服务使配置生效:systemctl restart vsftpd
- 客户端连接:选择“FTP - 显式 TLS/SSL”,端口21(或990用于隐式 FTPS)。
四 访问控制与入侵防护
- 基于 IP 的访问控制(防火墙层面优先,vsftpd 作为补充):
- firewalld 富规则示例(仅允许白名单网段访问 21/TCP 与被动端口段):
- firewall-cmd --permanent --zone=public --add-rich-rule=‘rule family=“ipv4” source address=“203.0.113.0/24” port port=“21” protocol=“tcp” accept’
- firewall-cmd --permanent --zone=public --add-rich-rule=‘rule family=“ipv4” source address=“203.0.113.0/24” port port=“40000-50000” protocol=“tcp” accept’
- firewall-cmd --reload
- 防暴力破解与登录审计:
- 使用 Fail2Ban 监控日志并自动封禁:
- 配置 jail(/etc/fail2ban/jail.local 或 /etc/fail2ban/jail.d/vsftpd.local):
- [vsftpd]
- enabled = true
- port = ftp
- filter = vsftpd
- logpath = /var/log/vsftpd.log
- maxretry = 3
- bantime = 600
- 重启:systemctl restart fail2ban
- SELinux 场景(RHEL/CentOS):
- 启用策略以允许 FTP 访问:setsebool -P ftpd_full_access=on
- 如涉及家目录访问:setsebool -P ftp_home_dir on
- 系统加固补充:
- 仅使用专用 FTP 用户,禁止其 SSH 登录(如:useradd -m -d /home/ftpuser -s /usr/sbin/nologin ftpuser)
- 定期更新系统与 vsftpd,关注日志(如 /var/log/vsftpd.log)。
五 快速排错与验证
- 能登录但“列目录失败”或数据通道不通:检查被动端口段是否在 vsftpd 与防火墙中一致放行;NAT/云主机设置 pasv_address;必要时改用“连接追踪”方案。
- 客户端提示“不安全的服务器”:在客户端选择“显式 TLS/SSL”,并确认服务器证书与端口配置正确。
- 服务与规则验证:
- 服务状态:systemctl status vsftpd
- 端口监听:ss -lntp | grep :21(或 :990 / 被动端口段)
- 防火墙状态:firewall-cmd --list-all 或 ufw status
- 主动模式测试:客户端执行 passive 关闭被动模式后尝试传输,验证服务器20/TCP出站与客户端防火墙策略是否允许。