1.卸载系统已经存在的ftp服务器
因为是源码安装,所以不能通过rpm -qa的方式查看是否已经安装ftp服务器,可以通过find / | grep vsftp*方式查看系统中存在哪些与vsftpd相关的文件,找出来通过rm删除。
以下删除代码为参考:
rm /usr/local/sbin/vsftpd
rm /usr/local/man/man5/vsftpd.conf.
rm /usr/local/man/man8/vsftpd.
rm /etc/xinetd.d/vsftpd
rm -rf /etc/vsftpd
2.解压源码包
tar -zxvf vsftpd-3.0..tar.gz
编码解决:
vi opts.c
将if (str_equal_text(&p_sess->ftp_arg_str,"UTF8 ON"))
更改成if (str_equal_text(&p_sess->ftp_arg_str,"DISABLE UTF8 ON"))
注意:安装之前,先查看系统是否为64位(用getconf LONG_BIT命令),需要更改vsf_findlibs.sh文件库中lib 路径,命令如下:
sed -i 's/lib\//lib64\//g' vsf_findlibs.sh
3.安装
完成以上步骤,到解压目录
3.1 查看系统版本,确定合适版本的ftp压缩包
cat /etc/issue
或
cat /etc/redhat-release
(Linux查看版本当前操作系统发行版信息)
CentOS Linux release 7.1.1503 (Core)
tar -zxvf vsftpd-3.0..tar.gz
3.2 查看系统是32位还是64位的
getconf LONG_BIT
“o hash.o tcpwrap.o ipaddrparse.o access.o features.o readwrite.o opts.o ssl.o sslslave.o ptracesandbox.o ftppolicy.o sysutil.o sysdeputil.o seccompsandbox.o -Wl,-s -fPIE -pie -Wl,-z,relro -Wl,-z,now `./vsf_findlibs.sh`/usr/bin/ld: cannot find -lcapcollect2: ld 返回 1make: *** [vsftpd] 错误 1”
3.3 编译与安装
cp vsftpd.conf /etc/vsftpd
cp Redhat/vsftpd.pam /etc/pam.d/
mv /etc/pam.d/vsftpd.pam /etc/pam.d/vsftpd
3.4 添加用户并指定目录
添加用户ftp123,并指定用户家目录/data/ftp_dir
useradd -d /data/ftp_dir/ ftp123
passwd ftp123
3.5 修改目录权限
chmod /data/ftp_dir/
ll
3.6 修改配置文件/etc/vsftpd/vsftpd.conf
3.7 修改防火墙,并重启
vi /etc/sysconfig/iptables/
-A OUTPUT -p tcp --sport -j ACCEPT
-A OUTPUT -p tcp --sport -j ACCEPT
-A OUTPUT -p tcp --sport -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport -j ACCEPT
再重启
/usr/local/sbin/vsftpd /etc/vsftpd/vsftpd.conf
4.验证
yum install ftp
4.2.2 登陆
ftp ip地址
出现以上提示表示登陆成功了
ftp> put
(local-file) index.html
(remote-file) index.html
local: index.html remote: index.html
Entering Passive Mode (,,,,,).
Ok to send data.
Transfer complete.
bytes sent in 0.00856 secs (278.25 Kbytes/sec)
下面看一个完整操作

