FTP(File Transfer Protocol, FTP)是TCP/IP网络上两台计算机传送文件的协议,应用层的协议,它基于传输层, FTP是一个8位的客户端-服务器协议,能操作任何类型的文件而不需要进一步处理 , FTP服务一般运行在20和21两个端口。端口20用于在客户端和服务器之间传输数据流,而端口21用于传输控制流,并且是命令通向ftp服务器的进口。FTP客户机可以给服务器发出命令来下载文件,上载文件,创建或改变服务器上的目录。
FTP功能
FTP服务器功能除了单纯的进行文件的传输与管理以外,还提供一下几个主要功能。
不同等级的用户身份:user,guest,anonymous
FTP服务器在预设的情况下,根据使用者的登入情况而分为三种不用的身份
1.user:实体账号,realuser
2.guest:访客
3.anonymous:匿名登录者
当然3者在系统上的权限差异很大,例如:实体用户取得的系统权限比较完整;而对于匿名用户不对其开放太多的权限。
命令记录与登录文件记录
FTP可以利用系统的syslogd服务来进行数据的记录,而记录的数据包括用户曾今下达过的命令与用户传输数据(传输时间,文件大小)的记录,所以可以从/var/log/中找到各项登录信息
限制用户活动目录(change root 简称:chroot)
为了避免用户在你的linux系统中离开自己的家目录进入到linux系统的其他重要目录中,所以将使用者的工作范围局限在自己的家目录中。FTP可以限制用户只能在自己的家目录活动,使用者无法离开自己的家目录,登入FTP后看到的根目录就是自己的家目录
FTP运作流程
FTP是应用层的协议,它基于传输层TCP协议传输,TCP建立连接需要三次握手,FTP服务一般运行在20和21两个端口,端口20用于在客户端和服务器之间传输数据流,而端口21用于传输控制流.这两种传输都需要经过三次握手。
这里以主动连接(Active)讲解运作流程
1.建立命令通信
客户端会随机取一个大与1024的端口(portAA)经过三次握手与FTP服务器21端口达成联机,此后客户端便可以通过这个联机来对FTP服务器进行指令的下达,包括查询文件名、下载、上传等指令。
2.通过FTP服务端使用主动连接
FTP服务器的21端口主要用来下达命令,当要开始传输数据时,就不适用这个联机了。客户端在需要数据的情况下,会告知服务端要用什么方式来联机,如果是主动式联机,客户端会先随机启动一个端口(portBB),通过命令通道高数FTP服务器这两个消息,并等待FTP服务器的联机。
3.服务器主动向客户机联机
服务器命令通道了解客户端的请求后,会主动的由20号端口向客户端的portBB联机,同样需要三次握手,此时FTP客户端与服务器端共建立了2条联机(命令与数据传输两个信道)。注意,数据传输信道只在有数据传输行为时才建立。
命令通道21与数据传输通道20
21端口主要接受来自客户端的主动联机,20端口则为FTP服务器主动联机至客户端。
主动连接的FTP服务器与客户端之间具有防火墙的连接问题
一般来说,很多局域网都会使用防火墙(iptables)的NAT功能,那么在NAT后端的FTP用户如何连接到FTP服务器呢。
1.用户与服务器间命令信道的建立:
因为NAT会主动记录有内部送往外部的联机信息,而由于命令信道的建立是由客户端向服务器联机的,因此这条联机可以顺利建立起来。
2.用户与服务器间数据信道的建立:
客户主机会先启用portBB,并透过命令通信告知FTP服务器,而等待服务器的主动连接。
3.服务器主动连到NAT等待转递至客户端的连接问题:
由于偷狗NAT转换后,FTP服务器只能得到NAT的IP而不是客户端的IP,因此FTP会以20端口主动向NAT的PortBB发送主动联机的要求,但是你的NAT并没有启动portBB来监听FTP的联机。所以这里就出现了问题。
如何解决这样的问题呢?
1.使用iptables所提供的FTP侦测模块:
可以使用modprobe指令来加载ip_conntrack_ftp及ip_nat_ftp等模块,这几个模块会主动分析目标是21的联机信息,所以可以得到portBB的资料,此时若接收到FTP服务器的主动联机,就能将该封包导向正确的后端主机了。
但是,如果命令通道并非是通过默认端口21来建立的,那么这两个模块就无法解析出来了。
2.客户端选择被动式(Passive)连接模式:
主动模式是由服务器向客户端发起连接,那么被动式就是客户端向服务端发起连接。
被动连接
1.客户端与服务器建立命令信道:
同样,客户端选一个大与1024的端口向服务器21号端口通过三次握手建立通道。
2.客户端发出PASV的连接请求:
当要进行数据传输时,客户端可以通过命令通道发出PASV(Passive的缩写)的被动联机求情求,并等待服务端回应。
3.FTP服务器启动数据端口,并通知客户端
这时服务器会打开一个端口port pasv(可能是随机的也可能是自定义的)处于listen状态,并通过21端口的指令通道将处在监听状态下的次端口发给客户端,并等待客户端通过此端口进行数据传输。
4.客户端随机取用大于1024的端口进行连接:
客户端随机取用大于1024的端口连接服务器的port pasv端口,那么通过portBB和port PASV数据通道就建立好了。
引用: http://blog.chinaunix.net/uid-26413668-id-3379352.html