FTP 之檔案傳輸原理篇發布時間:2009-09-20 00:23文章來源:黑白前線 文章作者:admin 點擊次數: 191次
摘要:FTP是檔案傳輸通訊協定的縮寫,包含了兩個通道,一個叫控制通道,一個叫資料通道。 ...
FTP是檔案傳輸通訊協定的縮寫,包含了兩個通道,一個叫控制通道,一個叫資料通道。
控制通道:控制通道是和FTP伺服器進行溝通的通道,串連FTP,發送FTP指令都是通過控制通道來完成的。
資料通道:資料通道是和FTP伺服器進行檔案傳輸或者列表的通道。
大家可能會問,為什麼FTP協議需要兩個通道呢? 我舉一個簡單的例子,當我們用FTP用戶端比如FTPRush下載FTP上的檔案的時候,通常會加入好幾個目錄和檔案到隊列視窗,那麼當下載開始的時候,隊列裡面的第二個檔案怎麼知道該被傳輸呢?這就是控制通道的用處了,當下載檔案的時候,FTP用戶端會 等待FTP伺服器返回指令,這個指令就是通過控制通道來完成的,當資料通道的傳輸完成以後,FTP用戶端就會接收到來自控制通道的指令,這樣FTP用戶端就可以知道這個檔案已經傳輸完成或者失敗,進行下一個傳輸了。
PASV: 大家使用FTP用戶端的時候,經常會發現FTP伺服器的屬性帶有 PASV 或者PORT,中文的方式叫做 被動模式和主動模式。這兩個模式是為FTP的資料通道服務的,被動模式就是FTP用戶端發送一個PASV的指令,FTP伺服器端返回一個已經開啟的連接埠讓FTP用戶端串連上開始資料轉送。FTP伺服器端返回的指令一般就是 "227 Entering Passive Mode (200,10,211,111,13,113)" 這樣的格式,大家可能會問,"(200,10,211,111,13,113)" 是什麼意思呢,其實這個格式包含了FTP伺服器當前開啟等待FTP用戶端串連的地址和連接埠,"202,10,211,111" 其實就是FTP伺服器的地址,只要把 "," 替換成 ".",那麼就是一個標準的IP地址了,"13,113" 就是FTP伺服器開啟的連接埠,但是這個連接埠是經過變換了的,我們可以很簡單的反算出來真實的連接埠,那就是 13乘以256然後加上113。有的時候,大家會發現,可以串連上一個FTP但是用PASV方式並不能列表,明明PASV返回的指令是 "227 Entering Passive Mode (200,10,211,111,13,113)" 啊,是公網地址啊,為什麼不能列表呢? 這可能就是因為FTP伺服器返回的是公網的地址沒錯,但是呢,這個公網的地址根本就不是FTP伺服器所偵聽串連的IP地址,因此FTP用戶端永遠也不可能串連上的,那怎麼辦啊,那個FTP上面據說有電影下載啊,別哭啊。。FTPRush的月台屬性對話方塊的 首頁的"FTP伺服器"的框框裡面,有一個"伺服器使用 內網/不可路由/Masq 類型的IP地址",選擇上這個就可以列表了,當這個選項被選擇的時候,在發送PASV指令到FTP伺服器並得到FTP伺服器返回的地址和連接埠時候,FTPRush會自動用FTP伺服器的地址替換掉這個PASV指令返回的IP地址而保留連接埠,這樣就可以正確串連並列表了。在 FTPRush的 “選項”對話方塊 的 “串連”樹節點的頁面裡面的“資料連線”框框,我們還可以看到一個 “智能處理位於NAT後面的FTP伺服器”的選項,這是幹什麼的呢?當一個FTP在NAT映射功能下對外網開放的時候,PASV會返回 “(10,xx,xx,xx,xx,xx)”這樣的內網地址,如果FTP用戶端使用這個內網地址去串連FTP伺服器開啟的連接埠,很顯然是串連不上的,FTPRush能智能識別FTP伺服器PASV返回的地址是否是一個內網地址,如果是,就比較FTP伺服器 的地址是否也是內網地址,如果不是,嘿嘿,FTP伺服器是NAT後面的伺服器啦,這樣FTPRush就把這個內網地址替換掉,使用FTP伺服器的地址去串連..............哇.............這個FTP伺服器終於列表出來了 .........@#$%@........ 誰說這個FTP上有電影下載的!!拖出去扁死.
PORT: PORT模式就是FTP用戶端發送一個PORT xxx,xxx,xxx,xxx,xx,xx 類型的指令到FTP伺服器,告訴FTP伺服器串連到這個地址,同時FTP用戶端開啟這個資料連線連接埠等待FTP伺服器來串連。大家應該經常遇到FTP用戶端發送PORT指令去列表,當時半天列表不出來的情況,這是為什麼呢,很大的原因就是因為 FTP伺服器不能串連上FTP用戶端發送給它的地址和連接埠,一般有兩種情況,一個是你的機器是內網的地址,那麼FTP伺服器是沒有辦法串連進來的,還有就是你的機器或者你的網路使用的防火牆並拒絕來自外部的串連。對於內網地址使用FTP用戶端串連只提供P ORT方式的NAT使用者,如果使用FTPRush,在FTPRush的選項對話方塊中,點擊“串連”那個樹節點,出來的頁面裡面的“資料連線”內容就是為了這個功能服務的,你可以輸入你的公網IP地址或者一個網域名稱到 "綁定通訊端"後面的那個編輯框,那麼當FTPRush發送PORT指令的時候,就會使用這個地址而不是你的內網地址。那FTPRush裡面那個“限制本地連接埠使用範圍”是幹什麼的呢?當我們設定了本地連接埠的選擇範圍,那麼PORT指令裡麵包含的那個連接埠資訊就會在這個 範圍之內了。同時FTPRush的這個本地連接埠的選擇範圍是支援多個子範圍的,比如你可以輸入 21,300-300 ,這樣大家可能又會問,為什麼要這樣呢?直接 21-300不就行了? 這是因為,有的ISP,在提供給你internet串連的時候,在某個範圍的連接埠,傳輸速度是最好的,比如瑞典的一些ISP,當資料轉送在 21 或者 80 的時候,速度最快,比其他連接埠的傳輸快很多,當然使用者希望PORT的時候就在21或者80連接埠啦,這個時候如果簡單使用 21-80,那麼可能FTPRush就讓FTP伺服器串連你的60連接埠了,速度慢好幾倍。。。不知道國內是不是有這樣BT的ISP了。
STOR: 當我們已經要求FTP伺服器開啟了資料轉送通道的時候,發送一個STOR的指令就是告訴FTP伺服器:“我現在開始傳輸檔案xxxxxxx,接收吧”,這樣FTP伺服器才開始正式接收,這個過程呢,我們叫做。。。。。。。。。。。。上傳
RETR: 當我們已經要求FTP伺服器開啟了資料轉送通道的時候,發送一個RETR的指令就是告訴FTP伺服器:“我已經準備好了,請把檔案xxxxx開始傳送給我”,這樣FTP伺服器才正式開始把檔案傳給你哦。這個過程了,我們叫做。。。。。。。。。。。。。下載
那麼大家可能感興趣的就是FXP了,FXP到底是怎麼回事呢?不要通過我的本地機器就可以直接控制兩個伺服器傳輸檔案,太神奇了。
其實FXP就是FTP協議的上傳下載的一個後門,為什麼這樣說呢,讓我們回憶一下剛才的檔案上傳下載的機制,PASV的指令能夠讓我們獲得一個FTP伺服器的連接埠進行檔案傳輸,PORT指令能夠在我們的機器上開啟一個連接埠等待FTP伺服器來串連,然後呢, 就有聰明人想到,如果把PORT指令也應用到FTP伺服器端呢?。。。。。。。。。。。。
FTPRush是支援FXP的,當我們FXP的時候,我們會發現FTPRush的指令順序,下面就是一個標準的指令順序
[1] PASV
[1] 227 Entering Passive Mode (200,10,211,111,13,113)
[2] PORT 200,10,211,111,13,113
[2] 200 PORT command ok
[2] STOR xxxxx.jpg
[2] 150 opening BINARY data connection for xxxxx.jpg
[1] RETR xxxxx.jpg
[1] 150 opening BINARY data connection for xxxxx.jpg
這樣就可以FXP了,為什麼呢?
為了實現FXP,FTP用戶端先給FTP1發送一個PASV的指令,請FTP1開啟一個資料連線連接埠等待串連,很好,FTP1返回了這個資料連線地址給我們,這樣,我們把這個資料連線地址,用PORT指令發給FTP2,告訴它:“你去串連這個地址”,上帝 保佑,FTP2告訴我們說沒有問題,我準備串連這個地址了。 到了這個步驟,FTP1和FTP2之間的聯絡通道已經開啟了。好了,我們該把xxxx.jpg從FTP1傳到FTP2了,那怎麼傳呢?對於FTP2來說,我們是把xxxx.jpg 上傳給它,對於FTP1來說,我們是把xxxxx.jpg 下載回來,回憶一下剛才談到的上傳下載的指令。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。想到什麼沒有?
STOR是上傳,RETR是下載
ok,這樣我們的FTP用戶端就發送一個STOR指令給FTP2:"準備好,我開始上傳xxxx.jpg了",然後趕快也發送一個RETR指令給FTP1:"準備好,我要下載xxxx.jpg 了",好了,這樣FTP1和FTP2就開始親密接觸上演出。。。。
不過有的時候,FTP伺服器並不是那麼容易撮合的,我們在使用FTPRush進行FXP的時候,有的時候會看到 "開始 反向FXP",這是為什麼呢?
在上面的FXP原理的描述中我們可以看出來,為了FXP的成功,我們必須成功建立兩個FTP伺服器之間的資料轉送通道,通過PASV指令讓一個伺服器開啟連接埠等候串連,通過PORT指令讓另外一個FTP伺服器去串連這個開啟的連接埠。之前的FXP指令順序的 描述,是讓要下載檔案的FTP伺服器開啟連接埠等候串連,但是很不幸,有的FTP伺服器根本不支援PASV方式的串連,那怎麼辦呢?那我們就把FXP的指令顛倒一下,讓這個不支援PASV的FTP伺服器只使用PORT指令,而在另外一個本來是接收PORT指 令的FTP伺服器使用PASV指令,這樣我們就把男追女改成了女追男了。所以呢,FXP是需要至少一個FTP支援PASV指令的才能實現的。
本文轉自 ☆★ 黑白前線 ★☆ - www.hackline.net 轉載請註明出處,侵權必究!
原文連結:http://www.hackline.net/a/school/wlcs/2009/0920/700.html