天天看點

Wireshark 抓包了解 FTP 傳輸過程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伺服器都會傳回一個字元串,其中包括一個響應代碼和一些說明資訊。其中的傳回碼主要是用于判斷指令是否被成功執行了。

Wireshark 抓包了解 FTP 傳輸過程FTP概述總結

OSI七層協定與Wireshark顯示關系

Frame: 實體層的資料幀概況

Ethernet II: 資料鍊路層以太網幀頭部資訊

Internet Protocol Version 4: 網際網路層IP標頭部資訊

Transmission Control Protocol: 傳輸層T的資料段頭部資訊,此處是TCP

File Transfer Protocol: 應用層的資訊,此處是FTP協定

FTP包格式如下:

Wireshark 抓包了解 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
           

用戶端登陸即操作過程

[[email protected] ~]# 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.
[[email protected] ~]# 
           

                                                                                            代碼   1

用戶端和服務端兩個系統為vmware裡的兩個虛拟機,我在我的實體主機上監聽虛拟網卡vnet8網卡進行抓包,結果如下圖

Wireshark 抓包了解 FTP 傳輸過程FTP概述總結

圖  1

Wireshark 抓包了解 FTP 傳輸過程FTP概述總結

圖  2

通過上面兩圖可以看到ftp協定以及tfp-data協定的互動過程,我們看第一個52号包,為什麼先從服務端發起的,其實在進行ftp協定之前,還有其他的tcp協定,現在我們将過濾條件更改為如下,再來分析抓包

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

 如下圖,是完整的tcp建立連接配接,登陸ftp,傳輸檔案,退出ftp的詳細過程。

Wireshark 抓包了解 FTP 傳輸過程FTP概述總結

圖  3

圖3已經很詳細的标明了各個步驟,結合代碼1的操作來看,就能對應起來了。

此外,我還要說幾點

  • 256号包裡包含了詳細目錄資訊如下
Wireshark 抓包了解 FTP 傳輸過程FTP概述總結

圖 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

同樣,用戶端的操作過程代碼如下

[[email protected] ~]# 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.
[[email protected]~]# 
           

整個過程的抓包結果如下

Wireshark 抓包了解 FTP 傳輸過程FTP概述總結

圖 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 用戶端

[[email protected] ~]# 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