本文首發:https://www.somata.net/2019/ftp_protocol_analysis.html
FTP全稱: File Transfer Protocol,是一個用於文件傳輸的協議,本文主要講解FTP協議。如果有不懂的地方可以查詢FTP的定義文檔: RFC 959 或者在評論中提出,同時有寫錯的地方也希望能提出來,大家一起進步。
FTP 是一個協議而不是一個服務,很多人把FTP理解為了一個服務,這里是不正確的,其實應用了FTP協議的服務也有很多,例如:vsftpd, pure-ftpd, Filezila Server等。
我這里主要講解以下FTP的工作模式、FTP的命令和FTP應答代碼的作用三個部分。以及在最后有一個ftp連接抓包作為講解內容便於理解。
FTP工作模式
FTP的完整工作有2個TCP連接,分別用於命令傳輸和數據傳輸(文件傳輸)。其分開為2個連接主要就是為了防止傳輸二進制文件破壞了命令連接的終端,可以在命令連接中指定數據傳輸的模式,以此來降低程序開發的復雜性。
FTP 的工作模式分主動連接
和被動連接
,這兩者的區別主要就在於數據連接的連接方式:
- 主動連接:服務器 20/TCP 端口主動發起連接到客戶端指定的端口。
- 被動連接:客戶端主動發起連接到服務器端指定端口。
這里也會有人問,主動模式和被動模式的意義何在? 這里我也就說以下:
- 現在大部分用戶的網絡其實都並不是公網地址,都是使用NAT轉換過的內網地址,如果使用主動連接模式服務器不可能連接到客戶端開啟的端口。所以只能使用被動連接模式,讓客戶端主動連接服務器端口,以此來達到數據傳輸的目的。
- 主動連接的好處其實就在於便於配置防火牆規則,由服務器的20/TCP主動連接客戶端端口,防火牆只需要配置出口允許20/TCP連接即可,不像被動連接需要開啟多個TCP端口監聽數據連接。
FTP命令
FTP的命令有很多,我這里也就不一一講解了,主要講解以下一些常用常見的命令:
接入命令
命令 | 解釋 |
---|---|
USER | 輸入用戶名 |
PASS | 輸入用戶密碼 |
QUIT | 退出用戶登錄 |
REIN | 重新登入用戶 |
ACCT | 部分服務軟件並不需要再一開始就認可, 可能再進入某個目錄后開始要求用戶認證 |
文件管理類命令
命令 | 解釋 |
---|---|
CWD | 更改服務上的工作目錄 |
CDUP | 切換到父目錄(上級目錄) |
DELE | 刪除服務器上的文件 |
LIST | 列出當前目錄的文件(UNIX形式) |
NLST | 列出當前目錄下的文件(只包含文件名) |
MKD | 在服務器上創建一個目錄 |
PWD | 顯示當前工作路徑 |
RMD | 從服務器上刪除目錄 |
RNFR | 指定需要重命令的文件。(需要配合RNTO使用) |
RNTO | 更名為指定命令 |
傳輸時的數據模式
命令 | 解釋 |
---|---|
TYPE | 定義文件類型。A(ASCII)、E(EBCDIC)、I(Image)、L(Local byte size) |
STRU | 數據組織類型。F(file)、R(record structure)、P(page structure) |
MODE | 定義傳輸方式。S(stream)、B(block)、C(compressed) |
PASV | 指定服務器開啟被動連接模式 |
文件傳送命令
命令 | 解釋 |
---|---|
RETR | 下載文件 |
STOR | 上傳文件 |
STOU | 與STOR類似,但是文件名稱不由客戶端控制, 由服務器端自動生成文件名,並且使用 250 代碼返回文件名稱。 |
STAT | 放回服務器狀態 |
ALLO | 指定服務器需要預留的空間大小 |
ABORT | 停止之前的所有命令,包括文件傳輸 |
APPE | 如果文件不存在則創建文件, 如果文件以存在則以追加形式添加到文件中。 |
PORT | 指定數據連接端口。共6位,按, 分割。前4位為IP位,后2位為端口為,端口位1*256+端口位2 = 指定開啟的端口。 |
REST | 類似於斷點續傳功能。 |
其他命令
命令 | 解釋 |
---|---|
HELP | 查詢服務器的幫助信息 |
NOOP | 檢測服務器允許狀態 |
SITE | 此命令用於查詢特定於服務器的專有服務 |
SYST | 查詢服務器使用的操作系統 |
FTP應答代碼
FTP 客戶端是通過應答碼來檢測服務所表達的意思,除了幾個特殊的應答碼,大部分應答碼后面的內容是給用戶查看的。
FTP 應答碼的分類:
第一個標志位:
-
1xx:服務器正在積極響應,但是還未准備完成。
-
2xx:命令已經正常啟動。
-
3xx:命令被接收,需要等待進一步響應。
-
4xx:命令錯誤,無法接收該命令,客戶端可以重新嘗試命令。
-
5xx:命令無法被接收,客戶端無需再次嘗試該命令。
第二標志位:
-
x0x:有關語法是否正確。
-
x1x:對信息請求的回復。
-
x2x:連接狀態信息。
-
x3x:認證和通過信息。
-
x4x:預留。
-
x5x:文件系統對於請求的回復。
響應代碼 | 解釋說明 |
---|---|
110 | 重啟標志位,后面的提示信息標志服務器狀態,提示信息固定 |
120 | 服務器准備就緒的時間 |
125 | 數據連接已正常開啟,開始傳輸文件 |
150 | 文件狀態正常,開始開啟數據連接 |
200 | 命令執行成功 |
202 | 命令尚未實現,該站點不支持該命令 |
211 | 系統狀態,或系統幫助信息 |
212 | 目錄狀態 |
213 | 文件狀態 |
214 | 命令幫助信息 |
215 | 該系統類型 |
220 | 服務已為新連接的用戶就緒 |
221 | 服務退出控制連接 |
225 | 打開數據連接,未開始數據傳輸 |
226 | 結束數據連接,數據傳輸已完成 |
227 | 進入被動模式(IP 地址、ID 端口) |
230 | 用戶登入成功 |
250 | 請求文件操作完成 |
257 | 路徑名建立成功 |
331 | 用戶名正確,需要用戶密碼 |
332 | 需要登入用戶 |
350 | 請求文件的工作需要得到進一步確認 |
421 | 服務不可能,即將關閉控制連接 |
425 | 無法打開數據連接 |
426 | 連接中止,傳輸關閉。 |
450 | 請求文件尚不可用,文件可能被占用 |
451 | 請求操作終止,遇到本地錯誤 |
452 | 請求操作終止,磁盤空間不足 |
500 | 命令語法錯誤,可能包含命令過長的錯誤 |
501 | 命令參數錯誤 |
502 | 命令尚未被執行 |
503 | 命令次序錯誤 |
504 | 該命令尚未被完成 |
530 | 尚未登入服務器 |
532 | 存儲文件需要帳號 |
550 | 請求的動作尚未執行,文件不可用 |
551 | 請求操作終止,不知道的頁類型 |
552 | 請求操作終止,超出用戶配額 |
553 | 請求操作終止,文件名不允許 |
FTP 命令抓包分析
這個是我用 wireshark 抓包抓到的命令連接的數據。
這里我干了3件事情,上傳文件、下載文件和目錄瀏覽(2次)。所以這里實際上完成了四次數據傳輸,我們待會一一查看。
眼尖的人應該已經發現了,是由客戶端發送了 PORT 指令,所以是由服務器端連接客戶端,也就是主動連接模式,這里需要注意!!
第一段:登入前的服務器配置
220 (vsFTPd 3.0.3) # 220,表示服務器准備完成,客戶端客戶發送命令了。 后面跟的是服務器的版本信息。
OPTS UTF8 ON # 表示服務器需要切換到UTF8字符集進行工作。
200 Always in UTF8 mode. #200,表示命令執行成功,后面的提示信息表示已經工作再UTF8模式下了。
第二段:用戶認證
USER ftp # 指定用戶ftp(匿名用戶,anonymous也是匿名用戶)
331 Please specify the password. # 331 表示需要輸入密碼
PASS # 表示輸入密碼,FTP規定匿名用戶可以選擇需要輸入自己的郵箱,但是這里可以省略不寫。
230 Login successful. # 230 表示用戶登入成功
第三段內容:目錄當前瀏覽
PORT 192,168,10,103,211,216 # PORT,這里用於指定客戶端的IP地址和端口
200 PORT command successful. Consider using PASV. # 表示命令執行成功, 這里是端口連接成功
LIST # 表示列出當前工作目錄下的文件
150 Here comes the directory listing. # 150 表示即將開始傳輸數據。
226 Directory send OK. # 226 表示文件傳輸成功。
PORT命令中的前四位為IP地址,后2位為端口,其中端口應該這樣計算: 211 * 256 + 216 = 54232
這個是這條命令的返回結果(在數據連接中,所以這里當前的命令連接中是看不到的)
第四段內容:切換目錄
CWD pub # CWD,表示切換到pub目錄下。
250 Directory successfully changed. # 250 表示請求操作執行完成。
第五段內容:再次瀏覽當前目錄
# 與第三段相同,不過多講解。
PORT 192,168,10,103,211,217
200 PORT command successful. Consider using PASV.
LIST
150 Here comes the directory listing.
226 Directory send OK.
下圖為返回內容:
第六段內容:上傳文件
PORT 192,168,10,103,211,218
200 PORT command successful. Consider using PASV.
STOR test.c # STOP 表示上傳文件,文件名為 test.c
150 Ok to send data. # 150,表示文件狀態正常,開始傳輸數據。
226 Transfer complete. # 226,表示文件傳輸完畢。
第六段內容:下載文件
PORT 192,168,10,103,211,219
200 PORT command successful. Consider using PASV.
RETR test.file # RETR 下載文件。
150 Opening BINARY mode data connection for test.file (12 bytes). # 150,表示文件正常,開始傳輸文件,后面會提示文件名稱和文件大小。
226 Transfer complete.
第六段內容:退出
QUIT # 退出
221 Goodbye. # 服務退出控制連接
本文經「原本」原創認證,作者乾坤盤,訪問yuanben.io查詢【2MLRYL4K】獲取授權信息。