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