FTP是文件傳輸協(xié)議的縮寫,包含了兩個通道,一個叫控制通道,一個叫數(shù)據(jù)通道。
控制通道:控制通道是和FTP服務(wù)器進(jìn)行溝通的通道,連接FTP,發(fā)送FTP指令都是通過控制通道來完成的。
數(shù)據(jù)通道:數(shù)據(jù)通道是和FTP服務(wù)器進(jìn)行文件傳輸或者列表的通道。
大家可能會問,為什么FTP協(xié)議需要兩個通道呢? 我舉一個簡單的例子,當(dāng)我們用FTP客戶端比如FTPRush下載FTP上的文件的時候,通常會加入好幾個目錄和文件到隊列窗口,那么當(dāng)下載開始的時候,隊列里面的第二個文件怎么知道該被傳輸呢?這就是控制通道的用處了,當(dāng)下載文件的時候,F(xiàn)TP客戶端會 等待FTP服務(wù)器返回指令,這個指令就是通過控制通道來完成的,當(dāng)數(shù)據(jù)通道的傳輸完成以后,F(xiàn)TP客戶端就會接收到來自控制通道的指令,這樣FTP客戶端就可以知道這個文件已經(jīng)傳輸完成或者失敗,進(jìn)行下一個傳輸了。
PASV: 大家使用FTP客戶端的時候,經(jīng)常會發(fā)現(xiàn)FTP服務(wù)器的屬性帶有 PASV 或者PORT,中文的方式叫做 被動模式和主動模式。這兩個模式是為FTP的數(shù)據(jù)通道服務(wù)的,被動模式就是FTP客戶端發(fā)送一個PASV的指令,F(xiàn)TP服務(wù)器端返回一個已經(jīng)打開的端口讓FTP客戶端連接上開始數(shù)據(jù)傳輸。FTP服務(wù)器端返回的指令一般就是 "227 Entering Passive Mode (200,10,211,111,13,113)" 這樣的格式,大家可能會問,"(200,10,211,111,13,113)" 是什么意思呢,其實這個格式包含了FTP服務(wù)器當(dāng)前打開等待FTP客戶端連接的地址和端口,"202,10,211,111" 其實就是FTP服務(wù)器的地址,只要把 "," 替換成 ".",那么就是一個標(biāo)準(zhǔn)的IP地址了,"13,113" 就是FTP服務(wù)器打開的端口,但是這個端口是經(jīng)過變換了的,我們可以很簡單的反算出來真實的端口,那就是 13乘以256然后加上113。有的時候,大家會發(fā)現(xiàn),可以連接上一個FTP但是用PASV方式并不能列表,明明PASV返回的指令是 "227 Entering Passive Mode (200,10,211,111,13,113)" 啊,是公網(wǎng)地址啊,為什么不能列表呢? 這可能就是因為FTP服務(wù)器返回的是公網(wǎng)的地址沒錯,但是呢,這個公網(wǎng)的地址根本就不是FTP服務(wù)器所偵聽連接的IP地址,因此FTP客戶端永遠(yuǎn)也不可能連接上的,那怎么辦啊,那個FTP上面據(jù)說有電影下載啊,別哭啊。。FTPRush的站臺屬性對話框的 首頁的"FTP服務(wù)器"的框框里面,有一個"服務(wù)器使用 內(nèi)網(wǎng)/不可路由/Masq 類型的IP地址",選擇上這個就可以列表了,當(dāng)這個選項被選擇的時候,在發(fā)送PASV指令到FTP服務(wù)器并得到FTP服務(wù)器返回的地址和端口時候,F(xiàn)TPRush會自動用FTP服務(wù)器的地址替換掉這個PASV指令返回的IP地址而保留端口,這樣就可以正確連接并列表了。在 FTPRush的 “選項”對話框 的 “連接”樹節(jié)點的頁面里面的“數(shù)據(jù)連接”框框,我們還可以看到一個 “智能處理位于NAT后面的FTP服務(wù)器”的選項,這是干什么的呢?當(dāng)一個FTP在NAT映射功能下對外網(wǎng)開放的時候,PASV會返回 “(10,xx,xx,xx,xx,xx)”這樣的內(nèi)網(wǎng)地址,如果FTP客戶端使用這個內(nèi)網(wǎng)地址去連接FTP服務(wù)器打開的端口,很顯然是連接不上的,F(xiàn)TPRush能智能識別FTP服務(wù)器PASV返回的地址是否是一個內(nèi)網(wǎng)地址,如果是,就比較FTP服務(wù)器 的地址是否也是內(nèi)網(wǎng)地址,如果不是,嘿嘿,F(xiàn)TP服務(wù)器是NAT后面的服務(wù)器啦,這樣FTPRush就把這個內(nèi)網(wǎng)地址替換掉,使用FTP服務(wù)器的地址去連接..............哇.............這個FTP服務(wù)器終于列表出來了 .........@#$%@........ 誰說這個FTP上有電影下載的??!拖出去扁死.
PORT: PORT模式就是FTP客戶端發(fā)送一個PORT xxx,xxx,xxx,xxx,xx,xx 類型的指令到FTP服務(wù)器,告訴FTP服務(wù)器連接到這個地址,同時FTP客戶端打開這個數(shù)據(jù)連接端口等待FTP服務(wù)器來連接。大家應(yīng)該經(jīng)常遇到FTP客戶端發(fā)送PORT指令去列表,當(dāng)時半天列表不出來的情況,這是為什么呢,很大的原因就是因為 FTP服務(wù)器不能連接上FTP客戶端發(fā)送給它的地址和端口,一般有兩種情況,一個是你的機(jī)器是內(nèi)網(wǎng)的地址,那么FTP服務(wù)器是沒有辦法連接進(jìn)來的,還有就是你的機(jī)器或者你的網(wǎng)絡(luò)使用的防火墻并拒絕來自外部的連接。對于內(nèi)網(wǎng)地址使用FTP客戶端連接只提供P ORT方式的NAT用戶,如果使用FTPRush,在FTPRush的選項對話框中,點擊“連接”那個樹節(jié)點,出來的頁面里面的“數(shù)據(jù)連接”內(nèi)容就是為了這個功能服務(wù)的,你可以輸入你的公網(wǎng)IP地址或者一個域名到 "綁定套接字"后面的那個編輯框,那么當(dāng)FTPRush發(fā)送PORT指令的時候,就會使用這個地址而不是你的內(nèi)網(wǎng)地址。那FTPRush里面那個“限制本地端口使用范圍”是干什么的呢?當(dāng)我們設(shè)置了本地端口的選擇范圍,那么PORT指令里面包含的那個端口信息就會在這個 范圍之內(nèi)了。同時FTPRush的這個本地端口的選擇范圍是支持多個子范圍的,比如你可以輸入 21,300-300 ,這樣大家可能又會問,為什么要這樣呢?直接 21-300不就行了? 這是因為,有的ISP,在提供給你internet連接的時候,在某個范圍的端口,傳輸速度是最好的,比如瑞典的一些ISP,當(dāng)數(shù)據(jù)傳輸在 21 或者 80 的時候,速度最快,比其他端口的傳輸快很多,當(dāng)然用戶希望PORT的時候就在21或者80端口啦,這個時候如果簡單使用 21-80,那么可能FTPRush就讓FTP服務(wù)器連接你的60端口了,速度慢好幾倍。。。不知道國內(nèi)是不是有這樣BT的ISP了。
STOR: 當(dāng)我們已經(jīng)要求FTP服務(wù)器打開了數(shù)據(jù)傳輸通道的時候,發(fā)送一個STOR的指令就是告訴FTP服務(wù)器:“我現(xiàn)在開始傳輸文件xxxxxxx,接收吧”,這樣FTP服務(wù)器才開始正式接收,這個過程呢,我們叫做。。。。。。。。。。。。上傳
RETR: 當(dāng)我們已經(jīng)要求FTP服務(wù)器打開了數(shù)據(jù)傳輸通道的時候,發(fā)送一個RETR的指令就是告訴FTP服務(wù)器:“我已經(jīng)準(zhǔn)備好了,請把文件xxxxx開始傳送給我”,這樣FTP服務(wù)器才正式開始把文件傳給你哦。這個過程了,我們叫做。。。。。。。。。。。。。下載
那么大家可能感興趣的就是FXP了,F(xiàn)XP到底是怎么回事呢?不要通過我的本地機(jī)器就可以直接控制兩個服務(wù)器傳輸文件,太神奇了。
其實FXP就是FTP協(xié)議的上傳下載的一個后門,為什么這樣說呢,讓我們回憶一下剛才的文件上傳下載的機(jī)制,PASV的指令能夠讓我們獲得一個FTP服務(wù)器的端口進(jìn)行文件傳輸,PORT指令能夠在我們的機(jī)器上打開一個端口等待FTP服務(wù)器來連接,然后呢, 就有聰明人想到,如果把PORT指令也應(yīng)用到FTP服務(wù)器端呢?。。。。。。。。。。。。
FTPRush是支持FXP的,當(dāng)我們FXP的時候,我們會發(fā)現(xiàn)FTPRush的指令順序,下面就是一個標(biāo)準(zhǔn)的指令順序
[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了,為什么呢?
為了實現(xiàn)FXP,F(xiàn)TP客戶端先給FTP1發(fā)送一個PASV的指令,請F(tuán)TP1打開一個數(shù)據(jù)連接端口等待連接,很好,F(xiàn)TP1返回了這個數(shù)據(jù)連接地址給我們,這樣,我們把這個數(shù)據(jù)連接地址,用PORT指令發(fā)給FTP2,告訴它:“你去連接這個地址”,上帝 保佑,F(xiàn)TP2告訴我們說沒有問題,我準(zhǔn)備連接這個地址了。 到了這個步驟,F(xiàn)TP1和FTP2之間的聯(lián)系通道已經(jīng)打開了。好了,我們該把xxxx.jpg從FTP1傳到FTP2了,那怎么傳呢?對于FTP2來說,我們是把xxxx.jpg 上傳給它,對于FTP1來說,我們是把xxxxx.jpg 下載回來,回憶一下剛才談到的上傳下載的指令。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。想到什么沒有?
STOR是上傳,RETR是下載
ok,這樣我們的FTP客戶端就發(fā)送一個STOR指令給FTP2:"準(zhǔn)備好,我開始上傳xxxx.jpg了",然后趕快也發(fā)送一個RETR指令給FTP1:"準(zhǔn)備好,我要下載xxxx.jpg 了",好了,這樣FTP1和FTP2就開始親密接觸上演出。。。。
不過有的時候,F(xiàn)TP服務(wù)器并不是那么容易撮合的,我們在使用FTPRush進(jìn)行FXP的時候,有的時候會看到 "開始 反向FXP",這是為什么呢?
在上面的FXP原理的描述中我們可以看出來,為了FXP的成功,我們必須成功建立兩個FTP服務(wù)器之間的數(shù)據(jù)傳輸通道,通過PASV指令讓一個服務(wù)器打開端口等候連接,通過PORT指令讓另外一個FTP服務(wù)器去連接這個打開的端口。之前的FXP指令順序的 描述,是讓要下載文件的FTP服務(wù)器打開端口等候連接,但是很不幸,有的FTP服務(wù)器根本不支持PASV方式的連接,那怎么辦呢?那我們就把FXP的指令顛倒一下,讓這個不支持PASV的FTP服務(wù)器只使用PORT指令,而在另外一個本來是接收PORT指 令的FTP服務(wù)器使用PASV指令,這樣我們就把男追女改成了女追男了 所以呢,F(xiàn)XP是需要至少一個FTP支持PASV指令的才能實現(xiàn)的。