虽然早知道vsftp,但从来没真正动手安装过。今天编辑有个需求,要在新服务器 上传下载文件,于是花了一个小时,简单配置一个ftp服务器:

安装很简单:
# yum -y install vsftpd

现在先不急着启动,因为不安全,先开始配置

1.设置开机启动:

# chkconfig vsftp on
# chkconfig --list vsftpd

这样vsftp就在345的启动级别开启了,或者直接指定相应的level启动

# chkconfig --level 0 vsftpd on

2.开启防火墙端口

# iptables -I INPUT -p tcp --dport 21 -j ACCEPT
# iptables -L -n
# iptables-save >/etc/sysconfig/iptables

3.关闭SE

3.1、快速关闭SElinux,使用如下命令就可以:
/usr/sbin/setenforce 0 立刻关闭 SELINUX
/usr/sbin/setenforce 1 立刻启用 SELINUX

3.2、加到系统默认启动里面

echo "/usr/sbin/setenforce 0" >> /etc/rc.local

3.3、可以编辑配置文件达到同样的目的

vi /etc/selinux/conf
set SELINUX=disabled

4.创建用户并设置登录密码

# useradd -d /hihoku/log ftper
# passwd ftper

5.编辑配置文件

# cd /etc/vsftpd/
# vi vsftpd.conf

修改以下配置
#禁止匿名访问
anonymous_enable=NO
#限制目录,只能在家目录或下级目录访问,不能向上级或其他目录访问

chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list

创建 /etc/vsftpd/chroot_list里写入只能限制在自己的家目录的用户名
这里写入ftper

修改/etc/vsftpd/ftpusers,这个列表里是不允许使用ftp登录的用户,注释掉ftper,确保用户可以登录

修改/etc/vsftp/user_list:
关于这个文件,有两种策略:

1.当vsftpd.conf的配置项 userlist_enable=YES,此时user_list为禁止使用ftp登录的用户,为确保 ftper登录,应该注释掉该用户。
2.当vsftpd.conf的配置项 userlist_enable=NO,此时user_list仅为允许使用ftp登录的用户,为确保安全,保留ftper用户,注释掉不允许登录的其他用户名。

当然vsftp的有其他用户管理机制,利用PAM,创建虚拟用户等等,留待以后研究。
最后使用service vsftpd start启动便大功告成了

3月25日更新:
===============================================
1. 处理 读取目录列表失败 的错误

状态: 正在连接 192.168.1.6:21...
状态: 连接建立,等待欢迎消息...
响应: 220 (vsFTPd 2.2.2)
命令: USER ftp
响应: 331 Please specify the password.
命令: PASS ***
响应: 230 Login successful.
命令: SYST
响应: 215 UNIX Type: L8
命令: FEAT
响应: 211-Features:
响应: EPRT
响应: EPSV
响应: MDTM
响应: PASV
响应: REST STREAM
响应: SIZE
响应: TVFS
响应: UTF8
响应: 211 End
命令: OPTS UTF8 ON
响应: 200 Always in UTF8 mode.
状态: 已连接
状态: 读取目录列表...
命令: PWD
响应: 257 "/"
命令: TYPE I
响应: 200 Switching to Binary mode.
命令: PASV
响应: 227 Entering Passive Mode (192,168,1,6,23,8).
命令: LIST
错误: 连接超时
错误: 读取目录列表失败

该错误是iptables配置引起的,临时解决方法为:
执行以下命令

# modprobe ip_nat_ftp

但是服务器重启后会失效,需要更改iptables的配置文件
需要把
IPTABLES_MODULES=”” 改为 IPTABLES_MODULES=”ip_nat_ftp”.

2.关于IPTABLES_MODULES_UNLOAD的配置
iptables 重启后是否重新加载内核模块
在Linux内核里,默认情况下为yes: iptables重启动的时候,iptables模块会被卸载(unload),然后加载重启.这种配置下iptables如果重启,对于那些tcp发起端window scale option有效的的连接会产生以下影响:

1.重启后window size会不能被正确识别;

2.已经建立的tcp会话状态会从 ESTABLISHED → INVALID 导致会话中断;

以上问题对于有重传机制的应用或许问题不大,但是如果一个应用不支持重传,当底层tcp会话中断后 就会发生异常问题。

如果应用环境中,这种类型会话偏多,而且iptabls的配置又因为安全问题要经常变动,就有必要探讨是否配置强制iptable模块在重启时不被unload,改为no.

4月30日更新:
===============================================
问题:vsftp登录报错”500 OOPS: cannot change directory:/home/*******”
使用以下命令解决:
/usr/sbin/setsebool -P ftp_home_dir 1
参考:http://my.oschina.net/u/267081/blog/156954

- EOF -