CentOS 上 VSFTP 连接超时的定位与解决
一、快速判断与定位
- 先确认服务是否运行:sudo systemctl status vsftpd,未运行则启动:sudo systemctl start vsftpd。
- 测试连通与端口:用 ping 检查网络,用 telnet 服务器IP 21 或 nc -vz 服务器IP 21 验证 21 端口是否可达。
- 查看监听与日志:执行 netstat -tulpen | grep :21 确认端口监听;排查 /var/log/vsftpd.log、/var/log/messages 中的错误信息(如 530 Login incorrect、目录权限拒绝等)。
- 若登录很慢,可在 /etc/vsftpd/vsftpd.conf 加入 reverse_lookup_enable=NO 禁用 DNS 反向解析,重启服务后再测。
二、最常见根因与对应修复
- 被动模式端口未放行(出现“227 Entering Passive Mode …”后 LIST 超时/读取目录失败)
- 在 /etc/vsftpd/vsftpd.conf 开启并限定被动端口范围:
pasv_enable=YES
pasv_min_port=10060
pasv_max_port=10070
- 放行防火墙端口(firewalld):
sudo firewall-cmd --permanent --add-port=21/tcp
sudo firewall-cmd --permanent --add-port=10060-10070/tcp
sudo firewall-cmd --reload
- 如使用云厂商安全组,同样放行 21 与 10060-10070。
- 重启服务:sudo systemctl restart vsftpd。
- 主动模式被 NAT/防火墙拦截(PORT 命令后数据连接失败)
- 建议优先使用被动模式(见上)。
- 若必须用主动模式,需确保服务器侧 20/tcp 出站到客户端高位端口、客户端侧放行相应入站规则;多数 NAT/云环境更推荐被动模式。
- 端口或安全策略阻断
- 传统 iptables 场景需显式放行 21 与被动端口段(如 -A INPUT -p tcp --dport 5555:5566 -j ACCEPT),再重启服务。
- 云服务器需同时在安全组放行对应端口。
三、配置优化与超时参数
- 调整会话与数据超时(按需设置,避免过短导致频繁中断):
connect_timeout=120
idle_session_timeout=300
data_connection_timeout=120
修改 /etc/vsftpd/vsftpd.conf 后重启:sudo systemctl restart vsftpd。
- 登录慢的优化:在 vsftpd.conf 加入 reverse_lookup_enable=NO,可显著减少登录等待。
四、NAT 与公网访问场景
- 指定外网返回地址:在 vsftpd.conf 设置 pasv_address=你的公网IP,避免客户端拿到内网地址无法回连。
- 映射被动端口:将 pasv_min_port ~ pasv_max_port 的端口段在网关/NAT/安全组做一对一映射(如 22221-22222),并在配置中保持一致。
- 示例(外网直连场景):
pasv_enable=YES
pasv_address=61.149.7.198
pasv_min_port=22221
pasv_max_port=22222
保存后重启服务并在边界设备完成端口映射。
五、SELinux 与权限检查
- SELinux:若目录访问受限,可临时允许 FTP 家目录访问:sudo setsebool -P ftp_home_dir 1;生产环境不建议直接关闭 SELinux。
- 用户与目录:确保 FTP 用户主目录存在且权限正确,例如:
sudo chown -R ftpuser:ftpuser /path/to/ftp/dir
sudo chmod -R 755 /path/to/ftp/dir
- 被禁止登录:检查 /etc/vsftpd/ftpusers 或 /etc/ftpusers 是否包含该用户。