FTP概述

文件传输协议(FTP)作为网络共享文件的传输协议,在网络应用软件中具有广泛的应用。FTP的目标是提高文件的共享性和可靠高效地传送数据。在传输文件时,FTP客户端程序先与服务器建立连接,然后向服务器发送命令。服务器收到命令后给予响应,并执行命令。FTP协议与操作系统无关,任何操作系统上的程序只要符合FTP协议,就可以相互传输数据。

FTP协议简介

FTP是仅基于TCP的服务,不支持UDP,相比其他协议(如 HTTP协议),FTP协议要复杂一些。与一般的C/S应用不同点在于一般的C/S应用程序一般只会建立一个Socket连接,这个连接同时处理服务器端和客户端的连接命令和数据传输。而FTP协议中将命令与数据分开传送的方法提高了效率。

FTP使用2个端口,一个数据端口和一个命令端口(也叫做控制端口)。控制Socket用来传送命令,数据Socket是用于传送数据。每一个 FTP命令发送之后,FTP服务器都会返回一个字符串,其中包括一个响应代码和一些说明信息。其中的返回码主要是用于判断命令是否被成功执行了。

OSI七层协议与Wireshark显示关系

Frame: 物理层的数据帧概况

Ethernet II: 数据链路层以太网帧头部信息

Internet Protocol Version 4: 互联网层IP包头部信息

Transmission Control Protocol: 传输层T的数据段头部信息,此处是TCP

File Transfer Protocol: 应用层的信息,此处是FTP协议

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网卡进行抓包,结果如下图

图  1

图  2

通过上面两图可以看到ftp协议以及tfp-data协议的交互过程,我们看第一个52号包,为什么先从服务端发起的,其实在进行ftp协议之前,还有其他的tcp协议,现在我们将过滤条件更改为如下,再来分析抓包

ip.addr == 192.168.67.136 && ip.addr == 192.168.67.131

如下图,是完整的tcp建立连接,登陆ftp,传输文件,退出ftp的详细过程。

图  3

图3已经很详细的标明了各个步骤,结合代码1的操作来看,就能对应起来了。

此外,我还要说几点

  • 256号包里包含了详细目录信息如下

图 4
  • 我们可以注意到,图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~]#

整个过程的抓包结果如下

图 5

关于主动模式还有几点需要说明一下

  • 被动模式是服务端发送自己监听的数据端口(包括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 传输过程相关推荐

  1. WireShark 抓包理解 TLS 建立加密连接的过程

    一.实验环境 服务端:web容器 glassfish 部署了一个可以访问的web包 keystore.jks里添加的SSL证书,可参见 https://blog.csdn.net/yetugeng/a ...

  2. wireshark抓包理解TCP的三次握手

    一.实验目的 通过wireshark抓包工具,抓取客户机访问FTP服务器的连接过程进一步理解TCP的三次握手 二.实验拓扑 三.实验步骤 1.根据拓扑图搭建实验环境. 2.在客户机上安装安装Wires ...

  3. 模块学习4:(2)MQTT协议连接、发布、订阅、心跳、断链等分析和代码实现,并且通过mqtt.fx连接服务器,使用wireshark抓包分析mqtt实现过程

    文章目录 一.MQTT控制报文的结构 (1)固定报头(类型/标志 + 剩余长度) 剩余长度(这个要注意下,要注意它的计算方法,有一点特殊) 可变报头 有效载荷 二.下面直接开整各个具体的报文(MQTT ...

  4. wireshark抓包分析FTP

    简单通过抓把分析下ftp从登陆步骤 首先找到网上一个公用的ftp地址进行抓包测试,这里采用地址(瑞典Umeå universitet于默奥大学公共FTP服务器):ftp://ftp.acc.umu.s ...

  5. 通过wireshark抓包理解交换机、路由器工作原理

    一.集线器(hub) 1.首先在eNSP下配置环境1(点击下载) 2.在PC1执行ping命令 ping 192.168.1.2 -c 3 在抓包点PC3的Ethernet 0/0/1上抓包 3.由上 ...

  6. wireshark抓包数据:理解与分析

    wireshark是一个非常好用的抓包工具,本文根据平时抓包经验,对之前wireshark抓包的一些常见知识点进行了整理. 有不当之处,欢迎指正 注明:本文为原创文章,转载请注明出处.参考文章见本文末 ...

  7. Wireshark 抓包分析 RTSP/RTP/RTCP 基本工作过程

    整体而言,RTSP 通常工作于可靠的传输协议 TCP 之上,就像 HTTP 那样,用于发起/结束流媒体传输,交换流媒体元信息.RTP 通常工作于 UDP 之上,用于传输实际的流媒体数据,其中的载荷格式 ...

  8. FTP协议的Wireshark抓包分析

    文章目录 1.理论介绍 2.ftp安装 3.windows上连接ftp服务器 3.1.通过浏览器访问 3.2.通过资源管理器访问 3.3.通过命令行进行访问(本次采用方式,使用主动模式连接) 4.Wi ...

  9. Wireshark抓包分析TCP建立/释放链接的过程以及状态变迁分析

    Wireshark抓包分析TCP建立/释放链接的过程以及状态变迁分析 一.介绍计算机网络体系结构 1.计算机的网络体系结构 在抓包分析TCP建立链接之前首先了解下计算机的网络通信的模型,我相信学习过计 ...

最新文章

  1. 《css世界》的那些实用技巧
  2. tensorflow checkpoint文件
  3. #!/usr/bin/env python与#!/usr/bin/python的区别
  4. 2019建中台,2020拆中台,为什么很多公司中台战略宣告“失败”?
  5. 不用临时变量交换两个变量的值
  6. 乔布斯和任正非相比,谁更厉害?
  7. maven依赖 spark sql_Spark开发实例
  8. 如何配置CentOS或者RedHat5.X、6.X、7.X的网络yum源
  9. GitHub 上数十个 NetBeans 开源项目被卷入供应链攻击
  10. centos 6.3+mysql+5.6+nginx 1.5.8
  11. Android 博文
  12. xml文件解析出现[xX][mM][lL]的解决办法
  13. torchvision.transforms.Pad和torchvision.transforms.functional.pad的区别
  14. SPI DMA发送接收数据
  15. eem二级c语言题库哪种比较好,EEM18DCAD边缘板连接器供应【科美奇科技】Sullins华南地区渠道商...
  16. 英语计算机主板接口有,主板上常见英文的解释
  17. springmvc后台获取图片,到jsp页面显示
  18. Python批量给文件改名的两种方法
  19. ORB Synth安装下载教程搭配DAW宿主FL Studio / Studio One
  20. 企业文档加密软件选择标准是什么

热门文章

  1. 金色多边形欧美融资商业计划书ppt模板素材
  2. 信息课为什么不叫计算机课,第1课信息和信息技术”教学设计
  3. 简单体会数值求解一维扩散方程
  4. heic格式转化jpg,heic如何转jpg?
  5. linux防火墙文件更改重新加载,Linux防火墙设置
  6. openstack设计架构_设计下一个OpenStack T恤,DefCore更新等
  7. 关于C语言double free
  8. 电脑通过手机SIM卡收发短信
  9. python小游戏——反弹小球代码开源
  10. SAP 批次管理(Batch management)配置介绍