5.安装常见问题
5.1 530 Login incorrect
解决思路:修改vsftpd.conf配置文件,添加pam_service_name=vsftpd配置,注意这里的配置文件值为:vsftpd,对应的是/etc/pam.d/vsftpd文件,所以复制到pam.d目录的vsftpd.pam需要进行改名;重启ftp验证。
如果还不能解决,可以考虑编辑vi /etc/pam.d/vsftpd,将文件中的所以lib替换为lib64,再重启ftp即可。
5.2 500 illegal port command
解决思路:出现这个问题时,可以考虑vsftpd连接模式问题,vsftpd存在两种连接模式,一个是主动连接,一个是被动连接。首先将ftp客户端的连接方式改为“被动连接”模式再进行ftp的连接。
如果还不行,可以考虑是不是服务器端口问题,比如服务器限制了只能访问几个端口,这是需要在配置文件中进行如下配置:
pasv_enable=YES //表示启动被动模式
pasv_min_port=9090 //被动模式最小端口
pasv_max_port=9091 //被动模式最大端口
pasv_address=172.16.4.160 //被动模式连接IP
注意pasv_address这个配置,这个配置默认为none,不进行设置,则客户端在连接的时候会先连接当前服务器内网IP地址,之后才连接外网IP地址,所以进行配置的时候,要指定地址,这样再连接的时候才会直接连接外网地址。
5.3 500 OOPS: cannot change directory:/home/xxxx
解决思路:遇到这个问题可以考虑是否是服务器的selinux防火墙开启了,可以通过一下命令进行防火墙关闭:setsebool -P ftpd_disable_trans 1,需要重启ftp,service vsftpd restart
还可以通过命令:sestatus -b | grep ftp查看ftp的状态,最主要查看ftp_home_dir的值是on 还是off,如果是off,通过命令setsebool -P ftp_home_dir on设置为on
5.4 530 Permission denied
解决思路:遇到这个问题可以考虑是否配置userlist_enable选项,查看/etc/vsftpd.user_list或者/etc/vsftpd/vsftpd.user_list是否限制了当前用户,将该用户从文件中删除或者设置userlist_deny=NO
5.5 500 OOPS: vsftpd: refusing to run with writable root inside chroot()
解决思路:这是因为从2.3.5之后,vsftpd增强了安全检查,如果用户被限定在了其主目录下,则该用户的主目录不能再具有写权限了!如果检查发现还有写权限,就会报该错误。
要修复这个错误,可以在vsftpd的配置文件/etc/vsftpd/vsftpd.conf添加一行“allow_writeable_chroot=YES”
5.6 500 Illegal PORT command.
状态: 正在连接 218.65.241.60:12021...状态: 连接建立,等待欢迎消息...状态: 不安全的服务器,不支持 FTP over TLS。状态: 已登录状态: 读取目录列表...命令: PWD响应: 257 "/lutong/tomcat_admin_9090/webapps/boss_sync_user_data"命令: TYPE I响应: 200 Switching to Binary mode.命令: PORT 172,16,4,200,201,1响应: 500 Illegal PORT command.命令: PASV响应: 227 Entering Passive Mode (90,114,3,18,8,52).命令: LIST错误: 无法建立数据连接: ETIMEDOUT - 连接尝试超时错误: 50 秒后无活动,连接超时
用FileZilla工具连接时,发现,报如上错误,这是因为没有指定被动模式,在/etc/vsftpd/vsftpd.conf最后添加如下几行,
#是否允许被动模式
pasv_enable=YES
#下面两行设置被动模式连接时的端口范围,建议配置大一点的,安全性高
pasv_max_port=
pasv_min_port=
pasv_address=ftp服务器ip #vsftp服务器指定IP地址
然后在/etc/sysconfig/iptables添加开放端端口
-A INPUT -m state --state NEW -m tcp -p tcp --dport : -j ACCEPT
即可
5.7 421 Timeout.
修改/etc/vsftpd/vsftpd.comf的data_connection_timeout的值更大即可
6.配置文件
/etc/vsftpd/vsftpd.conf
#禁止匿名访问
anonymous_enable=NO
#开放本地用户的写权限
write_enable=YES
#设置本地用户的文件生成掩码为022,默认值为077
local_umask=
#当切换到目录时,显示该目录下的.message隐含文件的内容
#这是由于默认情况下有message_file=.message的 设置
dirmessage_enable=YES
#激活上传和下载日志
xferlog_enable=YES
#启用FTP数据端口的连接请求
connect_from_port_20=YES
#xferlog日志文件
xferlog_file=/var/log/xferlog
#使用标准的ftpd xferlog日志格式
xferlog_std_format=YES
#设置空闲的数据连接的的中断时间
data_connection_timeout=
#设置连接服务器后的欢迎信息
ftpd_banner=Welcome to KJGG FTP service. #下面四句配置保证只有/etc/vsftpd/user_list 的用户可以登陆
local_enable=YES #允许本地用户登录
userlist_file=/etc/vsftpd/user_list
userlist_deny=NO
userlist_enable=YES
#下面两句配置保证只有/etc/vsftpd/chroot_list的用户切换目录
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list_file
#设置PAM认证服务的配置文件名称,该文件存放 在/etc/pam.d/目录下
#pam_service_name=vsftpd
#tcp_wrappers=YES
#开启监听
listen=YES
#命令通道端口,默认21
listen_port= #是否允许被动模式
pasv_enable=YES
#下面两行设置被动模式连接时的端口范围,建议配置大一点的,安全性高
pasv_max_port=
pasv_min_port=
#vsftp服务器指定IP地址
pasv_address=ftp服务器ip #这是因为从2..5之后,vsftpd增强了安全检查,如果用户被限定在了其主目录下,则该用户的主目录不能再具有写权限了!
#如果检查发现还有写权限,就会报该错误。要修复这个错误,需要添加下面一行
allow_writeable_chroot=YES
/etc/vsftpd/chroot_list_file
ftp123
/etc/vsftpd/chroot_list_file
ftp123
/etc/pam.d/vsftpd
#%PAM-1.0
session optional pam_keyinit.so force revoke
auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
auth required pam_shells.so
auth include password-auth
account include password-auth
session required pam_loginuid.so
session include password-auth
7.其他
/usr/local/sbin/vsftpd /etc/vsftpd/vsftpd.conf &