FTP 主動模式及被動模式
2020-07-13 14:05:05
供稿:網友
FTP的特殊性:
大多數的TCP服務是使用單個的連接,一般是客戶向服務器的一個周知端口發起連接,然后使用這個連接進行通訊。但是,FTP協議卻有所不同,它使用雙向的多個連接,而且使用的端口很難預計。一般,FTP連接包括:
一個控制連接(control connection)
這個連接用于傳遞客戶端的命令和服務器端對命令的響應。它使用服務器的21端口,生存期是整個FTP會話時間。
幾個數據連接(data connection)
這些連接用于傳輸文件和其它數據,例如:目錄列表等。這種連接在需要數據傳輸時建立,而一旦數據傳輸完畢就關閉,每次使用的端口也不一定相同。而且,數據連接既可能是客戶端發起的,也可能是服務器端發起的。
在FTP協議中,控制連接使用周知端口21,因此使用ISA的IP PACKET FILTER就可以這種連接進行很好的安全保護。相反,數據傳輸連接的目的端口通常實現無法知道,因此處理這樣的端口轉發非常困難。FTP協議使用一個標準的端口21作為ftp-data端口,但是這個端口只用于連接的源地址是服務器端的情況,在這個端口上根本就沒有監聽進程。FTP的數據連接和控制連接的方向一般是相反的,也就是說,是服務器向客戶端發起一個用于數據傳輸的連接。連接的端口是由服務器端和客戶端協商確定的。FTP協議的這個特征對ISA轉發以及防火墻和NAT的配置增加了很多困難。
除此之外,還有另外一種FTP模式,叫做被動模式(passive mod)。在這種模式下,數據連接是由客戶程序發起的,和剛才討論過的模式(我們可以叫做主動模式)相反。是否采取被動模式取決于客戶程序,在ftp命令行中使用passive命令就可以關閉/打開被動模式。
前面我們講過,FTP協議的數據傳輸存在兩種模式:主動模式和被動模式。這兩種模式發起連接的方向截然相反,主動模式是從服務器端向客戶端發起;被動模式是客戶端向服務器端發起連接。
我們回到ISA的情況,如果采用被動模式,由于IIS是完全隨機的選擇一個端口,并告知客戶,然后客戶進行主動連接,這就意味著在ISA上,你要讓所有的端口都允許動態入站連接才行,這樣肯定不行,因為太危險了,等于打開了所有的端口連接。
如果采用主動模式(PORT Mode),IIS選擇好端口后,主動與客戶進行連接,這時候不需要像PASV模式那樣打開所有的動態入站連接,而且正好相反,我們需要打開所有的動態出站連接即可,安全性增加很多。而且由ISA的IP PACKET FILTER只對ISA本機起作用,不會造成局域網內的客戶“放了羊”。
所以,我個人這樣做的:
(1)由于IIS和ISA都在一臺機器上,所以它倆都在偵聽21號端口(IIS默認情況下會偵聽所有地址的21端口),所以我們首先要讓IIS只偵聽內
網地址的PORT 21,在DOS下,你可以通過NETSTAT -NA > abc.txt,然后打開這個文件,你會看到0.0.0.0 21 LISTENING字樣。
輸入如下命令:
net stop msftpsvc (停止FTP服務)
進入/Inetpub/adminscripts/目錄
cscript adsutil.vbs set msftpsvc/disablesocketpooling true (停止偵聽)
net start msftpsvc (啟動FTP服務)
(2)在IIS控制臺里面,ftp->Property->FTP Site->IP Address改為內網地址?,F在,FTP服務只偵聽內網IP的21號端口了。
(3)大家可能這時候有疑問,如果是IIS主動連接客戶端,那客戶端的防火墻是不是會阻止這個連接(PASV模式不存在這個問題)。為了防止這種情況,我們可以強制IIS不能與客戶端的任意端口進行連接,而只有客戶端連接IIS的端口進行數據傳輸。這樣就可以解決PORT MODE與客戶端防火墻的沖突。方法:修改注冊
表,HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services/Msftpsvc/Parameters/,將EnablePortAttack的值由0改為1,然后重新啟動FTP服務。
(4)在ISA里面,使用SERVER PUBLISH的方法發布FTP服務,其中:IP address of internal server 填寫ISA的內部網卡的IP,IP address of external server 填寫ISA的外部網卡的IP,Mapped server protocol 選擇 FTP Server。
(5)然后在IP Packet Filter建立一條新RULES,Protocol->TCP,Direction->Outbound,Local Port->Dymanic,Remote Port->All。
這是我的解決辦法,但是并不完美,主要是:
(1)客戶不能使用PASV方法進行連接,原因上面已經講了。
(2)由于第五條,所以ISA服務器隨著保證了對外部訪問的限制,卻無法限制ISA本機對外部的訪問。
我也把我的方法做了一下實驗,使用serv-u做的,有一點錯誤,不過終歸做了出來,下面總結一下:
PASV服務器放在ISA后面,其實就是要解決兩個問題:
1。PASV的端口。我上面的方法提出使用secondary connection,但事實證明不對,應該每個PASV端口都建立一條primary connection,然后分別建立server publishing rules,有多少個PASV端口,就要建立多少條。
這里還可以引出另一個話題,就是對web publishing rules的運用,tony你應該知道,通過web publishing rules也可以發布ftp服務器,但rule里面只給了一個ftp端口的選項,很明顯,這是為PORT模式的FTP服務器準備的,因為PORT模式的數據連接是由服務器發起的,在服務器一邊,不存在穿過防火墻的問題。
使用web publishing rules還有一個很令人振奮的特性,就是支持動態公用IP用戶,不需要象server publishing rules那樣,每撥一次號都要修改一次外部地址。如果在web publishing rules中也能搞定PASV問題,那么對于那些使用撥號上網而又想在內網發布PASV服務器的人來說,簡直是天大的喜訊。
需要好好考慮的是如何通過那個只能填一個端口的選項來發布隨機的PASV端口?我從今天的實驗找到了一點靈感,就是也象上面說的那樣,每個PASV端口都設置一條web publishing rules!我還未做這個實驗,還不能證實這樣做行不行,相信晚上就會有結果了。
當然,還需要考慮如何控制PASV模式端口的范圍,serv-u可以設定,而IIS的FTP不行。
2。是服務器向客戶端傳送IP的問題。當FTP客戶端登錄進入服務器的時候,PASV模式服務器會向客戶端傳送本機的IP地址和數據端口,當服務器放在內網中的時候,服務器會向客戶端返回內網的IP,這當然是不能完成連接的,需要讓服務器返回ISA的外網地址。本來,解決方法可以使用firwall client的application settings中的nameresolutionforlocalhost參數,設為P就可以讓應用程序返回ISA的外網地址,但這個參數是供firewall client使用的,而發布服務器不能安裝firewall client,這很可惜。
幸好,還是有一個好消息,就是serv-u本身具有返回ISA外網地址這樣的功能,方法是先選中新建FTP服務器的屬性,在domain標簽里選擇“enable dynamic dns”,此時會出現第二個標簽,叫“dynamic dns”,然后到tz0.com申請動態域名,申請后會得到一個key,在此標簽中填入此key即可。最后一步,是到新建服務器的settings屬性中,選擇advanced標簽,選中“allow passive mode data transfer”,旁邊的IP地址框留空。這個框對于撥號用戶不用填,只有出口使用固定地址才需要填。
這樣,serv-u向客戶端返回IP和端口前,會先向tz0.com查詢到ISA外網的地址,再發送給客戶端。
解決了這兩個問題,剩下的工作就簡單了。
從以上內容也可以說明一點,從內網不能發布IIS的FTP服務器,因為IIS既沒有選項可以選擇PASV端口的范圍,也沒有辦法讓其返回ISA外網的地址。而serv-u這兩條都可以滿足。當然,在微軟的網站上也可能有方法解決IIS的這兩個問題。
發布FTP服務器的時候,要注意FTP服務器有PORT和PASV兩種模式。兩者的共同點,是都使用21端口進行用戶驗證及管理,差別在于傳送數據的方式不同,PORT模式的FTP服務器數據端口固定在20,而PASV模式則在1025-65535之間隨機。發布的時候要考慮這個差別。
如果FTP服務器在內部網絡中,在建立server publish rules時(雖然web publish rules也能發布ftp服務器,但它并沒有提供對port和pasv模式的處理),protocol definitions中的21 inbound條目要建立一個secondary connection,為20端口上的inbound或1025-65535端口之間的inbound。
如果FTP服務器建立在ISA服務器上,就需要在ip packet filters中設置相關的條目,對于PORT模式,很簡單,開放20 inbound就是,但pasv模式就麻煩一點,因為ip packet filters不能設置端口段,但我們也不可能把幾萬個端口逐個寫一遍,只能把local port設置為dynamic,remote port設置為all ports,當然,對安全性這是個損害。
幸運的是,有些PASV模式的FTP服務器能夠設置PASV模式端口的范圍,比如serv-u,它能夠把PASV模式端口控制在最多50個端口范圍內,如果為serv-u設置的并發用戶數不多,那么我們就可以為每個PASV端口寫一條filter,不需要開放所有的端口了。如果使用IIS的FTP服務器,這個FTP服務器沒有提供選擇PASV模式端口的功能,只能如上所述那樣,開放dynamic和all ports。
從你上面的出錯信息來看,你應該是使用IE來訪問FTP服務器吧。IE的FTP客戶端與其它專業FTP客戶端不同,不能夠自動檢測FTP服務器的類型以及根據服務器的類型改變客戶端的種類。IE只提供了一個手工選項來改變PORT和PASV客戶端角色,就是internet選項->高級->為FTP站點啟用文件夾視圖,選擇它,IE為PASV模式客戶端,不選則為PORT客戶端。你需要根據服務器的類型手工更改這個選項。如果服務器的出口是ADSL類的鏈路,還要把“使用被動FTP(為防火墻和DSL調制解調器兼容性)”一項選上,這兩個選項只在IE5。5以上版本提供。