Ftp

跟踪活動 FTP 會話(數據通道)

  • July 13, 2019

為了調試活動 FTP 的問題,我們正在使用在 GKE 節點上的工具箱容器中執行的 tcpdump 跟踪活動的 FTP 會話流量。活動 FTP 會話在數據通道上失敗。

我熟悉主動模式和被動模式 FTP 之間的區別(我們的平台必須同時支持這兩種模式,並且我們盡可能使用被動模式)。

為了調試失敗的活動 FTP 數據通道,我們正在跟踪成功的活動 FTP 會話,以通過我們的 FTP 伺服器實現來闡明我們環境中的流。這裡的問題是:

在成功的活動 FTP 會話中從數據通道擷取數據包

看過這個問題,雖然類似,但似乎沒有解決,我們的情況可能會有所不同。跟踪執行:

tcpdump -vnn -w 002.pcap -i eth0

然後在 Wireshark 中打開 pcap 文件。過濾 FTP 協議清楚地顯示了會話的控制通道部分。客戶端的臨時埠和伺服器埠 21 之間的 FTP 客戶端/伺服器通信完全符合預期。此流程包括預期的身份驗證命令、設置 TYPE I、到正確文件夾的 CWD、SIZE、PORT 和 RETR文件名。

PORT 命令看起來不錯,包括伺服器在會話的後續數據通道部分(下載一個文件)中使用的客戶端 IP 和埠。例如:

PORT 1,2,3,4,51,105 

它將:( 51x256+105 )轉換為埠 13161。

但是,在 Wireshark 中,之後:

client:27154 > server:21 RETR <filename>
server:21    > client:27154 150 File status okay; about to open data connection.

擷取的唯一額外數據包是:

server:21    > client:27154 226 Transfer complete.
client:27154 > server:21 6 QUIT
server:21    > client:27154 221 Goodbye.

我們的 FTP 伺服器實現不使用埠 20 作為數據通道,它使用隨機可用埠。無論如何,我們希望看到伺服器像這樣建立數據通道:

server:<random port> > client:13161

還有一兩行顯示實際轉移。

  • tcpdump 過濾本身是問題嗎?
  • 還有什麼?

謝謝你。

這是我的錯誤。檢查RFC 959及其對 TYPE I(圖像/二進制)數據通道的描述,並調整 Wireshark 中的視圖以簡單地按順序(按時間)跟踪;數據通道的 TCP 數據包實際上就在那裡。

對於在控制通道中使用活動 FTP 遇到此問題的任何人:

給定對 REQUEST SIZE 的響應,如下所示:

FTP ... Response: 213 3981

表示文件大小為 3981 字節,以及如下所示的 PORT 命令:

FTP ... Request: PORT 1,2,3,4,51,105

它指示伺服器在與客戶端建立 TCP 連接以啟動數據通道時使用的 IP 和埠。

將第 5 和第 6 字節轉換為埠號:

51x256+105 = 13161

Wireshark 應該像這樣顯示數據通道數據包:

No. | Time      | Source    | Destination   | Protocol   | Length   | Info
----------------------------------------------------------------------------------------------------------------------------------------------------------------
89  | 6.982066  | 10.5.4.3  | 1.2.3.4       | TCP        | 76       | 33841 → 13161 [SYN] Seq=0 Win=28400 Len=0 MSS=1420 SACK_PERM=1 TSval=3979605739 TSecr=0 WS=128
93  | 7.390712  | 1.2.3.4   | 10.5.4.3      | TCP        | 64       | 13161 → 33841 [SYN, ACK] Seq=0 Ack=1 Win=64240 Len=0 MSS=1360 SACK_PERM=1
98  | 7.390818  | 10.5.4.3  | 1.2.3.4       | TCP        | 56       | 33841 → 13161 [ACK] Seq=1 Ack=1 Win=28400 Len=0
101 | 7.395054  | 10.5.4.3  | 1.2.3.4       | TCP        | 2776     | 33841 → 13161 [ACK] Seq=1 Ack=1 Win=28400 Len=2720
104 | 7.395068  | 10.5.4.3  | 1.2.3.4       | TCP        | 1317     | 33841 → 13161 [PSH, ACK] Seq=2721 Ack=1 Win=28400 Len=1261
107 | 7.395096  | 10.5.4.3  | 1.2.3.4       | TCP        | 56       | 33841 → 13161 [FIN, ACK] Seq=3982 Ack=1 Win=28400 Len=0

上面的 TCP 數據包顯示了 3 次 TCP 握手:SYN、SYN-ACK、ACK,然後是實際的二進制傳輸。您可以將數據包 101 和 104 中的有效負載長度(在 Info 列中)相加,以獲得在控制通道中較早確認的文件大小。

Len=2720 + Len=1261 = 3981

然後您應該在控制通道中看到最終的 FTP 226 確認:

FTP ... Response: 226 Transfer complete.

引用自:https://serverfault.com/questions/974455