詳解 ftp 協議,力薦!!!
You know some birds are not meant to be caged, their feathers are just too bright.
1 概述
FTP 爲File 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 客戶端程序還有FileZilla
、 CuteFTP
。
FTP 實現的目標:
-
促進文件的共享(計算機程序或數據);
-
鼓勵間接或者隱式的使用遠程計算機;
-
向用戶屏蔽不同主機中各種文件存儲系統(File system)的細節;
-
可靠和高效的傳輸數據。
2 實驗環境搭建
爲了更透徹的理解和掌握 FTP,在敘述 FTP 協議內容的同時,也需要以 “實戰” 的方式抓取 FTP 客戶端和 FTP 服務器之間交互的網絡包,以此和 FTP 協議相互印證,加深理解。本節主要介紹抓取 FTP 網絡包的環境搭建。實驗環境將以 Windows 系統平臺作爲 FTP 客戶端,以 linux 系統虛擬機作爲 FTP 服務器。
FTP 實驗環境搭建:
-
在 Windows 系統安裝 wireshark 抓包工具;
-
在 Windows 系統安裝 linux 虛擬機(本次實驗版本:Ubuntu 16.04);
-
熟悉 Windows 系統下
"ftp"
命令行的使用。
在微軟幫助文檔 (https://docs.microsoft.com/en-us/previous-versions/orphan-topics/ws.10/cc755356(v=ws.10)
) 中已經將"ftp"
命令行介紹得比較詳細,有需要可以點擊查看。爲了內容上的連貫性,本節會對常用的"ftp"
命令行進行講解。
常用的"ftp"
命令行(可以打開cmd
或PowerShell
進行驗證):
-
ftp 服務器域名(ip地址)
,如:ftp ftp.gnu.org,進行 FTP 服務器登錄; -
ftp>? 或 ftp>help
,顯示"ftp"
命令行說明; -
ftp>dir
,顯示 FTP 服務器目錄文件和子目錄列表; -
ftp>cd
,切換 FTP 服務器上的工作目錄; -
ftp>ls
,顯示 FTP 服務器上目錄文件和子目錄的縮寫列表; -
ftp>pwd
,顯示 FTP 服務器上的當前目錄; -
ftp>mdir
,顯示 FTP 服務器上目錄文件和子目錄列表,如:mdir Music 1.txt
,將服務器目錄Music
中文件和子目錄列表詳細信息存入本地文件1.txt
中; -
ftp>binary(或bi)
,將文件傳送類型設置爲二進制模式; -
ftp>ascii
,將文件傳送類型設置爲默認的ASCII
; -
ftp>delete
,刪除遠程計算機上的文件,如:delete 123.c
,刪除服務器上的123.c
文件; -
ftp>get
,將遠程服務器文件複製到本地計算機上,如get 123.c
,將服務器上的123.c
文件,複製到本地; -
ftp>mget
,將遠程服務器多個文件複製到本地計算機,如mget 123.c 456.c
,將文件123.c
和456.c
複製到本地計算機上; -
ftp>put
,將本地文件複製到遠程計算機上,如:put 789.c
, -
ftp>disconnect
,從服務器斷開,但保留"ftp"
命令行提示(依然是處於"ftp"
命令行模式,未退出); -
ftp>open
,與指定的遠程FTP
服務器連接,可以通過 IP 地址或計算機名稱指定計算機(DNS 或主機文件必須可用); -
ftp>quit或(bye)
,結束與遠程服務器的FTP
會話並退出"ftp"
命令行模式; -
ftp>status
,顯示 FTP 連接和切換的當前狀態; -
ftp>debug
,切換調試,當調試打開時,客戶端發送到遠程服務器的每個命令都將打印。默認情況下,調試是關閉的; -
ftp>!
,從"ftp"
命令行子系統退出到cmd
或PowerShell
的 shell。
注意"ftp"
命令行只是 Windows 系統自帶的 FTP 客戶端程序,"ftp"
命令行的使用和將要介紹的 FTP 文件傳輸協議無關。
3 FTP 詳解
FTP 作爲一個古老的協議,現在仍然被廣泛使用,一定有其過人之處。其最大的一個優點就是部署、使用起來非常簡單。只要兩個設備部署了 FTP 客戶程序和 FTP 服務程序,知道用戶名和密碼,就能夠實現文件的輕鬆互傳。甚至一些匿名 FTP 服務器,就算沒有用戶名和密碼也能夠訪問。如一些軟件分發、資料分享,就可能使用到匿名 FTP 服務器。
3.1 文件傳輸過程
FTP 使用簡單並不意味着其實現簡單。與常見的應用層協議 http 只需要一個 TCP 連接不同,FTP 需要兩個 TCP 連接來完成文件的傳輸。其中一個稱爲控制連接,一個稱爲數據連接。
默認情況下,FTP 使用20
和21
這兩個端口,其中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\n
,FTP 應答的一般報文格式爲:狀態碼 報文選項 \r\n
。先來介紹 FTP 命令。
FTP 命令都是3
或4
個字節的大寫 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 文件系統狀態。
一些典型的狀態碼含義如下:
-
125 數據連接已經打開,數據傳輸開始
-
200 命令 OK
-
214 幫助消息(針對用戶)
-
331 用戶名 OK,需要密碼
-
425 無法打開數據連接
-
452 寫入文件時出錯
-
500 語法錯誤(無法識別的命令)
-
501 語法錯誤(無效參數)。
-
502 未實現的 MODE 類型。
下面來通過抓實際環境中的網絡包,看客戶端和服務器的 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 數據連接的用途可以看到,在進行文件傳輸或是查詢服務器端文件或目錄列表時,需要創建數據連接。數據連接的創建過程如下:
-
數據連接的創建由客戶端控制,因爲是客戶端發出需要數據連接的命令(獲取文件、上傳文件或列出目錄)。
-
客戶端通常在客戶端主機上選擇一個臨時端口號來結束數據連接。客戶端從該端口發出被動打開。
-
客戶端使用
PORT
命令通過控制連接將此端口號發送到服務器。 -
服務器接收控制連接上的端口號,並向客戶端主機上的該端口發出主動打開。數據連接的服務器端始終使用端口
20
。
下面來進行網絡抓包看一下實際的數據連接建立過程。通過 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 總結
-
FTP 是一個用於在計算機網絡上在客戶端和服務器之間進行文件傳輸的應用層協議。
RFC 959
定義了 FTP 協議規範。 -
FTP 需要兩個 TCP 連接來完成文件的傳輸。其中一個稱爲控制連接,一個稱爲數據連接。
-
控制連接一直保持到客戶端—服務器連接的全過程,但數據連接可以根據需要隨時開、隨時關。
-
數據連接可以分爲主動模式和被動模式,主動模式有被客戶端防火牆阻止的風險。
-
主動模式,FTP 使用
20
和21
這兩個端口,其中20
用於數據連接(傳遞數據),21
用於控制連接(傳遞控制信息)。 -
如果採用被動模式,具體最終使用哪個端口做數據連接要服務器端和客戶端協商決定。
-
FTP 報文是以 ASCII 碼明文進行傳遞的。
橙子隨記
learning by doing
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/DiIXFLuw2r_90THUdWEjeg