FTP协议报文详解及FTP穿越NAT
目录
1、拓扑图
2、FTP协议简介
FTP 英文全称:File Transfer Protocol,中文全称:文件传输协议
提供交互式的访问,对传输文件的格式和类型有分类,允许文件具有存取权限。适合异构网络任意计算机的传送。
3、FTP工作原理
FTP采用C/S架构,使用TCP可靠的传输服务。一个FTP服务器进程可同时为多个客户进程提供服务,FTP服务器检查有两大部分组成:一个主进程,负责接收新的请求,另外有若干的从属进程,负责处理单个请求,工作步骤如下:
- 建立TCP连接
- 打开熟知端口21(控制端口),使客户进程能够连接上
- 等待客户进程发链接请求。
- 启动从属进程来处理客户进程发来的请求。主进程与从进程并发执行,从属进程对客户进程的请求处理完毕后即终止。
- 回到等待状态,继续接收其他客户进程的请求。
3.1、主动连接(PORT)
1、主动连接介绍
服务端通过制定端口号(20)主动与客户端建立数据连接,并向客户端发送数据。
以下报文是SNAT转换后的报文,源IP(10.10.10.2)转换成出接口IP地址(192.168.10.114)
2、报文拆分解释
2.1、报文1-3:TCP建立三次握手,建立连接
2.2、报文4:服务端(21端口)向客户端(49203端口)发送request报文。code字段表示新用户服务就绪,arg字段为服务器名称和服务器版本号
2.3、报文5:客户端(49203端口)向服务端(21端口)发送request报文。command字段表示该报文里包含的是用户名,arg字段为用户名内容。
2.4、报文6:服务端(21端口)回复response报文,code值为331,表示用户名可以,需要密码
2.5、报文7:客户端(49203端口)向服务端(21端口)发送request报文,command字段表示该报文里包含的是密码,arg字段为密码内容。
2.6、报文8:服务端(21端口)回复response报文,code值为230,表示用户已登录,请继续操作
2.7、报文9:客户端(49203端口)向服务端(21端口)发送SYST报文,表示返回服务器使用的操作系统。
2.8、报文10:服务端(21端口)回应系统类型,code字段为215,表示返回的是系统类型。arg字段为UNIX,表示系统类型是UNIX系统
2.9、包11:客户端(49203端口)请求系统状态
包12:服务端(21端口)回应系统状态,code字段为211,arg字段为特征列表
2.10、包15:客户端(49203端口)PWD获取当前路径
包16:服务端(21端口)返回当前路径
包17:客户端(49203端口)CWD更改目录
包18:服务端(21端口)返回修改后的目录
包19:客户端(49203端口)PWD获取当前路径
包20:服务端(21端口)返回当前路径
2.11、包21:客户端(49203端口)请求使用ascii传输
包22:服务端(21端口)响应,同意使用ascii传输
2.12、包23:客户端(49203端口)发起主动连接,向服务端发送建立子连接的IP和端口
包24:服务端(21端口)响应,同意使用客户端发送的IP端口建立子连接
2.13、包26-28:FTP子连接三次握手建立TCP连接。
2.14、包:30-32:服务端(20端口)向客户端(49204端口)发送数据。
2.15、包33-37:数据传输完成,TCP断开连接
2.16、包60-63:控制连接已断开,TCP四次挥手断开TCP连接
3.2、被动连接(PASV)
1、被动连接介绍
服务端采用客户端建议使用被动模式,开启数据传输端口的监听,被动等待客户端的连接然后向客户端发送数据。
以下报文是SNAT转换后的报文,源IP(10.10.10.2)转换成出接口IP地址(192.168.10.114)
2、报文拆分解释
2.1、TCP三次握手建立TCP连接
2.2、报文4:服务端(21端口)向客户端(49206端口)。code字段表示新用户服务就绪,arg字段为服务器名称和服务器版本号
2.3、报文5:客户端(49206端口)向服务端(21端口)发送request报文。command字段表示该报文里包含的是用户名,arg字段为用户名内容。
2.4、报文6:服务端(21端口)回复response报文,code值为331,表示用户名可以,需要密码
2.5、报文7:客户端(49206端口)向服务端(21端口)发送request报文,command字段表示该报文里包含的是密码,arg字段为密码内容。
2.6、报文8:服务端(21端口)回复response报文,code值为230,表示用户已登录,请继续操作
2.7、报文9:客户端(49206端口)向服务端(21端口)发送SYST报文,表示返回服务器使用的操作系统。
2.8、报文10:服务端(21端口)回应系统类型,code字段为215,表示返回的是系统类型。arg字段为UNIX,表示系统类型是UNIX系统
2.9、包11:客户端(49206端口)请求系统状态
包12:服务端(21端口)回应系统状态,code字段为211,arg字段为特征列表
2.10、包15:客户端(49206端口)PWD获取当前路径
包16:服务端(21端口)返回当前路径
包17:客户端(49206端口)CWD更改目录
包18:服务端(21端口)返回修改后的目录
包19:客户端(49206端口)PWD获取当前路径
包20:服务端(21端口)返回当前路径
2.12、包23:客户端(49206端口)向服务端请求建立被动连接
包24:服务端(21端口)响应,同意建立被动连接,并且向客户端发送服务端的IP和监听端口
2.13、包26-28:FTP子连接三次握手建立TCP连接。
2.14、包:32-33:服务端(20端口)向客户端(49207端口)发送数据。
2.15、包34-36:数据传输完成,TCP断开连接
2.16、包59-62:控制连接已断开,TCP四次挥手断开TCP连接
3.3、FTP主动模式穿越SNAT原理
主动模式穿越SNAT主要用于FTP服务端在公网,客户端需要通过SNAT转换访问服务端。
1、FTP客户端通过防火墙的SNAT访问FTP服务端时使用主动模式。
2、当客户端发送PORT报文到服务端时,报文内的active ip address字段为10.10.10.2,active port字段为49217
3、当穿越SNAT的时候,SNAT会把active ip address字段和active port字段改为转换后的IP和端口
4、服务端收到经过SNAT后的PORT报文后,会给192.168.10.114发送响应报文。
5、响应报文经过链接跟踪表,转发给客户端。
3.4、FTP被动模式穿越DNAT原理
被动模式穿越DNAT主要用于FTP服务端在私网,客户端需要通过DNAT转换后访问服务端。
1、FTP客户端访问防火墙的10.10.10.1,进行DNAT转换,转换目的IP为192.168.10.114
2、当客户端发送PASV报文到服务端后,服务端返回自己的监听IP和端口,passive ip address字段是192.168.10.115,passive port字段是62443
3、当穿越DNAT的时候,DNAT会把passive ip address字段和passive port字段改为转换后的IP和端口
4、客户端收到转换后的响应报文后,和转换后的响应报文进行建立数据连接
4、问题思考
4.1、主动模式和被动模式是谁决定的
主动模式和被动模式是由客户端决定的,客户端请求建立数据连接时,发送PVSA报文,服务端就会建立被动连接;当客户端发送PORT报文时,服务端就会建立主动连接。
4.2、主动模式和被动模式是怎么协商出端口
主动模式协商端口
1、客户端使用任意一个的非熟知权端口N(N>1024)与服务端建立FTP控制连接,然后客户端开始监听N+1端口。客户端向服务端21端口发送PORT报文,PORT报文里包含客户端监听的IP和N+1端口。
2、服务端收到客户端的PORT报文后,使用客户端发送的IP和N+1端口与客户端建立数据连接。
被动模式协商端口
- 客户端开启FTP连接时,会打开两个任意的非熟知端口(N > 1024和N+1)。N端口连接服务器的21端口。
- 客户端发送PVSA报文给服务端
- 服务器会开启一个任意的非熟知端口(P > 1024),并发送响应报文给客户端响应报文包含服务端IP和端口号P。
- 客户端发起从本地端口N+1到服务器的端口P建立数据连接。
4.3、设想中间防火墙怎么识别子连接并给子连接放行
被动模式:
- 客户端开启FTP连接时,会打开两个任意的非熟知端口(N > 1024和N+1)。N端口连接服务器的21端口。
- 客户端发送PVSA报文给服务端。
- 服务器会开启一个任意的非熟知端口(P > 1024),并发送响应报文给客户端,响应报文包含服务端子连接IP和端口P。
- 防火墙收到服务端的响应后,获取响应报文中子连接的IP和端口P。
- 客户端发起从本地端口N+1到服务器的子连接IP、端口P建立数据连接。
- 防火墙收到客户端发送的报文目的IP是子连接IP后,允许转发,并转发给服务器。
4.4、思考NAT设备如何给子连接做地址转换
主动模式:
- 客户端使用任意一个的非熟知端口N(N>1024)与服务端建立FTP控制连接
- 客户端监听N+1端口。
- 客户端向服务端21端口发送PORT报文建立子连接,PORT报文里包含客户端监听的IP和N+1端口。
- NAT设备获取PORT报文内的客户端IP和N+1端口
- NAT设备修改PORT报文内的客户端IP和N+1端口为自己的IP和端口,生成动态NAT
- 服务端收到客户端的PORT报文后,使用NAT转换后的IP和端口与客户端建立数据连接。
- NAT设备收到后,访问转换后的IP和端口,根据动态NAT转换为客户端子连接的IP和N+1端口,发送给客户端。
4.5、下载两个文件,会每个文件开一个数据连接么
FTP同时下载两个文件,FTP会为每个文件打开一个数据连接。
1、下载文件test.txt,开启一条数据连接
2、下载文件test1.txt,开启另一条数据连接
4.6、列出目录,服务器发送目录列表,会使用数据连接传输么
会使用数据连接发送目录列表,当数据连接建立完成后,服务器会向客户端发送当前路径和目录列表内容。
5、FTPipv4和ipv6的区别
控制连接请求(被动模式)
IPv4使用PASV建立控制连接。PASV报文response报文的code字段为227(进入被动模式),arg字段为监听IP和端口。
IPv6使用EPSV建立控制连接。EPSV报文response报文的code字段为229(进入被动模式),arg字段为监听端口
控制连接请求(主动模式)
IPv4使用PORT建立控制连接。请求时携带监听的IPv4地址和端口。PART报文response报文返回200
IPv6使用EPRT建立控制连接。请求时携带监听的IPv6地址和端口。EPRT报文response报文返回200