首先确认vsftpd服务是否正在运行,使用以下命令查看服务状态:
sudo systemctl status vsftpd
若服务未启动,执行以下命令启动:
sudo systemctl start vsftpd
启动后再次检查状态,确保服务处于“active (running)”状态。
FTP服务依赖21端口(控制连接),被动模式还需额外端口范围(如10060-10070)。需确保防火墙允许这些端口通过:
sudo iptables -A INPUT -p tcp --dport 21 -j ACCEPT # 允许21端口
sudo iptables -A INPUT -p tcp --dport 10060:10070 -j ACCEPT # 允许被动模式端口范围
sudo firewall-cmd --permanent --add-port=21/tcp # 永久添加21端口
sudo firewall-cmd --permanent --add-port=10060-10070/tcp # 永久添加被动模式端口范围
sudo firewall-cmd --reload # 重新加载防火墙规则
若使用ufw防火墙,可执行:
sudo ufw allow 21/tcp
sudo ufw allow 10060:10070/tcp
vsftpd的主配置文件为/etc/vsftpd.conf,需确认以下关键配置正确:
anonymous_enable=NO # 禁止匿名登录(增强安全性)
local_enable=YES # 允许本地用户登录
write_enable=YES # 允许用户上传/修改文件
pasv_enable=YES # 启用被动模式
pasv_min_port=10060 # 被动模式最小端口
pasv_max_port=10070 # 被动模式最大端口
chroot_local_user=YES # 将用户限制在自己的主目录(提升安全性)
修改配置文件后,重启vsftpd服务使更改生效:
sudo systemctl restart vsftpd
日志是排查故障的核心依据,vsftpd的日志通常位于以下路径:
/var/log/vsftpd.log(若未开启,需在配置文件中设置xferlog_enable=YES)/var/log/auth.log或/var/log/secure使用以下命令查看实时日志(过滤vsftpd相关错误):
sudo tail -f /var/log/vsftpd.log # 实时查看vsftpd日志
sudo grep 'vsftpd' /var/log/auth.log # 从auth.log中筛选vsftpd错误
常见日志错误及含义:
530 Login incorrect:用户名或密码错误,或用户被列入/etc/ftpusers(禁止FTP登录)。553 Could not create file:用户主目录无写权限,或SELinux限制。Connection refused:服务未启动或防火墙阻止了连接。FTP用户需对目标目录有正确的访问权限,否则会导致上传/下载失败:
755(所有者可读写执行,其他用户可读执行):chmod 755 /path/to/ftp/directory
644(所有者可读写,其他用户只读):chmod 644 /path/to/ftp/file
ftpuser):chown -R ftpuser:ftpuser /path/to/ftp/directory
若用户被限制在主目录(chroot_local_user=YES),需确保主目录的所有者为root(防止用户越权):
chown root:root /path/to/ftp/directory
若系统启用了SELinux(getenforce返回Enforcing),可能会阻止FTP访问:
sudo setenforce 0
/etc/selinux/config文件,将SELINUX=enforcing改为SELINUX=disabled,并重启系统。sudo setsebool -P ftp_home_dir on
sudo setsebool -P allow_ftpd_full_access on
sudo restorecon -Rv /path/to/ftp/directory
ping命令测试客户端与服务器之间的网络连接:ping <服务器IP>
若无法ping通,需检查网络设备(路由器、交换机)或服务器网络配置(IP地址、子网掩码)。telnet或nc命令测试21端口是否开放:telnet <服务器IP> 21 # 若提示“Connected”,说明端口开放
nc -zv <服务器IP> 21 # 若返回“succeeded”,说明端口开放
sudo netstat -tuln | grep 21
若输出中包含vsftpd,说明端口正常;若为其他服务(如apache2),需停止冲突服务或修改vsftpd端口(在配置文件中修改listen_port)。pasv_enable=YES),需确保:
pasv_min_port至pasv_max_port范围(如10060-10070)。pasv_address设置为服务器公网IP(若服务器在NAT环境下)。/etc/ftpusers文件,确保用户未被禁止登录(若需禁止某用户,可将其添加至该文件)。local_enable=YES(允许本地用户登录)。chmod 755或chmod 777,后者仅用于测试)。getsebool -a | grep ftp,若allow_ftpd_full_access为off,需开启)。systemctl status vsftpd)。firewall-cmd --list-ports | grep 21)。getenforce,若为Enforcing,可临时设为Permissive测试)。