FTP(File Transfer Protocol,文件传输协议)是典型的C/S结构的应用层协议,需要由服务端软件、客户端软件两个部分共同实现文件传输功能。
FTP服务器默认使用TCP协议的20、21端口与客户端进行通信。
20端口用于建立数据连接,并传输文件数据;21端口用于建立控制连接,并传输FTP控制命令
根据FTP服务器在建立数据连接过程中的主、被动关系,FTP数据连接分为主动模式和被动模式:
主动模式:服务器主动发起数据连接
,首先由客户端向服务端的21端口建立FTP控制连接,当需要传输数据时,客户端以PORT命令告知服务器“我打开了某端口,你过来连接我”,于是服务器从20端口向客户端的该端口发送请求并建立数据连接。
被动模式:服务器被动等待数据连接
,如果客户机所在网络的防火墙禁止主动模式连接,通常会使用被动模式。首先由客户端向服务端的21端口建立FTP控制连接,当需要传输数据时,服务器以PASV命令告知客户端“我打开了某端口,你过来连接我”,于是客户端向服务器的该端口(非20)发送请求并建立数据连接。
客户端与服务器建立好数据连接后,就可以进行文件传输了。在传输文件时,根据是否进行字符切换,分为文本模式和二进制模式:
文本模式:又称为ASCII模式,这种模式在传输文件时使用ASCII标准字符序列,一般只用于纯文本文件的传输。
二进制模式:又称为Binary模式,这种模式不会转换文件中的字符序列,更适合传输程序、图片等非纯文本字符的文件。
大多数FTP客户端工具可以根据文件类型自动选择文件传输模式,而无需用户手工指定
使用FTP客户端软件访问服务器时,通常要用到一类特殊的用户帐号,其用户名为ftp或anonymous,提供任意密码(包括空密码)都可以通过服务器的验证,这样的用户称为匿名用户
除了不需要密码验证的匿名用户以外,FTP服务器还可以直接使用本机的系统用户帐号来进行验证,这些用户通常被称为本地用户
这里我选用centos7+vsftpd来搭建FTP服务
通过yum安装vsftpd
#yum install -y vsftpd
vi /etc/vsftpd/vsftpd.conf
匿名用户的一些配置项:
anonymous_enable=YES
#允许匿名用户登录FTP
anon_root=/var/ftp/pub
#设置匿名用户的登录目录(如需要,需自己添加并修改)
anon_upload_enable=YES
#打开匿名用户的上传权限
anon_mkdir_write_enable=YES
#打开匿名用户创建目录的权限
anon_other_write_enable=YES
#打开匿名用户删除和重命名的权限(如需要,需自己添加)
anon_umask=022
#匿名用户的掩码(如需要,需自己添加,含义:如umask是022,这时创建一个权限为666的文件,文件的实际权限为666-022=644
修改的内容如下
1.允许匿名访问
anonymous_enable=YES
2、允许匿名用户创建目录
anon_mkdir_write_enable=YES
3、允许匿名用户上传文件
anon_upload_enable=YES
默认路径为/var/ftp/
,其中pub目录专门用来存放用户上传的文件
/var/ftp/的默认权限为755,匿名用户对Linux文件系统来说属于其他用户,虽然vsftpd.conf配置文件中默认
#chmod 777 /var/ftp/
通常情况下防火墙会将传入连接阻止,解决方法有两种,一是修改防火墙配置,放行21端口,一时关闭防火墙,selinux也是同理,这里我采用后者。
#systemctl stop firewalld
#setenforce 0
# systemctl start vsftpd
# netstat -antp | grep vsftpd
tcp6 0 0 :::21 :::* LISTEN 4744/vsftpd
常用配置项:
anonymous_enable=no
#不允许匿名用户登入
local_enable=YES/NO(YES)
#控制是否允许本地用户登入,YES 为允许本地用户登入,NO为不允许。默认值为YES。
local_root=/home/username
#当本地用户登入时,将被更换到定义的目录下。默认值为各用户的家目录。
write_enable=YES/NO(YES)
#是否允许登陆用户有写权限。属于全局设置,默认值为YES。
local_umask=022
#本地用户新增档案时的umask 值。默认值为077。
file_open_mode=0755
#本地用户上传档案后的档案权限,与chmod所使用的数值相同。默认值为0666。
chroot_local_user=YES
#用于指定用户列表文件中的用户不允许切换到上级目录。默认值为NO。
#用于控制用户访问,NO为不启用该用户访问控制列表
userlist_deny=YES/NO
#用于指定用户访问控制列表的含义,YES为黑名单,NO为白名单
这里我修改的配置项:
anonymous_enable=no 不允许匿名访问
userlist_enable=YES 启用用户访问控制列表
userlist_deny=NO 定义用户访问控制列表为白名单
local_root=/var/ftp/ 设置本地用户访问ftp的根目录,不加此选项根目录就是本地用户的家目录
vim /etc/vsftpd/user_list
与匿名访问一样需要关闭防火墙和selinux。