Wireshark 抓包理解 FTP 传输过程
FTP概述
文件传输协议(FTP)作为网络共享文件的传输协议,在网络应用软件中具有广泛的应用。FTP的目标是提高文件的共享性和可靠高效地传送数据。在传输文件时,FTP客户端程序先与服务器建立连接,然后向服务器发送命令。服务器收到命令后给予响应,并执行命令。FTP协议与操作系统无关,任何操作系统上的程序只要符合FTP协议,就可以相互传输数据。
FTP协议简介
FTP是仅基于TCP的服务,不支持UDP,相比其他协议(如 HTTP协议),FTP协议要复杂一些。与一般的C/S应用不同点在于一般的C/S应用程序一般只会建立一个Socket连接,这个连接同时处理服务器端和客户端的连接命令和数据传输。而FTP协议中将命令与数据分开传送的方法提高了效率。
FTP使用2个端口,一个数据端口和一个命令端口(也叫做控制端口)。控制Socket用来传送命令,数据Socket是用于传送数据。每一个 FTP命令发送之后,FTP服务器都会返回一个字符串,其中包括一个响应代码和一些说明信息。其中的返回码主要是用于判断命令是否被成功执行了。
Frame: 物理层的数据帧概况
Ethernet II: 数据链路层以太网帧头部信息
Internet Protocol Version 4: 互联网层IP包头部信息
Transmission Control Protocol: 传输层T的数据段头部信息,此处是TCP
File Transfer Protocol: 应用层的信息,此处是FTP协议
FTP包格式如下:
命令端口和数据端口
一般来说,客户端有一个 Socket 用来连接 FTP 服务器的相关端口,它负责 FTP 命令的发送和接收返回的响应信息。一些操作如“登录”、“改变目录”、“删除文件”,依靠这个连接发送命令就可完成。服务器的命令端口号一般是21。
对于有数据传输的操作,主要是显示目录列表,上传、下载文件,我们需要依靠另一个Socket来完成。 如果使用被动模式,通常服务器端会返回一个端口号。客户端需要用另开一个Socket来连接这个端口,然后我们可根据操作来发送命令,数据会通过新开的一个端口传输。
如果使用主动模式,通常客户端会发送一个端口号给服务器端,并在这个端口监听。服务器需要连接到客户端开启的这个数据端口,并进行数据的传输。主动模式下,服务器的数据端口号一般是20。
主动模式(PORT)和被动模式(PASV)
主动模式下,客户端随机打开一个大于1024的端口向服务器的命令端口P(即21端口),发起连接,同时开放N +1端口监听,并向服务器发出“port N+1”命令,由服务器从它自己的数据端口(即20端口)主动连接到客户端指定的数据端口(N+1)。FTP的客户端只是告诉服务器自己的端口号,让服务器来连接客户端指定的端口。对于客户端的防火墙来说,这是从外部到内部的连接,可能会被阻塞。
为了解决服务器发起到客户的连接问题,有了另一种FTP连接方式,即被动方式。命令连接和数据连接都由客户端发起,这样就解决了从服务器到客户端的数据端口的连接被防火墙过滤的问题。被动模式下,当开启一个FTP连接时,客户端打开两个任意的本地端口(N > 1024和N+1)。第一个端口连接服务器的21端口,提交PASV命令。然后服务器会开启一个任意的端口(P > 1024),返回如227 entering passive mode (h1,h2,h3,h4,p1,p2)。它返回了227开头的信息,在括号中有以逗号隔开的六个数字,前四个指服务器的地址,最后两个,将倒数第二个乘 256再加上最后一个数字,这就是FTP服务器开放的用来进行数据传输的端口。
注意,通过下文的实验可以看出,这里的任意两个端口N和N+1其实不是连续的,而是真正的不相关的两个端口。
实验环境:
服务端:IP:192.168.67.136
系统:CentOS 6.8
ftp服务端:vsftpd-2.2.2-24.el6.x86_64
客户端:IP:192.168.67.131
系统:CentOS 6.8
ftp客户端:ftp-0.17-54.el6.x86_64
实验一:被动模式
服务端的被动模式配置为
pasv_enable=YES #开启被动模式
pasv_min_port=50000 #被动模式服务端数据连接端口范围最小值
pasv_max_port=50010 #被动模式服务端数据连接端口范围最大值
wireshark过滤条件
fpt || ftp-data
客户端登陆即操作过程
[root@localhost ~]# ftp
ftp> open 192.168.67.136 21
Connected to 192.168.67.136 (192.168.67.136).
220 Welcome to blah FTP service.
Name (192.168.67.136:root): virtual1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> get 1.zip
local: 1.zip remote: 1.zip
227 Entering Passive Mode (192,168,67,136,195,89).
150 Opening BINARY mode data connection for 1.zip (54848 bytes).
226 Transfer complete.
54848 bytes received in 0.000889 secs (61696.29 Kbytes/sec)
ftp> ls
227 Entering Passive Mode (192,168,67,136,195,89).
150 Here comes the directory listing.
-rw-r--r-- 1 500 500 54848 Sep 12 16:35 1.zip
-rw-r--r-- 1 500 500 14253627 Jun 07 16:11 11.zip
-rw-rw-r-- 1 500 500 0 Sep 12 13:17 test.txt
226 Directory send OK.
ftp> exit
221 Goodbye.
[root@localhost ~]#
代码 1
客户端和服务端两个系统为vmware里的两个虚拟机,我在我的物理主机上监听虚拟网卡vnet8网卡进行抓包,结果如下图
通过上面两图可以看到ftp协议以及tfp-data协议的交互过程,我们看第一个52号包,为什么先从服务端发起的,其实在进行ftp协议之前,还有其他的tcp协议,现在我们将过滤条件更改为如下,再来分析抓包
ip.addr == 192.168.67.136 && ip.addr == 192.168.67.131
如下图,是完整的tcp建立连接,登陆ftp,传输文件,退出ftp的详细过程。
图3已经很详细的标明了各个步骤,结合代码1的操作来看,就能对应起来了。
此外,我还要说几点
- 256号包里包含了详细目录信息如下
- 我们可以注意到,图3中控制连接和数据连接分别都经历了三次握手和四次挥手,且数据连接建立了两次,分别是传输文件和显示目录的时候,所以在ftp客户端进行的各种例如ls,pwd等命令操作,其返回信息都是通过数据连接来传输信息的。且每次建立数据连接之前,客户端都会发送主动或者被动的模式的指令告知服务端。
- 还有,服务端是如何告诉客户端服务端监听的数据端口号呢?
比如168号包,服务端返回 Response: 227 Entering Passive Mode (192,168,67,136,195,89),其中192,168,67,136,代表服务端IP 192.168.67.195,而后面两个数 195 * 256 + 89 = 50009,即告诉客户端服务端监听的数据端口为50009。
因为服务端的配置文件里限制了端口范围为50000-50010,所以也都会在这个范围内。因此,服务端的防火墙除了需要开启21号端口,也需要开启50000-50010这段的端口
-A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 50000:50010 -j ACCEPT
正因为服务端的端口可控,因此在客户端和服务都开启了防火墙的情况下,被动模式更为适用。
- 还有就是图3中的四次挥手,有些时候只有三个包。其实是tcp为了优化,将中间两个包合并在一起发送了。
实验二:主动模式
说完被动模式,现在来说说主动模式。
服务端配置为关闭被动模式
pasv_enable=YES
服务端防火墙只需要开启21号端口即可
-A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT
客户端关闭iptables
同样,客户端的操作过程代码如下
[root@localhost ~]# ftp
ftp> open 192.168.67.136 21
Connected to 192.168.67.136 (192.168.67.136).
220 Welcome to blah FTP service.
Name (192.168.67.136:root): virtual1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> passive
Passive mode off.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-rw-r--r-- 1 500 500 54848 Sep 12 16:35 1.zip
-rw-r--r-- 1 500 500 14253627 Jun 07 16:11 11.zip
-rw-rw-r-- 1 500 500 0 Sep 12 13:17 test.txt
226 Directory send OK.
ftp> get 1.zip
local: 1.zip remote: 1.zip
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for 1.zip (54848 bytes).
226 Transfer complete.
54848 bytes received in 0.00319 secs (17172.20 Kbytes/sec)
ftp> exit
221 Goodbye.
[root@localhost~]#
整个过程的抓包结果如下
关于主动模式还有几点需要说明一下
- 被动模式是服务端发送自己监听的数据端口(包括IP),等待客户端来连接;而主动模式是客户端发送自己监听的数据端口(包括IP),等待服务端主动过来连接。被动模式下,服务端发送的端口范围可以在配置文件里控制,而主动模式下,客户端发送的端口是随机的,没有办法控制。因此在被动模式下,双方都可以开启防火墙,服务端在iptables上打开21和相应的数据端口即可;而在主动模式下,服务端iptables只需要开启21端口等待客户端的控制连接,客户端则不能打开防火墙,否则服务端的数据通道连接不上客户端监听的随机端口。
- 在linux下的ftp客户端,一般默认的连接模式是被动连接,所以这里我们在登陆FTP成功后,需要使用passive命令关闭被动模式(再执行一次又开启了)。
- 在182号包和243号包里,Response: 200 PORT command successful. Consider using PASV 其中的Consider using PASV到底是什么意思,此处我们服务端已经设定为主动模式了,且客户端也已经发送了自己监听的端口,为什么服务端还会显示"考虑使用PASV"呢,希望知道的大神指点一下。
总结
1.配置
一般,ftp服务搭建连接不通主要就是主被动没搞清楚,记住vsftpd中,与主被动相关的配置只有如下三个
pasv_enable=NO
pasv_min_port=50000
pasv_max_port=50010
当然,其他的文件目录权限不对,也是连接不上的。
2.客户端版本
以服务端vsftpd(linux下)为例,客户端版本就许多种,且不同的客户端版本下的ftp命令不完全相同。
如linux ftp 客户端
[root@mail ~]# ftp
ftp> help
Commands may be abbreviated. Commands are:! debug mdir sendport site
$ dir mget put size
account disconnect mkdir pwd status
append exit mls quit struct
ascii form mode quote system
bell get modtime recv sunique
binary glob mput reget tenex
bye hash newer rstatus tick
case help nmap rhelp trace
cd idle nlist rename type
cdup image ntrans reset user
chmod lcd open restart umask
close ls prompt rmdir verbose
cr macdef passive runique ?
delete mdelete proxy send
ftp>
windows下自带的ftp 客户端
C:\Users\Administrator>ftp
ftp> help
命令可能是缩写的。 命令为:! delete literal prompt send
? debug ls put status
append dir mdelete pwd trace
ascii disconnect mdir quit type
bell get mget quote user
binary glob mkdir recv verbose
bye hash mls remotehelp
cd help mput rename
close lcd open rmdir
ftp>
windows下,xshell自带的ftp 客户端
ftp:/> help
ascii set ascii transfer type
bin set binary transfer type
binary set binary transfer type
cd change remote working directory
cdup change remote working directory to parent directory
delete delete remote file
dir list contents of remote directory
exit terminate ftp session and exit
get receive file
help print local help information
lcd change local working directory
ldir list contents of local directory
lls list contents of local directory
lpwd print working directory on local machine
ls list contents of remote directory
mget get multiple files
mkdir make directory on the remote machine
mput put multiple files
mv rename file
passive toggle pasive transfer mode
put send one file
quit terminate ftp session and exit
quote send arbitrary ftp command
rename rename file
rm delete remote file
rmdir remove directory on the remote machine
user send new user information
ftp:/>
关于FTP协议的命令可以查看官方文档 https://zh.wikipedia.org/wiki/FTP命令列表 ,这些户端都是在这些基础上来增加的。
参考:
https://blog.csdn.net/longyc2010/article/details/43113173
https://zh.wikipedia.org/wiki/FTP命令列表
https://blog.csdn.net/longyc2010/article/details/43113173
Wireshark 抓包理解 FTP 传输过程相关推荐
- WireShark 抓包理解 TLS 建立加密连接的过程
一.实验环境 服务端:web容器 glassfish 部署了一个可以访问的web包 keystore.jks里添加的SSL证书,可参见 https://blog.csdn.net/yetugeng/a ...
- wireshark抓包理解TCP的三次握手
一.实验目的 通过wireshark抓包工具,抓取客户机访问FTP服务器的连接过程进一步理解TCP的三次握手 二.实验拓扑 三.实验步骤 1.根据拓扑图搭建实验环境. 2.在客户机上安装安装Wires ...
- 模块学习4:(2)MQTT协议连接、发布、订阅、心跳、断链等分析和代码实现,并且通过mqtt.fx连接服务器,使用wireshark抓包分析mqtt实现过程
文章目录 一.MQTT控制报文的结构 (1)固定报头(类型/标志 + 剩余长度) 剩余长度(这个要注意下,要注意它的计算方法,有一点特殊) 可变报头 有效载荷 二.下面直接开整各个具体的报文(MQTT ...
- wireshark抓包分析FTP
简单通过抓把分析下ftp从登陆步骤 首先找到网上一个公用的ftp地址进行抓包测试,这里采用地址(瑞典Umeå universitet于默奥大学公共FTP服务器):ftp://ftp.acc.umu.s ...
- 通过wireshark抓包理解交换机、路由器工作原理
一.集线器(hub) 1.首先在eNSP下配置环境1(点击下载) 2.在PC1执行ping命令 ping 192.168.1.2 -c 3 在抓包点PC3的Ethernet 0/0/1上抓包 3.由上 ...
- wireshark抓包数据:理解与分析
wireshark是一个非常好用的抓包工具,本文根据平时抓包经验,对之前wireshark抓包的一些常见知识点进行了整理. 有不当之处,欢迎指正 注明:本文为原创文章,转载请注明出处.参考文章见本文末 ...
- Wireshark 抓包分析 RTSP/RTP/RTCP 基本工作过程
整体而言,RTSP 通常工作于可靠的传输协议 TCP 之上,就像 HTTP 那样,用于发起/结束流媒体传输,交换流媒体元信息.RTP 通常工作于 UDP 之上,用于传输实际的流媒体数据,其中的载荷格式 ...
- FTP协议的Wireshark抓包分析
文章目录 1.理论介绍 2.ftp安装 3.windows上连接ftp服务器 3.1.通过浏览器访问 3.2.通过资源管理器访问 3.3.通过命令行进行访问(本次采用方式,使用主动模式连接) 4.Wi ...
- Wireshark抓包分析TCP建立/释放链接的过程以及状态变迁分析
Wireshark抓包分析TCP建立/释放链接的过程以及状态变迁分析 一.介绍计算机网络体系结构 1.计算机的网络体系结构 在抓包分析TCP建立链接之前首先了解下计算机的网络通信的模型,我相信学习过计 ...
最新文章
- 《css世界》的那些实用技巧
- tensorflow checkpoint文件
- #!/usr/bin/env python与#!/usr/bin/python的区别
- 2019建中台,2020拆中台,为什么很多公司中台战略宣告“失败”?
- 不用临时变量交换两个变量的值
- 乔布斯和任正非相比,谁更厉害?
- maven依赖 spark sql_Spark开发实例
- 如何配置CentOS或者RedHat5.X、6.X、7.X的网络yum源
- GitHub 上数十个 NetBeans 开源项目被卷入供应链攻击
- centos 6.3+mysql+5.6+nginx 1.5.8
- Android 博文
- xml文件解析出现[xX][mM][lL]的解决办法
- torchvision.transforms.Pad和torchvision.transforms.functional.pad的区别
- SPI DMA发送接收数据
- eem二级c语言题库哪种比较好,EEM18DCAD边缘板连接器供应【科美奇科技】Sullins华南地区渠道商...
- 英语计算机主板接口有,主板上常见英文的解释
- springmvc后台获取图片,到jsp页面显示
- Python批量给文件改名的两种方法
- ORB Synth安装下载教程搭配DAW宿主FL Studio / Studio One
- 企业文档加密软件选择标准是什么