FTP介绍
FTP(File Transfer Protocol)文件传输协议,是一个用于在客户端和服务器之间进行文件传输的协议,默认情况下,采用的是明文的方式进行数据的传输,也可以通过使用SSL对其传输的数据进行加密,称为FTPS。FTP和HTTP协议都是文件传输协议,都运行在TCP层之上的应用层协议,而FTP采用的是两个并行的TCP连接,一个是控制连接,一个是数据连接。
- 控制连接用于在客户端和服务器之间发送控制信息,如用户名和密码以及一些控制指令的传输。
- 数据连接用于数据的传输。由于FTP采用的是TCP作为其传输层协议,因此在发送数据之前需要完成TCP的三次握手。
FTP有两种工作模式,一个是主动模式(Active),一个是被动模式(Passive)。
FTP主动模式(Active)
在FTP的主动模式下,先建立控制连接,然后在建立数据连接。具体过程如下:
1. 首先客户端使用一个大于1024的随机端口(如port AA)连接到服务器的21端口,需要完成TCP的三次握手。
2. FTP服务器的21端口主要在控制连接用于命令的下达,如果有数据进行传输时,就不使用这个端口了。当客户端有数据传输需求时,客户端会通过控制连接使用port command告诉服务器端要采用Active方式进行数据传输,以及自己用于数据传输时所使用的端口(如port BB),并等待服务器的连接。
3. FTP服务器主动的使用20号端口连接至客户端通告的端口(port BB),这时就建立了两条连接,一个是用于命令发送的控制连接,一个是用于数据发送的数据连接。
所谓的主动模式,就是在数据连接时,由FTP服务器主动的连接到FTP客户端。
在主动模式下,服务器和客户端所使用的端口号如下:
- 服务器端
控制连接:使用的端口号是21
数据连接:使用的端口号是20 - 客户端:
控制连接:使用的端口是随机端口
数据连接:使用的端口是随机端口
在主动模式下存在的问题
当客户端和服务器端采用的是NAT方式,并且经过防火墙时,在主动模式下会发生如下情况:
- 当客户端使用一个随机端口(Port AA)连接至FTP服务器的21号端口建立控制连接时,由于防火墙端的NAT会主动的记录由内部送往外部的信息,因此命令连接可以正常的建立。
- 当客户端使用port command通过控制连接告诉服务器采用主动模式进行数据连接的建立以及客户端用于数据连接的端口号(Port BB)。
- 服务器端主动的使用20号端口连接至客户端的Port BB,当到达防火墙时,由于Port BB在防火墙上并没有相应的信息记录,因此防火墙会阻止此连接的建立。该连接建立失败。
解决方法
方法1:使用FTP的被动模式。
在主动模式下,数据连接的建立是FTP服务器主动的连接FTP客户端,因此在被动模式下,就是FTP客户端主动的连接FTP服务器了。方法2:使用iptables所提供的FTP侦测模块。
使用modprobe加载ip_conntrack_ftp和ip_nat_ftp等模块,这几个模块会主动的分析目标端口是21的连接,所以可以得到port BB的端口信息,如果是FTP服务器的主动连接,则可以将数据包发送到正确的客户端。
[root@control ~]# modprobe ip_nat_ftp
[root@control ~]# modprobe ip_conntrack_ftp
[root@control ~]# lsmod | grep ftp
nf_nat_ftp3507 0
nf_conntrack_ftp12913 1 nf_nat_ftp
nf_nat22759 2 nf_nat_ftp,iptable_nat
nf_conntrack79453 7 nf_nat_ftp,nf_conntrack_ftp,iptable_nat,nf_nat,nf_conntrack_ipv4,nf_conntrack_ipv6,xt_state
[root@control ~]#
FTP被动模式(Passive)
同样的,在被动模式下,也是先建立控制连接,然后在建立数据连接。
建立过程
1. 客户端使用一个随机端口(Port AA)连接到FTP服务器的21号端口,完成TCP的三次握手,建立控制连接。
2. 当两端需要数据发送时,客户端通过控制连接发送一个PASV command命令给服务器,要求采用被动模式进行数据传输。
3. 服务器端随机选择一个端口告诉客户端,自己进行数据连接时所使用的端口号,等待客户端的连接。
4. 客户端随机选择一个大于1024的端口(Port BB)连接到FTP服务器的随机端口,用于数据传输。
因此,在被动模式下,在数据传输阶段,是客户端主动的连接服务器。
在被动模式下,服务器和客户端所使用的端口号如下:
- 服务器端
控制连接:使用的端口号是21
数据连接:使用的端口是随机端口 - 客户端
控制连接:使用的端口是随机端口
数据连接:使用的端口是随机端口
VSFTP的安装和配置
VSFTPD的安装
[root@control ~]# yum install -y vsftpd
VSFTPD配置文件参数说明
配置文件:/etc/vsftpd/vsftpd.conf
配置文件每一次修改都需要重启vsftpd服务。/etc/init.d.vsftp restart配置文件的语法:以#开头的表示注释,对大小写敏感。格式为:参数=value
常用参数配置:(可以用man vsftpd.conf查看帮助)
匿名用户相关的参数
anonymous_enable=YES|NO:是否允许匿名用户登录。anon_upload_enable=YES|NO:是否允许匿名用户上传文件。
anon_mkdir_write_enable=YES|NO:是否允许匿名用户在FTP服务器上创建目录。
anon_other_write_enable=YES|NO:是否允许匿名用户执行创建目录之外的写操作,如删除、重命名等。
allow_anon_ssl=YES|NO:是否允许匿名用户使用SSL连接。需要ssl_enable设置为YES。
anon_umask:匿名用户上传文件的umask值。
anon_root:指定匿名用户登录时会被引导到的家目录。默认为/var/ftp
anon_max_rate:匿名用户的最大传输速率。单位是bytes/s
chown_uploads=YES|NO:是否改变匿名用户上传文件的拥有者。
chown_username=who:将匿名用户上传文件的拥有者改为who。当然需要允许匿名用户(anonymous_enable=YES)以及允许匿名用户上传(anon_upload_enable=YES).
本地用户相关的参数
local_enable=YES|NO:是否允许本地用户登录。local_root:指定非匿名用户登录时会引导到的目录。
local_max_rate:本地用户的最大传输速率。单位是bytes/s
write_enable=YES|NO:是否允许非匿名用户上传文件。
download_enable=YES|NO:是否允许用户下载文件。
local_umask:本地用户上传文件的umask值,如local_umask=022,则到服务器上查看该文件的权限为777-022或者是666-022。
用户权限控制相关的参数
userlist_file:指定存放被允许或禁止登录的用户列表文件,默认为/etc/vsftpd/user_list。userlist_enable=YES|NO:是否启用userlist_file的功能。当为YES时,在userlist_file文件中指定的用户尝试登录系统时,在输入密码之前就被拒绝登录了。
userlist_deny=YES|NO:当为yes时,表示拒绝userlist_file文件中的用户登录,当为no时则表示允许该文件中的用户登录。默认值为YES。
注意:ftpusers文件和user_list文件都可以用来限制不能登录ftp服务器的用户,ftpusers这个文件中的用户是不允许登录的,一般不进行修改,而user_list中文件默认也是不允许登录的,可以控制能否登录。如果在ftpusers和user_list中都存在用户,一个不允许,一个允许,以ftpusers文件优先。chroot相关的参数
chroot_local_user=YES|NO:本地用户是否被chroot,限制在自己的家目录里面。yes表示本地用户会被chroot到自己的家目录里面,no表示本地用户不会被chroot到自己的家目录里面。默认为NOchroot_list_file:指定chroot file的文件名。
chroot_list_enable=YES|NO:是否启用chroot_list_file的功能。当chroot_local_user=YES时,且chroot_list_enable也为yes时,表示chroot_list_file里面所指定的用户不会被chroot。当该选项为no时,则会被chroot到自己的家目录。默认为NO。
chroot通常设置为如下方式。第一二两条不用修改,第三条chroot_local_user如果为YES,则chroot_list文件里面的用户不会被chroot,如果为NO,则在该文件里面的用户会被chroot。
chroot_list_file=/etc/vsftpd/chroot_list
chroot_list_enable=YES
chroot_local_user=YESASCII和超时相关的参数
ascii_upload_enable=YES|NO:上传文件时是否允许使用ascii传输模式ascii_download_enable=YES|NO:下载文件时是否允许使用ascii传输模式。
idle_session_timeout:指定会话超时时间。客户端连接到了FTP服务器,但是未操作。单位为秒。
data_connection_timeout:指定数据传输超时时间,单位为秒。
deny_file:不允许上传的文件类型。如deny_file={ .exe,.dll}
pam_service_name=vsftpd:指定vsftpd使用的pam模块的配置文件名称。该配置文件默认在/etc/pam.d目录下。
默认的/etc/pam.d/vsftpd的内容如下:
[root@server1 vsftpd]# more /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
[root@server1 vsftpd]#
注释:item指定允许或拒绝的对象类型,可以是user、group。
sense:指定是允许allow或拒绝deny。
file:指定文件名
其他相关参数的配置
listen_address:指定vsftpd服务器监听的地址listen_port:指定vsftpd服务器的监听端口。默认为21端口
max_clients:vsftpd允许的最大连接数。
max_per_ip:vsftpd允许同一个ip的最大连接数。
use_localtime=YES|NO:是否在显示目录列表时使用本地时间。
ftp_banner:登录到FTP服务器时的欢迎信息。
banner_file:banner信息存放的位置。
dirmessage_enable=YES|NO:当用户首次切换到某一个目录时,会显示该目录下的.message里面的内容。
banner_fail:当用户连接失败时,显示该文件里面的内容。如banner_fail=/etc/vsftpd/errorinfo。该参数可以用在vsftpd由xinetd管理的时候,可用。
xferlog_enable=YES|NO:是否允许用户上传或下载文件时记录日志。
xferlog_file:指定存放上传或下载信息的日志文件名。
xferlog_std_format=YES