共享的桥梁:FTP的原理与分析技巧

前面我们已经讲解了像HTTP、DNS等常见应用层协议,今天我们再一起来认识一个可以称之为“活化石”的应用层协议——FTP。1969年ARPANET诞生,仅2年后FTP就出现了。当初的很多协议逐步退出了历史舞台,FTP却直到今天都还活跃于企业的办公网络中。那到底是什么样的魔力让FTP协议经久不衰呢?接下来我们就从流量视角,一起深入学习FTP协议。
 

  一、FTP概念及工作原理  

FTP(全称File Transfer Protocol,中文名为文件传输协议),通过它可以实现在两台不同操作系统的主机间可靠地传输文件,包括电子文档、图片、声音、影视、程序及程序等。

掌握FTP工作原理有两个关键知识点:FTP采用双通道机制(FTP会建立两个TCP连接,一个用于发送命令,一个用于传输数据);FTP有两种传输模式(主动模式和被动模式);掌握了这两个知识点,分析FTP协议就能得心应手。

1.FTP文件传输需要建立两种类型的连接:

即控制连接(FTP_CTRL)和数据连接(FTP_DATA),进行过滤时也需要指明具体要过滤出哪一种连接的数据包。

(1)FTP控制连接

客户端用大于1024的随机高端口(端口号N)与FTP服务器建的TCP 21端口建立一个TCP连接,这个连接专门用于发送控制指令,如发送用户名密码进行登陆,进行上传、下载操作等指令。这个连接称为FTP的控制连接。

(2)FTP数据连接

FTP传输数据和FTP发送控制命令不使用同一个TCP会话。当FTP控制连接建立好之后,再准备传输文件,这时会专门建立一个用于传输数据的TCP连接,称为FTP的数据连接。

2.两种数据传输模式:主动模式(PORT)和被动模式(PASV):

主动模式:在控制连接建立好后,客户端向FTP服务器通告自己将用于建立数据连接的随机高端口(一般是控制连接的端口号N再加1),FTP服务器主动使用20端口与客户端通告的随机高端口(N+1)建立数据连接,称为主动模式(所谓“主动”,是针对服务器而言的)。

FTP主动模式工作原理如下图所示:

但主动模式存在一个问题:如果客户端位于内网防火墙之后,服务器在主动使用20号端口去连接客户端的端口时,会因为防火墙的阻止而导致连接失败(客户端主动访问外网,防火墙放行;外网访问客户端,防火墙会拦截)。为了避免这种FTP服务器主动发起连接被拒绝的场景,又有了另外一种传输模式——被动传输模式。

被动模式:客户端和FTP服务器通过控制连接进行协商,让FTP服务器打开一个指定的高端口等待客户端(一般控制连接的端口N再+1)来对其进行连接。这种服务器被动等待客户端来建立数据连接的模式就被称为被动模式(所谓“被动”,也是针对服务器而言的)。

FTP被动模式工作原理如下图所示:

延伸知识:

在使用FTP软件进行数据传输时,可以选用ASII模式和二进制模式,它的关系一般是:

  • ASCII模式:将8位字节转换为10位ASCII字符(多用于传输文本)
  • 二进制模式:原封不动传输原始字节流(多用于图片/视频等二进制文件的传输)

  二、通过流量分析FTP传输  

下面我们通过抓包来分析FTP传输的具体流程

1.主动传输模式

我们使用科来网络分析系统CSNAS捕获并分析一个主动模式下的FTP数据传输。客户端IP为192.168.111.1为客户端,192.168.111.130为FTP服务器端。

双方先进行三次握手,客户端192.168.111.1用自己的随机端口60288和服务器192.168.111.130的21号端口建立控制连接;

控制连接建立后,服务器让客户端进行登录,客户端输入用户名及密码进行登录(可以匿名登录);

登陆后可以进行相应的操作(客户端向服务器发送FTP命令,服务器用状态码进行相应);

整个过程,如下图所示:

成功登陆后,开始进行操作,当要进行文件的上传、下载(会产生文件数据时),会重新建立一个新的数据连接,如下图:

客户端通过控制连接告知服务器,使用主动模式传输数据,此时,它通告服务器端,自己将打开60289号端口来建立数据连接。服务器收到通告后,用自己的20号端口向客户端的60289号端口主动建立数据连接。通报端口的具体信息可以从上图中第283号包的解码中看到,如下图:

具体的计算方法是:

用端口号参数1*256+端口参数2=60289

以上为我们在“数据包视图”中看到的信息,如果想更为直观的看到做了哪些操作,我们可以在“TCP会话视图”中找到控制连接的会话,可直观的通过会话数据流看到整个操作过程,如下图:

FTP还支持匿名登录,下面是内网IP192.168.1.100通过匿名登录访问公网FTP服务器的数据流展示(上图中因为操作过多,主动模式“PORT”的命令下拉才能看见,下图的流中操作较少,更为直观):

关于FTP命令和响应码,我们在后面章节中具体介绍。

2.被动传输模式

看完了主动模式的数据包交互,再来看看被动模式。使用科来网络分析系统CSNAS捕获并分析一个被动模式下的FTP数据传输。客户端IP为192.168.111.1为客户端,192.168.111.130为FTP服务器端。

双方先进行三次握手,客户端192.168.111.1用自己的随机端口49721和服务器192.168.111.130的21号端口建立控制连接;

控制连接建立后,服务器让客户端进行登录,客户端输入用户名及密码进行登录(可以匿名登录);

登陆后可以进行相应的操作(客户端向服务器发送FTP命令,服务器用状态码进行相应);

