在 CentOS6 上安装 vsftpd

vsftpd 是一款在 Linux 发行版中最受推崇的 FTP 服务器程序。特点是小巧轻快,安全易用。
vsftpd 的名字代表”very secure FTP daemon”, 安全是它的开发者 Chris Evans 考虑的首要问题之一。在这个 FTP 服务器设计开发的最开始的时候,高安全性就是一个目标。

在初次安装过程中遇到了很多问题,主要是关于帐号设置的问题,这里纪录一下。

1. 安装 vsftpd

通过 yum 安装

# yum install vsftpd

设置开机自动启动

# chkconfig vsftpd on

启动服务

# service vsftpd start
Starting vsftpd for vsftpd:                                [  OK  ]

配置防火墙

# vim /etc/sysconfig/iptables	

增加你需要开放的端口

# -A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT

保存以后重启防火墙

# service iptables restart

2. 配置 vsftpd

增加 ftpuser

# useradd -g ftp -s /sbin/nologin ftpuser

设置密码

# passwd ftpuser

修改配置文件

# cd /etc/vsftpd/
# mv vsftpd.conf vsftpd.conf.bak
# vim vsftpd.conf

anonymous_enable=NO

#允许登入者有写权限
write_enable=YES

#允许本地用户访问
local_enable=YES

#本地用户新增档案时的umask值
local_umask=022

#定义欢迎话语的字符串
ftpd_banner=Welcome to FTP server.

#启用上传/下载日志记录
xferlog_enable=YES

#日志文件所在的路径及名称
xferlog_file=/var/log/vsftpd.log

#将日志文件写成xferlog的标准格式
xferlog_std_format=YES

#在chroot_list中列出的用户不允许切换到家目录的上级目录
chroot_list_enable=YES

#如果chroot_local_user设置了YES,那么chroot_list_file  
#设置的文件里,是不被chroot的用户(可以向上改变目录)  
#如果chroot_local_user设置了NO,那么chroot_list_file  
#设置的文件里,是被chroot的用户(无法向上改变目录)  
chroot_local_user=YES
chroot_list_file=/etc/vsftpd/chroot_list

userlist_enable=YES
userlist_deny=YES
userlist_file=/etc/vsftpd/user_list

#FTP服务器以standalone模式运行
listen=YES

#FTP服务器启用PORT模式
port_enable=YES

#禁用FTP服务器的PASV模式
pasv_enable=NO

#FTP服务器监听21端口
listen_port=21

#600秒钟不对FTP服务器进行任何操作,则断开该FTP连接
idle_session_timeout=600

#建立FTP数据连接的超时时间为120秒
data_connection_timeout=120

#不限制用户的连接数量
max_clients=0
#每个IP与FTP服务器同时建立连接数
max_per_ip=100

#PAM认证文件
pam_service_name=vsftpd

use_localtime=YES

#支持ASCII模式
ascii_upload_enable=YES
ascii_download_enable=YES

重启

# service vsftpd restart		

3. 问题

  • 500 OOPS: cannot change directory:/home/ftpuser

      # getsebool -a|grep ftp
      # setsebool -P ftp_home_dir on
    
  • 500 OOPS: could not read chroot() list file:/etc/vsftpd/chroot_list

    缺少 chroot_list 文件,需要手动建立。

      # vim chroot_list
    
  • 530 Login incorrect.

    可能一:

      # vim vsftpd.conf
      增加:
      pam_service_name=vsftpd
    

    可能二:密码不正确。

  • 550 Permission denied

    这个问题可能是多种原因造成的,最常见的是缺少

      write_enable=YES
      
    

    但在我的环境中,出现这个问题是因为服务端 iptables、客户端防火墙、vsftpd pasv 三者之间的配置造成的。参考 iptables 中配置 vsftp 的访问

    • 主动模式下,客户连接 TCP/21,服务器通过 TCP/20 连接客户的随机端口。这种情况下,通过状态防火墙可以解决

      iptables -A INPUT -m state –state NEW,RELATED,ESTABLISHED -j ACCEPT

    • 被动模式下,客户连接 TCP/21,客户再通过其他端口连接服务器的随机端口。因为服务器在被动模式下没有打开临时端口让 client 连过来,因此需要几个条件:

      • client 没有防火墙时,用主动模式连接即可。
      • server 没有防火墙时,用被动模式即可。
      • 双方都有防火墙时,vsftpd 设置被动模式高端口范围,server 打开那段范围,client 用被动模式连接即可。
      • 加载 ip_conntrack_ftp 模块,使 server 支持 connection tracking,支持临时打洞,client 用被动模式即可。
      • server 使用 ip_conntrack_ftp、client 使用 ip_conntrack_ftp 和 ip_nat_ftp,支持临时打洞和临时 NAT 穿越打洞,双方使用主动或被动模式均可。

因为我 client 和 server 都有防火墙,所以对前边的 vsftpd 设置稍做修改

#pasv_enable=NO
pasv_min_port=2222
pasv_max_port=2322

修改 iptables

-A INPUT -p tcp --dport 2222:2322 -j ACCEPT

重启

# service iptables restart
# service vsftpd restart