大伙都知道FTP就是文件传输协议,File Transfer Protocol, 此协议诞生于互联网发展初期,历史悠久,主要用于文件共享,工作在TCP/IP应用层。
How it works
FTP主要工作在两种模式,一种是主动模式,也有人叫标准模式Standard; 另一种是被动模式,也叫pasv模式(passive),在这里所言主动与被动皆相对于服务器而言。
在主动模式下,客户端首先随机启动一个端口如2021向服务器TCP21端口发起连接,此过程就是我们常说的tcp三次握手,此过程即是FTP的控制连接过程,一旦连接建立除非服务端定义的超时时间或其他的连接策略,否则连接会一直保持下去。之后客户端根据需求向服务端发送相应的命令请求,服务端收到命令请求会根据本地的配置来验证客户端是否有相应的权限,如果有则通过20端口向客户端2022端口返回相应数据,如果2022端口非空闲则发送给2023,以此类推,直到找到空闲的端口为止;如果经查此人无此权限,则返回给相应的错误信息。
下图为我用Dia画的一个简单示意图,真的是不画图不知道,一画才顿感自己的知识掌握的程度是如此令人汗颜,愧哉愧哉,看着马哥讲解PPT上信手拈来,如此轻松,真的到自己来有点无从下手之感,归根结底还是知识掌握不扎实,动手太少,书到用时方恨少,不能做到拳不离手,曲不离口又何来如马哥般的烂熟于心?向马可致敬,为自己之前的眼高手低做深刻检讨,从现在开始,坚持博客总结,小伙伴们,能把自己的知识倒给别人跟自己会使用真是不是一个境界。子曰:学而时习之,不变乐乎;有朋自远方来,不亦悦乎;人不知而不愠,不亦君子乎?扯远了。。。 言归正传。。。
在主动模式下,有个缺陷,如果客户端开启了防火墙,未放行外来不明端口那么就悲剧了,连接建立却无法进行数据通信。于是乎被动模式就此诞生了:此模式下,客户端与服务端建立控制连接后,由服务端主动向客户端发出一个通知包告之自己数据服务工作在哪个端口,等待客户端有数据请求时连接上来。通常是这样的格式,e.g 100,56 客户端计算出100*256+56=25656然后随机打开一个端口去连接服务器25656端口建立数据连接通道。
此模式下仍旧会有问题产生,因为众所周知,通常情况下为了安全考虑,服务器一般是处于防火墙内的,而每次服务器通知给客户端的数据连接端口都是随机产生的,这样一来服务端的防火墙开放的端口就不好控制了,解决这个问题就需要防火墙的连接跟踪功能了,防火墙可以自动追踪到和这个连接相关的连接,打上related标签,这样只要是相关的连接,防火墙都会信任放行了,关于这个会在以后iptables应用中详细解释。
用户类型
FTP服务器支持的用户账号类型主要有三种
1. 匿名用户 anonymous
2. 系统用户 :提供服务的系统自身存在的用户
3. 虚拟用户
不过其实不管是哪种类型的用户,事实上最终都是系统用户,匿名用户和虚拟用户其实是映射到系统的一个用户上来,以这个用户的身份来访问系统共享出来的资源的。
安装配置
提供ftp服务的软件有很多,这里以红帽提供的vsftpd为例,vsftpd 是Very Secured ftp Deamon的缩写,由此可见安全是他的强项。
安装比较简单,我们直接用yum 安装就好了 ,软件很小
yum –y install vsftpd
安装完成可以用rpm –ql vsftpd 查看都生成了哪些文件
[root@ha1 ~]# rpm -ql vsftpd
/etc/logrotate.d/vsftpd.log
/etc/pam.d/vsftpd
/etc/rc.d/init.d/vsftpd
/etc/vsftpd
/etc/vsftpd/ftpusers
/etc/vsftpd/user_list
/etc/vsftpd/vsftpd.conf
/etc/vsftpd/vsftpd_conf_migrate.sh
/usr/sbin/vsftpd
/usr/share/doc/vsftpd-2.0.5
/usr/share/doc/vsftpd-2.0.5/AUDIT
/usr/share/doc/vsftpd-2.0.5/BENCHMARKS
我们可以看到vsftpd的配置文件是/etc/vsftpd/vsftpd.conf, 下面对配置文件的常用选项作简单说明:
anonymous_enable=yes|no 是否启用匿名用户
write_enable=yes|no 系统用户是否可以上传文件
anon_upload_enable=yes|no 是否允许匿名用户上传文件,此功能必须要先让对应的文件夹ftp用户具有rwx权限,由于vsftpd文件权限受SELinux控制,可用setfacl –m u:ftp:rwx /path/to/dir 给权限,不过一般匿名用户不会给这么大的权限
anon_mkdir_enable=yes|no 是否允许匿名用户创建文件夹
anon_other_write_enable=yes|no 是否允许匿名用户删除文件