FTP是僅基於TCP的服務,不支持UDP。與眾不同的是FTP使用2個端口,一個數據端口和一個命令端口(也可叫做控制端口)。通常來說這兩個端口是21(命令端口)和20(數據端口)。
但FTP工作方式的不同,數據端口並不總是20。這就是主動與被動FTP的最大不同之處。
(一)主動FTP
主動方式的FTP是這樣的:客戶端從一個任意的非特權端口N(N大於1024)連接到FTP服務器的命令端口,也就是21端口。然后客戶端開始監聽端口N+1,並發送FTP命令“port N+1”到FTP服務器。接着服務器會從它自己的數據端口(20)連接到客戶端指定的數據端口(N+1)。
針對FTP服務器前面的防火牆來說,必須允許以下通訊才能支持主動方式FTP:
1. 任何大於1024的端口N 到FTP服務器的21端口。(客戶端初始化的連接)
2. FTP服務器的21端口 到大於1024的端口N。 (服務器響應客戶端的控制端口)
3. FTP服務器的20端口 到大於1024的端口。(服務器端初始化數據連接到客戶端的數據端口)
2. FTP服務器的21端口 到大於1024的端口N。 (服務器響應客戶端的控制端口)
3. FTP服務器的20端口 到大於1024的端口。(服務器端初始化數據連接到客戶端的數據端口)
4. 大於1024端口 到FTP服務器的20端口(客戶端發送ACK響應到服務器的數據端口)
可以簡單概括為以下兩點:
1、主動FTP:
命令連接:客戶端 (大於1024端口) -> 服務器 21端口
數據連接:服務器 20端口 -> 客戶端(大於1024的端口)
命令連接:客戶端 (大於1024端口) -> 服務器 21端口
數據連接:服務器 20端口 -> 客戶端(大於1024的端口)
(二)被動FTP
為了解決服務器發起到客戶的連接的問題,人們開發了一種不同的FTP連接方式。這就是所謂的被動方式,或者叫做PASV,當客戶端通知服務器它處於被動模式時才啟用。
為了解決服務器發起到客戶的連接的問題,人們開發了一種不同的FTP連接方式。這就是所謂的被動方式,或者叫做PASV,當客戶端通知服務器它處於被動模式時才啟用。
在被動方式FTP中,命令連接和數據連接都由客戶端發起,這樣就可以解決從服務器到客戶端的數據端口的入方向連接被防火牆過濾掉的問題。
當開啟一個 FTP連接時,客戶端打開兩個任意的非特權本地端口(N 大於 1024和N+1)。第一個端口連接服務器的21端口,但與主動方式的FTP不同,客戶端不會提交PORT命令並允許服務器來回連它的數據端口,而是提交 PASV命令。這樣做的結果是服務器會開啟一個任意的非特權端口(P大於 1024),並發送PORT P命令給客戶端。然后客戶端發起從本地端口N+1到服務器的端口P的連接用來傳送數據。
對於服務器端的防火牆來說,必須允許下面的通訊才能支持被動方式的FTP:
對於服務器端的防火牆來說,必須允許下面的通訊才能支持被動方式的FTP:
1. 從任何大於1024的端口N 到服務器的21端口(客戶端初始化的連接)
2. 服務器的21端口 到任何大於1024的端口N(服務器響應到客戶端的控制端口的連接)
2. 服務器的21端口 到任何大於1024的端口N(服務器響應到客戶端的控制端口的連接)
3. 從任何大於1024端口N+1 到服務器的大於1024端口X(客戶端初始化數據連接到服務器指定的任意端口)
(X這個端口是個1025--5000的端口)
(X這個端口是個1025--5000的端口)
4. 服務器的大於1024端口X 到遠程的大於1024的端口N+1(服務器發送ACK響應和數據到客戶端的數據端口)
2、被動FTP:
命令連接:客戶端大於1024端口 -> 服務器 21端口
數據連接:客戶端大於1024端口 -> 服務器大於1024端口
命令連接:客戶端大於1024端口 -> 服務器 21端口
數據連接:客戶端大於1024端口 -> 服務器大於1024端口
(通過21端口告訴客戶機自己打開哪個端口傳數據(
這個端口是個1025--5000的端口
)最后客戶機連接服務器的所告知的端口。這個過程中服務器除了要開放21端口外,還要開放1025--5000的所有端口才行,如果這樣開放就不是防火牆了。)
有些ftp客戶端默認就是使用PASV被動模式來連接ftp服務器的,如果我們的ftp服務器只支持主動模式,就會造成
客戶端可以進行用戶驗證,但無法列目錄,也無法進行數據傳送,並提示“你沒有權限”這樣的550返回錯誤。
這里探討一些解決方法,舊版本的IIS要修改注冊表才可以實現指定少部分端口用於被動傳輸,新版的IIS則可以在IIS FTP內部直接設置哪些端口可以用於被動傳輸。
如果無法升級,可以考慮使用serv-u軟件架設ftp,這個
FTP服務器提供了PASV的端口范圍設置,這樣一來就可以做一個相對簡單又相對穩定的設置。
最后在外部物理防火牆也要進行設置,
方案:
靜態端口地址映射,可以讓用戶通過外網地址+端口21來訪問內網中特定的FTP服務;
方案:
在防火牆中設置ACL,充許用戶可以通過TCP訪問FTP服務器的6800-6900端口;
(三)主動與被動FTP優缺點:
主動FTP對FTP服務器的管理有利,但對客戶端的管理不利。因為FTP服務器企圖與客戶端的高位隨機端口建立連接,而這個端口很有可能被客戶端的防火牆阻塞掉。被動FTP對FTP客戶端的管理有利,但對服務器端的管理不利。因為客戶端要與服務器端建立兩個連接,其中一個連到一個高位隨機端口,而這個端口很有可能被服務器端的防火牆阻塞掉。
(四)
在因特網上找到許多FTP服務器,有的要么只支持PORT,有的要么只支持PASV,有的是因為考慮安全因素,有的是因為條件限制等等。
最好把你的FTP做成PORT和PASV方式都能支持的,這樣不會使客戶端在連接上受到困擾,特別是一些新手。
最好把你的FTP做成PORT和PASV方式都能支持的,這樣不會使客戶端在連接上受到困擾,特別是一些新手。
比較容易理解的解釋是針對FTP服務端而言的
PORT是主動模式,在建立數據通道時,服務端去連接別人
PASV是被動模式,在建立數據通道時,服務端被別人連接
PORT是主動模式,在建立數據通道時,服務端去連接別人
PASV是被動模式,在建立數據通道時,服務端被別人連接
建立數據通道時,用PORT模式還是PASV模式,選擇權在於FTP客戶端
但是是否支持還要看服務端
具體點說是這樣
Port模式:
當客戶端向服務端連接后,使用的是PORT模式,那么客戶端B會發送一條命令告訴服務端(客戶端B在本地打開了一個端口N在等着你進行數據連接),當服務端收到這個Port命令后 就會向客戶端打開的那個端口N進行連接,這種數據連接就生成
Pasv模式:
當客戶端B向服務端連接后,使用的是PASV模式,服務端會發信息給客戶端, 這個信息是(服務端在本地打開了一個端口M,你現在去連接我吧),當客戶端收到這個信息后,就可以向服務端的M端口進行連接,連接成功后,數據連接也建立了
具體點說是這樣
Port模式:
當客戶端向服務端連接后,使用的是PORT模式,那么客戶端B會發送一條命令告訴服務端(客戶端B在本地打開了一個端口N在等着你進行數據連接),當服務端收到這個Port命令后 就會向客戶端打開的那個端口N進行連接,這種數據連接就生成
Pasv模式:
當客戶端B向服務端連接后,使用的是PASV模式,服務端會發信息給客戶端, 這個信息是(服務端在本地打開了一個端口M,你現在去連接我吧),當客戶端收到這個信息后,就可以向服務端的M端口進行連接,連接成功后,數據連接也建立了
(五)
IE瀏覽器默認連接ftp為 被動模式連接
IE取消被動模式的方法:點瀏覽器的【工具】【Internet選項】【高級】使用被動ftp去掉該選項前的對勾,確定即可.
IE取消被動模式的方法:點瀏覽器的【工具】【Internet選項】【高級】使用被動ftp去掉該選項前的對勾,確定即可.
其他ftp軟件的設置方法
A:Flashfxp取消被動模式的方法:
第一步:點選項>參數選擇。
第二步,在跳出的窗口中,選擇“代理/防火牆標識”
第三步,設置好用戶名和密碼,可以連上去了。
B:Cuteftp取消被動模式的方法:
第一步,點編輯>設置。
第二步:點防火牆,Pasv模式那里不要打勾
C、Leapftp取消被動模式的方法:
我手里的leapftp是英文版的。有興趣的可以試一下:
FLASHGET設置:
flashget里的數據類型的設置:工具菜單-->選項-->代理服務器-->編輯“直接連接”-->去掉PASV前的勾,確定
第一步:點選項>參數選擇。
第二步,在跳出的窗口中,選擇“代理/防火牆標識”
第三步,設置好用戶名和密碼,可以連上去了。
B:Cuteftp取消被動模式的方法:
第一步,點編輯>設置。
第二步:點防火牆,Pasv模式那里不要打勾
C、Leapftp取消被動模式的方法:
我手里的leapftp是英文版的。有興趣的可以試一下:
FLASHGET設置:
flashget里的數據類型的設置:工具菜單-->選項-->代理服務器-->編輯“直接連接”-->去掉PASV前的勾,確定
(六)
在IIS中的FTP服務器默認是主動模式,如果要修改為被動模式
參考微軟文檔
http://technet.microsoft.com/zh-cn/library/dd421710
在新版的IIS7中,可以再FTP設置中,添加FTP被動模式,和被動連接時服務端開放的端口