詳解 ftp 協議,力薦!!!

You know some birds are not meant to be caged, their feathers are just too bright.

1 概述

FTPFile Transfer Protocol的縮寫,即文件傳輸協議,是TCP/IP 協議族中的協議之一。FTP 是一個用於在計算機網絡上在客戶端和服務器之間進行文件傳輸的應用層協議。RFC 959定義了 FTP 協議規範。

FTP 可謂網絡協議中的活化石。其原始規範由 Abhay Bhushan 編寫,並於 1971 年 4 月 16 日作爲RFC 114發佈。而被人熟知的TCP/IP協議要等到 1983 年才成爲大部分因特網共同遵守的一種網絡規則。同大多數Internet服務一樣,FTP 也是一個客戶 / 服務器系統(C/S系統)。用戶通過一個客戶端程序連接至在遠程計算機上運行的服務器程序。依照 FTP 協議提供服務,進行文件傳送的計算機就是 FTP 服務器,而連接 FTP 服務器,遵循 FTP 協議與服務器傳送文件的電腦就是 FTP 客戶端。用戶要連上 FTP 服務器,就要用到 FTP 的客戶端軟件,通常 Windows 系統自帶“ftp”命令,這是一個命令行的 FTP 客戶端程序,另外常用的 FTP 客戶端程序還有FileZillaCuteFTP

FTP 實現的目標:

  1. 促進文件的共享(計算機程序或數據);

  2. 鼓勵間接或者隱式的使用遠程計算機;

  3. 向用戶屏蔽不同主機中各種文件存儲系統(File system)的細節;

  4. 可靠和高效的傳輸數據。

2 實驗環境搭建

爲了更透徹的理解和掌握 FTP,在敘述 FTP 協議內容的同時,也需要以 “實戰” 的方式抓取 FTP 客戶端FTP 服務器之間交互的網絡包,以此和 FTP 協議相互印證,加深理解。本節主要介紹抓取 FTP 網絡包的環境搭建。實驗環境將以 Windows 系統平臺作爲 FTP 客戶端,以 linux 系統虛擬機作爲 FTP 服務器

FTP 實驗環境搭建:

  1. Windows 系統安裝 wireshark 抓包工具;

  2. Windows 系統安裝 linux 虛擬機(本次實驗版本:Ubuntu 16.04);

  3. 熟悉 Windows 系統"ftp"命令行的使用。

