Linux vsftpd 连接超时的排查与解决
一、常见成因与快速判断
二、被动模式与防火墙的正确配置(最常见根因)
sudo vi /etc/vsftpd/vsftpd.conf
pasv_enable=YES
pasv_min_port=4000
pasv_max_port=5000
# 如服务器位于NAT之后,需告知客户端外网地址(示例)
# pasv_address=203.0.113.10
sudo systemctl restart vsftpd
sudo iptables -A INPUT -p tcp --dport 21 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 4000:5000 -j ACCEPT
# 若使用 firewalld
sudo firewall-cmd --permanent --add-port=21/tcp
sudo firewall-cmd --permanent --add-port=4000-5000/tcp
sudo firewall-cmd --reload
pasv_address 为服务器的公网 IP,否则客户端会尝试连接内网地址而失败。sudo modprobe ip_conntrack_ftp
sudo modprobe ip_nat_ftp
注:部分新内核/发行版使用 nf_conntrack_ftp,模块名可能不同。三、客户端与服务端超时参数优化
sudo vi /etc/vsftpd/vsftpd.conf
# 示例:空闲会话超时 1 小时,数据连接超时 120 秒
idle_session_timeout=3600
data_connection_timeout=120
ftp,可加 -p 启用被动模式。若网络质量一般,可适当增大客户端超时设置。四、登录缓慢与 DNS 反向解析优化
sudo vi /etc/vsftpd/vsftpd.conf
reverse_lookup_enable=NO
sudo systemctl restart vsftpd
五、快速自检与验证步骤
ss -lntp | grep :21
ss -lntp | grep ':4000\|:5000'
lsmod | egrep 'nf_conntrack_ftp|ip_conntrack_ftp'
ftp -p your_ftp_server
# 登录后执行
passive # 确认处于被动模式
ls
sudo tcpdump -ni any 'tcp port 21 or (tcp portrange 4000-5000)'
若看到服务器在 227 后客户端没有对数据端口发起连接,通常是防火墙/NAT或 pasv_address 配置不当。