1.相關介紹
1.1主動模式和被動模式
主動模式:服務端通過指定的數據傳輸端口(默認20),主動連接客戶端提交的端口,向客戶端發送數據。
被動模式:服務端采用客戶端建議使用被動模式,開啟數據傳輸端口的監聽,被動等待客戶端的連接然后向客戶端發送數據。
一言以蔽之,服務端主動連接客戶端就是主動模式,服務端被動等待客戶端連接(客戶端主動連接服務端)就是被動模式。
ftp有主動模式被動模式而ssh等其他協議沒有這種說法的根源是:ftp要使用別的端口來傳輸數據。
1.2本文環境
192.168.220.128--centos 6.5,作為服務端,通過yum安裝的vsftpd,使用默認配置
192.168.220.130--windows 7,作為客戶端。
windows cmd中的ftp只支持主動模式我們以之來演示主動模式的交互過程,一般的ftp客戶端都優先采用被動模式這里我們以FileZilla Client來演示被動模式的交互過程。
2.主被動交互過程數據包分析
2.1主動模式交互過程分析
在cmd中登錄后,執行ls -l,以下是ls -l執行的交互數據包
4--客戶端(52667) 請求服務端(21)連接本機192.168.220.128:52670
5--服務端(21)向客戶端(52667)表示可以,不過下次最好用被動模式
6--客戶端(52667)請求服務端(21)執行:ls -l
7--握手包1,服務端默認數據連接端口(20),主動連接客戶端給過來的端口(52670)
8--握手包2,客戶端(52670)向服務端(20)表示同意連接
9--握手包3,服務端(20)確認與客戶端(52670)建立連接
10--服務端(21)向客戶端(52667)表示以下是命令執行返回結果
11--返回結果數據包1
12--返回結果數據包2
13--揮手包1,服務端(20)向客戶端(52670)表示數據已完成傳輸
14--揮手包2,客戶端(52670)回復服務端(20)己方也准備處理完成
15--服務端(21)向客戶端(52667)表示數據已傳輸完成
16--客戶端(52667)向服務端(21)表示好的
17--揮手包3,客戶端(52670)向服務端(20)表示可斷開連接
18--揮手包4,客服端(20)向客戶端(52670)確認斷開連接
2.2被動模式交互過程分析
在FileZilla Client中登錄后,點擊列出根目錄,以下是點擊列出根目錄后的交互數據包
21--客戶端(52550)請求服務端執行:cd /
22--服務端(21)回復客戶端:250 Directory successfully changed.
23--客戶端(52550)請求服務端執行:pwd
24--服務端(21)回復客戶端:257 "/"
25--客戶端(52550)請求下一操作使用被動模式
26--服務端(21)同意采取被動模式,並返回自己將要監聽的地址192.168.220.128:64758
27--客戶端(52550)請求執行:ls
28--握手包1,客戶端52552請求連接64758
29--握手包2,服務端64758回復同意連接請求
30--握手包3,客戶端52552回復服務端64758確認建立數據傳輸鏈路連接
31--服務端表示將要發回命令執行結果
35--返回結果數據包1(64758端口到52552端口)
36--返回結果數據包2(64758端口到52552端口)
37--揮手包1,服務端(64758)表示自己數據已完全傳輸
38--揮手包2,客戶端(52552)表示自己數據也將完成傳輸
39--服務端(21)向客戶端(52550)表示執行結果已完全返回
40--客戶端(52550)向服務端(21)表示好的
41--揮手包3,客戶端(52552)向服務端(64758)表示可斷開數據傳輸鏈路
42--揮手包4,服務端(64758)回復客戶(52552)端確認斷開
3.關於NAT下的ftp等幾個問題的討論
3.1在被動模式中,服務端數據傳輸的端口由客戶端指定嗎
答案是否定的。在一些資料中可以看到客戶端決定服務端端口的說法,但在2.2交互過程中我們已可以清楚地看到,客戶端只是決定使用被動模式,服務端應允后就傳回了自己監聽的端口。
3.2nat環境下ftp存在問題的根本原因是什么
在實踐中我們會發現,網絡nat環境下不論是主動模式還是被動模式,當執行ls等需要建立數據傳輸鏈路的文件時,都會出現超時報錯(ftp:connect: Connection timed out.)。
根本的原因是ftp傳輸數據要使用別的端口,直接的原因是要么是客戶端在應用層中指出自己的ip:port(主動模式)要么是服務端在應用層中指出自己的ip:port
在主動模式中,服務端主動連接客戶端的ip:port,所以(從原理上講)只要將服務端的數據傳輸端口(默認20)也做映射使該端口也能訪問客戶端網絡即可。(但實際遇到的情況中,即便做了映射也還是不行,暫未明其原因)
在被動模式中,服務端指出自己的ip:port,比如我們這里假設服務端真實ip為10.10.220.128,映射ip為192.168,.220.128,服務端將要監聽的地址10.10.220.128:64758,發給客戶端(192。168.220.130),客戶端(192.168.220.130)就向10.10.220.128:64758發起連接請求。但實際上客戶端只有到達其映射地址(192.168.220.128)的路由,並沒有直接到10.10.220.128的路由,所以連接請求必然是沒有回應的。
3.3為什么我們可以ftp服務器
眾所周知,上網時個人一般都只能分配到一個私網地址,從這角度來說我們要ftp到服務器,使用主動模式肯定會出問題,但在實際操作中可以看到一般都可以成功ftp。推測可能是nat設備攔載了ftp指定ip:port的數據包,將其修改為了映射出去的ip:port。