在微軟幫助文檔 (https://docs.microsoft.com/en-us/previous-versions/orphan-topics/ws.10/cc755356(v=ws.10)) 中已經將"ftp"命令行介紹得比較詳細,有需要可以點擊查看。爲了內容上的連貫性,本節會對常用的"ftp"命令行進行講解。

常用的"ftp"命令行(可以打開cmdPowerShell進行驗證):

注意"ftp"命令行只是 Windows 系統自帶的 FTP 客戶端程序,"ftp"命令行的使用和將要介紹的 FTP 文件傳輸協議無關。

3 FTP 詳解

FTP 作爲一個古老的協議,現在仍然被廣泛使用,一定有其過人之處。其最大的一個優點就是部署、使用起來非常簡單。只要兩個設備部署了 FTP 客戶程序FTP 服務程序,知道用戶名和密碼,就能夠實現文件的輕鬆互傳。甚至一些匿名 FTP 服務器,就算沒有用戶名和密碼也能夠訪問。如一些軟件分發、資料分享,就可能使用到匿名 FTP 服務器

3.1 文件傳輸過程

FTP 使用簡單並不意味着其實現簡單。與常見的應用層協議 http 只需要一個 TCP 連接不同,FTP 需要兩個 TCP 連接來完成文件的傳輸。其中一個稱爲控制連接,一個稱爲數據連接

默認情況下,FTP 使用2021這兩個端口,其中20用於數據連接(傳遞數據),21用於控制連接(傳遞控制信息)。但是,是否使用20作爲傳輸數據的端口與 FTP 使用的傳輸模式有關,如果採用主動模式,那麼數據傳輸端口就是20;如果採用被動模式,則具體最終使用哪個端口要服務器端和客戶端協商決定。

如下圖所示,描述了使用 FTP 進行文件傳輸的過程,用戶通過客戶端程序(ftp 命令行或 FileZilla)與 ftp 服務器進行交互。用戶的輸入邏輯會被用戶協議解釋器解析,轉換成 FTP 命令,通過控制連接(一個 tcp 連接,port 口爲 21)給到服務器協議解釋器,服務器協議解釋器會迴應一個 FTP 應答。並且根據傳輸過來的 FTP 命令類型,服務器協議解釋器可能需要去啓動服務器數據傳輸功能,其過程包括服務器主動發起建立一個 tcp 連接(用 port 口 20),通過該連接服務端和客戶端就可以進行數據傳輸了。在數據傳輸完成後,服務端會將該數據連接關閉掉,直到下一次需要文件傳輸時才又開啓,所以可以看到數據連接是隨時開、隨時關。而控制連接在被創建後,其會一直保持下去,隨時等待用戶命名的輸入,直到主動斷開。

3.2 報文格式

在 FTP 協議中,FTP 命令FTP 應答,是以ASCII碼形式的明文傳遞。FTP 命令的一般報文格式是:命令 選項參數 \r\nFTP 應答的一般報文格式爲:狀態碼 報文選項 \r\n。先來介紹 FTP 命令

FTP 命令都是34個字節的大寫 ASCII 字符組成,其中一些命令帶選項參數。從客戶端向服務器發送的 FTP 命令有很多,在rfc959中有定義。本節介紹一些常用的。

   命令                             說明

ABOR                        放棄先前的FTP命令和數據傳輸
LIST filelist               列表顯示文件或目錄
PASS password               服務器上的密碼
PORT n1,n2,n3,n4,n5,n6      客戶端IP地址(n1 .n2 .n3 .n4)和端口(n5 × 256 + n6)
QUIT                        從服務器退出
RETR filename               檢索(取)一個文件
STOR filename               存儲(放)一個文件
SYST                        服務器返回系統類型
TYPE type                   說明文件類型:A表示ASCII碼,I表示二進制類型
USER username               服務器上用戶名

FTP 應答的狀態碼是 ASCII 碼形式的 3 位數字,並且跟有報文選項。應答狀態碼中每一位數字都有不同的含義。應答狀態碼第 1 位第 2 位的含義如下,第 3 位給出出錯報文的附加含義。

狀態碼                解釋

1yz          正面的初步答覆。該操作正在啓動,但在發送另一個命令之前需要另一個回覆。
2yz          肯定完成回覆,可以發送新命令。
3yz          正面的中間答覆。命令已被接受,但必須發送另一個命令。
4yz          暫時否定完成回覆請求的操作沒有發生,但錯誤情況是暫時的,因此可以稍後重新發出命令。
5yz          永久否定完成回覆。 該命令未被接受,不應重試。
x0z          語法錯誤。
x1z          信息。
x2z          連接。涉及控制或數據連接的回覆。
x3z          身份驗證和記帳。回覆登錄或記帳命令。
x4z          未指定。
x5z          文件系統狀態。

一些典型的狀態碼含義如下:

下面來通過抓實際環境中的網絡包,看客戶端和服務器的 FTP 命令FTP 應答交互過程。使用前面介紹的 windows 環境下的"ftp"命令行和 FTP 服務器進行交互。如下圖所示爲客戶端登錄到 FTP 服務器的抓包過程,客戶端 ip 地址爲192.168.2.6,服務端 ip 地址爲192.168.2.2。如圖中紅框所示,可以看到首先客戶端和服務器通過 tcp 三次握手建立了一條 tcp 通路,服務端端口號21,客戶端端口號是22655,這條通路就是上面所說的控制連接。因爲沒有進行文件數據傳輸,所以數據連接尚未建立。

windows 環境"ftp"命令行客戶端展現的交互過程:

ftp> open 192.168.2.2
連接到 192.168.2.2。
220 (vsFTPd 3.0.3)
---> OPTS UTF8 ON
200 Always in UTF8 mode.
用戶(192.168.2.2:(none)): book
---> USER book
331 Please specify the password.
密碼:
---> PASS 123456
230 Login successful.

客戶端登錄到 FTP 服務器的抓包過程

建立好控制連接之後,客戶端和服務器就開始了報文交互,如圖中的綠框所示,下面文字也描述了其報文交互過程,並且做了註釋。

服務端(192.168.2.2): 220 (vsFTPd 3.0.3)                //220,表示服務器準備完成,客戶端可以發送命令了。 後面跟的是FTP服務器的版本信息。
客戶端(192.168.2.6):OPTS UTF8 ON                      //表示服務器需要切換到UTF8字符集進行工作。
服務端(192.168.2.2): 200 Always in UTF8 mode.          //200,表示命令執行成功,後面的提示信息表示已經工作再UTF8模式下了。
客戶端(192.168.2.6):USER book                         //指定用戶book登錄
服務端(192.168.2.2): 331 Please specify the password.  //331 表示需要輸入密碼
客戶端(192.168.2.6):PASS 123456                       //客戶端輸入密碼123456
服務端(192.168.2.2): 230 Login successful.             //# 230 表示用戶登入成功

下圖展示了第一個 FTP 應答報文220 (vsFTPd 3.0.3)\r\n的二進制數據形式,其也印證了 FTP 報文是以 ASCII 碼明文進行傳遞的。220 (vsFTPd 3.0.3)\r\n報文的 20 個字節 (包含空格) 的 ASCII 碼爲32 32 30 20 28 76 73 46 54 50 64 20 33 2e 30 2e 33 29 0d 0a

第一個 FTP 應答報文

3.3 數據連接

上一節看到了控制連接的建立和連接建立之後的客戶端和服務器之間的報文交互。本節來看一下數據連接。數據連接有如下三個用途:

這裏再強調一下控制連接一直保持到客戶端—服務器連接的全過程,但數據連接可以根據需要隨時開、隨時關。根據 FTP 數據連接的用途可以看到,在進行文件傳輸或是查詢服務器端文件或目錄列表時,需要創建數據連接。數據連接的創建過程如下:

下面來進行網絡抓包看一下實際的數據連接建立過程。通過 windows 環境下的"ftp"命令行客戶端向 FTP 服務器請求一個文件123.c來觸發數據連接的建立。下圖爲數據連接的網絡抓包過程。客戶端通過PORT命令將端口信息 (192,168,2,6,88,137、端口號:88*256+137=22665) 傳到服務端;服務端通過自身20端口和客戶端22665端口,主動建立 TCP 連接,此連接就是爲數據連接。文件數據123.c就是通過該連接進行傳輸。文件數據傳輸完成後,服務端又會主動發起斷開該連接,如下圖中紅框所示的四次揮手。

windows 環境"ftp"命令行客戶端展現的交互過程:

ftp> get 123.c
---> PORT 192,168,2,6,88,137
200 PORT command successful. Consider using PASV.
---> RETR 123.c
150 Opening BINARY mode data connection for 123.c (48 bytes).
226 Transfer complete.
ftp: 收到 48 字節,用時 0.00秒 16.00千字節/秒。
ftp>

數據連接建立過程

3.4 主動模式

思考一下上一節描述的數據連接會有什麼問題?其發起數據連接過程爲,客戶端通過PORT命令將客戶端監聽的端口號傳遞給服務端,服務端通過固定的20端口主動去和客戶端監聽的端口進行 TCP 連接,此連接就是數據連接。可以看到如果客戶端的防火牆阻止了服務器的主動連接請求,那麼數據連接就會失敗。所以主動模式有一定缺陷。

上面描述的這種連接模式就是主動模式,主動是相對於服務端來說的。下圖示意了主動模式過程,控制連接是客戶端發起,數據連接是服務端發起。

主動模式

3.5 被動模式

爲了解決主動模式所面臨的問題,FTP 協議也支持被動模式。被動模式的示意圖如下圖所示:控制連接和數據連接都由客戶端主動發起,而且服務端數據連接端口不在是固定端口20,而是被分配了一個臨時端口。因爲兩次連接都是客戶端主動發起,所以就不會有防火牆的問題。

被動模式

通過網絡數據包來看一下被動模式的交互過程。客戶端通過發送PASV,表明客戶端明確告知 FTP 服務器它使用被動模式。服務器收到PASV後,會分配一個臨時端口號 37499(192,168,2,5,146,123,端口號 = 146*256+123=34799),並通過報文將該端口號通知到客戶端。明確好了兩端的端口號,客戶端就會主動通過 TCP 三次握手和服務器建立連接,該連接就是數據連接。在文件傳輸完畢後,服務器通過 TCP 四次揮手,斷開該連接。

被動模式網絡數據包

3.6 匿名服務器

回憶一下上面介紹的客戶端向 FTP 服務器發起連接的過程,第一步基本都需要輸入服務器的用戶名和密碼。但有一些 FTP 服務器天然就是爲了分發軟件和共享文件而存在,讓每一個人都申請用戶名和密碼,將非常的不方便。匿名 FTP(anonymous FTP) 就是爲了應對這種場景而出現的。

匿名 FTP 服務器的實質是:提供服務的機構在它的 FTP 服務器上建立一個公開賬戶(一般爲 anonymous),並賦予該賬戶訪問公共目錄的權限。用戶想要登錄到這些 FTP 服務器時,無需事先申請用戶賬戶和密碼,可以用anonymous作爲用戶名,用自己的E-mail地址做密碼或直接不輸入密碼,便可登錄,獲取 FTP 服務。

ftp.gnu.org就是一個匿名服務器,用於GNU 的軟件分發和資料共享。如下是其登錄過程,直接用anonymous當作用戶名,不需要輸入密碼。

ftp> open ftp.gnu.org
連接到 ftp.gnu.org。
220 GNU FTP server ready.
200 Always in UTF8 mode.
用戶(ftp.gnu.org:(none)): anonymous
230-NOTICE (Updated October 15 2021):
230-
230-If you maintain scripts used to access ftp.gnu.org over FTP,
230-we strongly encourage you to change them to use HTTPS instead.
230-
230-Eventually we hope to shut down FTP protocol access, but plan
230-to give notice here and other places for several months ahead
230-of time.
230-
230----
230-
230-Due to U.S. Export Regulations, all cryptographic software on this
230-site is subject to the following legal notice:
230-
230-    This site includes publicly available encryption source code
230-    which, together with object code resulting from the compiling of
230-    publicly available source code, may be exported from the United
230-    States under License Exception "TSU" pursuant to 15 C.F.R. Section
230-    740.13(e).
230-
230-This legal notice applies to cryptographic software only. Please see
230-the Bureau of Industry and Security (www.bxa.doc.gov) for more
230-information about current U.S. regulations.
230 Login successful.
ftp>

4 總結

橙子隨記
learning by doing

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/DiIXFLuw2r_90THUdWEjeg