传数据时单独建立数据连接(客户端让服务器打开一个端口,被动等待客户端来建立数据连接);

前面控制连接的步骤和主动模式一样,就不再赘述。在建立数据连接的时候,客户端会主动告知服务器使用被动模式(PASV),并让服务器打开指定的端口,被动等待客户端来进行连接:

通告的端口号信息,需要从“进入被动模式”的数据包解码中获取,如下:

具体的计算方法是:

用端口号参数1*256+端口参数2=193*256+106=49514

在会话流中看到的被动模式操作:

  三、FTP命令和响应码  

1.FTP命令

从上面的分析及截图中我们可以知道,FTP传输过程中所有的操作都是通过在客户端发送命令完成的,FTP常见的命令如下表所示:

命令描述
USER为用户验证提供用户名
PASS为用户验证提供密码
PWD输出 FTP 服务器的当前工作目录
TYPE设置传输的文件类型
SYST获取 FTP 服务器的操作系统
LIST获取 FTP 服务器上当前目录的文件列表
PORT指定使用主动模式进行数据传输,通告端口如:“PORT   IP地址,p1,p2”,端口为p1*256+p2
PASV指定使用被动模式进行数据传输,端口通告方法同上
HELP从 FTP 服务器上获取帮助文件
STOR从客户端上传指定的文件到 FTP 服务器
RETR从 FTP 服务器下载指定的文件到客户端
DELE删除 FTP 服务器上指定的文件
MKD在 FTP 服务器上新建目录
RMD删除 FTP 服务器上的指定目录
QUIT退出关闭 FTP 连接

2. FTP应答响应码

针对客户端发出的所有命令,FTP服务器会用响应码对其做出应答。FTP响应码和HTTP响应码类似,用三位数字“XYZ”表示:

第一个数字X:给出了命令状态的一般性指示,比如响应成功、失败或不完整;

第二个数字Y:响应类型的分类,如“2”代表跟连接有关的响应,“3”代表用户认证;

第三个数字Z:提供了更加详细的信息;

第一个数字“X”不同取值的含义如下:

1表示服务器正确接收信息,还未处理;

2表示服务器已经正确处理信息;

3表示服务器正确接收信息,正在处理;

4表示信息暂时错误;

5表示信息永久错误;

第二个数字“Y”不同取值的含义如下:

0表示语法;

1表示系统状态和信息;

2表示连接状态;

3表示与用户认证有关的信息;

4表示未定义;

5表示与文件系统有关的信息;

第三个数字“Z”根据是对XY取值的详细描述,无法列出含义。将FTP常见的应答代码列出,如下表:

应答代码描述
125打开数据连接,且此连接可用于数据传输
200命令被成功执行
211FTP服务器忙
212FTP服务器返回当前的目录状态给客户端
213FTP服务器返回当前的文件状态给客户端
214FTP服务器返回用户请求的帮助信息
226FTP服务器返回文件传输完成的消息给客户端
331FTP服务器返回用户名正确,需要密码的消息给客户端
425FTP服务器返回不能打开数据连接的消息给客户端
452FTP服务器返回写文件错的消息给客户端,可能是空间不足
500FTP服务器返回客户端命令不能识别的消息给客户端
501FTP服务器返回客户端命令的参数不能识别的消息给客户端
502FTP服务器返回未实现的模式类型的消息给客户端

  四、FTP面临的的安全性问题和解决方案  

上文中FTP的数据流可以看到,FTP最大的问题就在于采用明文传输,包括登陆用户名和密码都一览无余(可能经过base64编码,但仍然是明文)。

因此,FTP的安全性问题主要是避免明文传输,就有了以下两个协议:

1990年代:SSL/TLS集成(FTPS);

2000年代:SSH隧道技术(SFTP);

这两个协议的比较如下:

协议加密方式端口典型场景
SFTPSSH加密隧道22远程文件管理
FTPSSSL/TLS990企业级安全传输

现在还有更新的替代方案,如:AS2、Rsync等。新型协议的创新之处:

HTTP/3的多路复用技术;

QUIC协议的0-RTT握手;

区块链化的文件溯源系统;

这里只作简单介绍,感兴趣的读者可以自行进行更深入的探究。

  五、分析举例  

例:员工想从公司的FTP服务器上下载一个文件,但使用FTP客户端无法进行下载,在自己主机上去ping公司FTP服务器是通的,telnet服务器的21号端口(FTP服务端口)也是通的,但就是无法登陆下载。现在想通过流量分析出故障原因。

分析:FTP的原理我们已经清晰,直接抓包,看看客户端和FTP服务器是否能正常建联登录,并建立数据传输连接。是否是因为网络中存在防火墙的阻断或NAT的设置导致连接不成功。

打开FTP客户端,抓包如下:

可以看到三次握手成功,FTP客户端登录成功。印证了“ping公司FTP服务器是通的,telnet服务器的21号端口(FTP服务端口)也是通的”的说法。继续向下查看数据包:

可以清晰的看到,客户端是运行在主动模式,通过PORT命令向服务器通报数据连接端口号,然后服务器尝试用20号端口和客户端的58785号端口建立数据连接,但建联失败。(可能是服务器区域有防火墙,防火墙不允许区域外的主机连接客户端)。建议客户改用被动模式,如下:

替换成被动模式后,成功登陆并下载文件,故障解决。

  六、总结  

本篇文章我们从数据包的角度深入介绍了FTP协议,只要清楚了FTP双连接的工作原理和传输数据时采用的主动和被动模式,相信大家在以后的工作中,对FTP相关业务的处理能够驾轻就熟。后面我们还会陆续介绍更多常见应用层协议,请大家持续关注!