1. 安装vsftpd
[root@bogon ~]# yum -y install vsftpd
相关配置文件 /etc/vsftpd/vsftpd.conf
2. 添加ftp用户
[root@bogon ~]# useradd ftpuser
[root@bogon ~]# passwd ftpuser
后输入两次系统密码
3. 开放21端口
[root@bogon ~]# vim /etc/sysconfig/iptables
在-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT复制粘贴,将22改为21(注:22为ssh端口)
重启iptables
4. 修改selinux
[root@bogon ~]# getsebool -a | grep ftp
allow_ftpd_anon_write --> off
allow_ftpd_full_access --> off
allow_ftpd_use_cifs --> off
allow_ftpd_use_nfs --> off
ftp_home_dir --> off
ftpd_connect_db --> off
ftpd_use_passive_mode --> off
httpd_enable_ftp_server --> off
tftp_anon_write --> off
以上结果表示未开启外网访问
(注:getsebool get SELinux boolean value(s))
[root@bogon ~]# setsebool -P allow_ftpd_full_access on
[root@bogon ~]# setsebool -P ftp_home_dir on
4.ps FTP传输的主动模式与被动模式
FTP客户端连接到FTP服务器端21端口,二者之间进行一系列的身份验证,这个过程叫做命令连接。客户端向服务器端发送请求时候,客户端会随机选择某个TCP端口语服务器端21端口连接,此过程通过TCP的三次握手来完成,握手完成后,相互之间建立一条通道,此通道只能传输FTP一些简单的指令,如查看文件列表,删除文件等。如果互相之间要上传下载文件,二者之间需要建立一条额外的通道来完成。此时就有了主动模式与被动模式的区分。当客户端发出上传下载文件的指令后,若是客户端随机开放一个另一个1024以上的端口监听等待连接,并且通过先前建立的命令连接告诉服务器端所开放的端口号,之后FTP服务器会通过20端口主动与客户端刚才开放的端口进行三次握手,握手成功则建立了一条传输通道,二者之间通过此通道来上传下载数据,由于是服务器20端口主动与客户端建立的连接,所以称为主动模式(Active)。
5. 关闭匿名连接
打开/etc/vsftpd/vsftpd.conf配置文件,将
anonymous_enable=YES
修改未NO
6. 开启被动模式
被动模式默认开启,但是需要配置端口范围,同样 打开/etc/vsftpd/vsftpd.conf配置文件,在末尾追加
pasv_min_port=30000
pasv_max_port=30999
另外需要在iptables里增加开放端口,与上面保持一致,具体方法参看之前的博文。
8. 设置开机自启
chkconfig vsftpd on
9. 在Java中借助Apache的commons-net.jar包实现上传下载时候,需要记住设置为被动模式。另外,在我使用时候遇到一个小问题,每次上传失败,但是FtpClient并不会报错,我debug发现请求发送文件的命令(包括路径和文件名)已经成功发送了,但是ftp服务器 返回 553 。。。。。什么什么的,发现是我在 ftpuser用户下创建文件使用的是root用户,所有使用ftpuser用户上传时候没有对该路径的读写权限。。。