最近在对一台linux测试主机安装vsftpd后,进行登录时出现了三个错误:一个是错误:530 Login incorrect;一个错误是500 OOPS: cannot change directory;还有一个是ftp: connect: No route to host 。

错误一:530 Login incorrect

通过查看/var/logs/secure发现有如下面的错误:

1pam_userdb(vsftpd:auth): user_lookup: could not open database `/etc/vsftpd/vsftpd_login.db': No such file or directory

到/etc/vsftpd查看下加密过的认证文件,发现为vsftpd.login.db ,错把 “_” 写成了点 ,重命名该文件,问题解决。不过该问题还有可能是因为/etc/vsftpd.conf中没有加入pam_service_name=vsftpd 或 /etc/pam.d/vsftpd文件认证配置不正确引起的,需要在该文件后加入下面的两行。

1auth    required        /lib64/security/pam_userdb.so   db=/etc/vsftpd/vsftpd_login
2account required        /lib64/security/pam_userdb.so   db=/etc/vsftpd/vsftpd_login

注:如果是32位系统,上面的lib64需要换成lib ,最后的认证文件vsftpd_login后面没有”.db” ,系统会自动增加的 。如果加上 “.db” 将会出错 。

错误二:500 OOPS: cannot change directory错误

因为我在vsftpd.conf中有chroot_local_user=YES的配置,其作用是为了锁定用户在自己的home目录中。 这样FTP登录用户的“/”,就是passwd中的home path,比如/opt/ftp/。避免FTP用户跑到/etc乱闯。这样设置过,FTP登录时,会自动执行CWD /opt/ftp,并且把这个目录设置为FTP进程的根目录,用户就无法离开了。

同时,由于该机系统开启有selinux防火墙,SELinux会阻止ftp daemon读取用户home目录。FTP会报错: “500 OOPS: cannot change directory”。无法进入目录,出错退出。

有两种解决方法:

1、关闭selinux防火墙

1[root@localhost vsftpd]# setenforce 0

以上为在不重启服务器的情况下,临时关闭selinux防火墙。此时可以通过sestatus查看状态 。

1[root@localhost vsftpd]# sestatus -v
2SELinux status:                 disabled

注:如果需要永久关闭,需要修改文件/etc/selinux/config文件 。

2、修改selinux里的ftp状态

首先通过getsebool查看ftp相关项的状态

 1[root@test173 /]# getsebool -a|grep ftp
 2allow_ftpd_anon_write --> off
 3allow_ftpd_full_access --> off
 4allow_ftpd_use_cifs --> off
 5allow_ftpd_use_nfs --> off
 6allow_tftp_anon_write --> off
 7ftp_home_dir --> off
 8ftpd_connect_db --> off
 9ftpd_disable_trans --> off
10ftpd_is_daemon --> on
11httpd_enable_ftp_server --> off
12tftpd_disable_trans --> off

将ftp_home_dir或ftp_disable_trans任一项设置成on即可:

1[root@Ansen ~]# setsebool -P ftpd_disable_trans 1
2或者
3[root@Ansen ~]# setsebool -P ftp_home_dir 1
4[root@Ansen ~]# service vsftpd restart

错误三:ftp: connect: No route to host

出现这个错误时,错误本身已经为我们提示的很明白了:

1Try "modprobe ip_conntrack_ftp", if that helps. If yes, then you should
2add that module to /etc/sysconfig/iptables-config

即iptables中未加载modprobe ip_conntrack_ftp模块,需要我们为iptable配置该模块没重启iptables,问题即可解决 。

1echo ' IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp" ' >> /etc/sysconfig/iptables-config
2service iptables restart

不过,也有人给出的方式是将ftp的pasv模式给关掉,即在/etc/vsftpd/vsftpd.conf中的pasv_enable设置为NO 。因为我需要开启pasv模式,所以该方法我并未测 试是否能行得通。

错误四:421 Service not available

报该错误的原因,除了可以是因为是 没有启用配置 connect_from_port_20=YES外,还有一个很大的可能是因为/etc/hosts.deny里配置了ALL:ALL,而没有在hosts.allow里对ftp进行放行。放行的方法很简单:

1vsftpd: All:allow或按IP段允许
2vsftpd:192.168.0.
3vsftpd:192.168.122.