當(dāng)你對(duì)一個(gè)FTP問題進(jìn)行排錯(cuò)時(shí)候,你首先要問的一個(gè)問題是使用的是port模式的還是passive模式。因?yàn)檫@兩種行為迥異,所以這兩種模式引起的問題也不同;在過去,客戶端缺省為active(port)模式;近來,由于Port模式的安全問題,許多客戶端的FTP應(yīng)用缺省為Passive模式。
數(shù)據(jù)傳輸?shù)倪B接:
port模式是服務(wù)器用20端口主動(dòng)連接客戶端的臨時(shí)端口。
Passive模式是客戶端用臨時(shí)分配的端口要要求服務(wù)器也分配一個(gè)臨時(shí)端口來回應(yīng)它。
模式體現(xiàn)在服務(wù)器是主動(dòng)還是被動(dòng)。
FTP Port模式
Port模式的FTP步驟如下:
1、 客戶端發(fā)送一個(gè)TCP SYN(TCP同步)包給服務(wù)器段眾所周知的FTP控制端口21,客戶端使用暫時(shí)的端口作為它的源端口;
2、 服務(wù)器端發(fā)送SYN ACK(同步確認(rèn))包給客戶端,源端口為21,目的端口為客戶端上使用的暫時(shí)端口;
3、 客戶端發(fā)送一個(gè)ACK(確認(rèn))包;客戶端使用這個(gè)連接來發(fā)送FTP命令,服務(wù)器端使用這個(gè)連接來發(fā)送FTP應(yīng)答;
4、 當(dāng)用戶請(qǐng)求一個(gè)列表(List)請(qǐng)求或者發(fā)起一個(gè)要求發(fā)送或者接受文件的請(qǐng)求,客戶端軟件使用PORT命令,這個(gè)命令包含了一個(gè)暫時(shí)的端口,客戶端希望服務(wù)器在打開一個(gè)數(shù)據(jù)連接時(shí)候使用這個(gè)暫時(shí)端口;PORT命令也包含了一個(gè)IP地址,這個(gè)IP地址通常是客戶自己的IP地址,而且FTP也支持第三方(third-party)模式,第三方模式是客戶端告訴服務(wù)器端打開與另臺(tái)主機(jī)的連接;
5、 服務(wù)器端發(fā)送一個(gè)SYN包給客戶端的暫時(shí)端口,源端口為20,暫時(shí)端口為客戶端在PORT命令中發(fā)送給服務(wù)器端的暫時(shí)端口號(hào);
6、 客戶端以源端口為暫時(shí)端口,目的端口為20發(fā)送一個(gè)SYN ACK包;
7、 服務(wù)器端發(fā)送一個(gè)ACK包;
8、 發(fā)送數(shù)據(jù)的主機(jī)以這個(gè)連接來發(fā)送數(shù)據(jù),數(shù)據(jù)以TCP段(注:segment,第4層的PDU)形式發(fā)送(一些命令,如STOR表示客戶端要發(fā)送數(shù)據(jù),RETR表示服務(wù)器段發(fā)送數(shù)據(jù)),這些TCP段都需要對(duì)方進(jìn)行ACK確認(rèn)(注:因?yàn)門CP協(xié)議是一個(gè)面向連接的協(xié)議)
9、 當(dāng)數(shù)據(jù)傳輸完成以后,發(fā)送數(shù)據(jù)的主機(jī)以一個(gè)FIN命令來結(jié)束數(shù)據(jù)連接,這個(gè)FIN命令需要另一臺(tái)主機(jī)以ACK確認(rèn),另一臺(tái)主機(jī)也發(fā)送一個(gè)FIN命令,這個(gè)FIN命令同樣需要發(fā)送數(shù)據(jù)的主機(jī)以ACK確認(rèn);
10、 客戶端能在控制連接上發(fā)送更多的命令,這可以打開和關(guān)閉另外的數(shù)據(jù)連接;有時(shí)候客戶端結(jié)束后,客戶端以FIN命令來關(guān)閉一個(gè)控制連接,服務(wù)器端以ACK包來確認(rèn)客戶端的FIN,服務(wù)器同樣也發(fā)送它的FIN,客戶端用ACK來確認(rèn)。
FTP Port模式會(huì)給網(wǎng)絡(luò)管理人員在許多方面帶來很多問題,首先,在PORT命令消息中的IP地址和端口號(hào)的編碼不是直白地顯示。另外,應(yīng)用層的協(xié)議命令理論上不應(yīng)該包含網(wǎng)絡(luò)地址信息(注:IP地址),因?yàn)檫@打破了協(xié)議層的原則并且可能導(dǎo)致協(xié)同性和安全性方面的問題。
使用FTP時(shí)候,網(wǎng)絡(luò)中的防火墻必須要聲明相應(yīng)的端口,防火墻必須要跟蹤FTP對(duì)話然后檢查PORT命令,防火墻必須要參與從服務(wù)器端到客戶端在PORT命令中指定的端口連接的建立過程。
如果網(wǎng)絡(luò)中使用了NAT(注:網(wǎng)絡(luò)地址翻譯),那么NAT的網(wǎng)關(guān)同樣也需要聲明相應(yīng)的端口,網(wǎng)關(guān)需要把在PORT命令中指定的IP地址翻譯成分配給客戶的地址,然后重新計(jì)算TCP的Checksum;如果網(wǎng)關(guān)沒有正確地執(zhí)行這個(gè)操作,F(xiàn)TP就失敗了。
FTP Passive模式
下面的列表描述了Passive模式的FTP的步驟,步驟1到3和Port模式FTP相同,步驟9到11同樣與Port模式FTP最后三步相同。
1、客戶端發(fā)送一個(gè)TCP SYN(TCP同步)包給服務(wù)器段眾所周知的FTP控制端口21,客戶端使用暫時(shí)的端口作為它的源端口;
2、服務(wù)器端發(fā)送SYN ACK(同步確認(rèn))包給客戶端,源端口為21,目的端口為客戶端上使用的暫時(shí)端口;
3、客戶端發(fā)送一個(gè)ACK(確認(rèn))包;客戶端使用這個(gè)連接來發(fā)送FTP命令,服務(wù)器端使用這個(gè)連接來發(fā)送FTP應(yīng)答;
4、當(dāng)用戶請(qǐng)求一個(gè)列表(List)或者發(fā)送或接收文件時(shí)候,客戶端軟件發(fā)送PASV命令給服務(wù)器端表明客戶端希望進(jìn)入Passive模式;
5、服務(wù)器端進(jìn)行應(yīng)答,應(yīng)答包括服務(wù)器的IP地址和一個(gè)暫時(shí)的端口,這個(gè)暫時(shí)的端口是客戶端在打開數(shù)據(jù)傳輸連接時(shí)應(yīng)該使用的端口;
6、客戶端發(fā)送一個(gè)SYN包,源端口為客戶端自己選擇的一個(gè)暫時(shí)端口,目的端口為服務(wù)器在PASV應(yīng)答命令中指定的暫時(shí)端口號(hào);
7、服務(wù)器端發(fā)送SYN ACK包給客戶端,目的端口為客戶端自己選擇的暫時(shí)端口,源端口為PASV應(yīng)答中指定的暫時(shí)端口號(hào);
8、客戶端發(fā)送一個(gè)ACK包;
9、發(fā)送數(shù)據(jù)的主機(jī)以這個(gè)連接來發(fā)送數(shù)據(jù),數(shù)據(jù)以TCP段(注:segment,第4層的PDU)形式發(fā)送(一些命令,如STOR表示客戶端要發(fā)送數(shù)據(jù),RETR表示服務(wù)器段發(fā)送數(shù)據(jù)),這些TCP段都需要對(duì)方進(jìn)行ACK確認(rèn);
10、當(dāng)數(shù)據(jù)傳輸完成以后,發(fā)送數(shù)據(jù)的主機(jī)以一個(gè)FIN命令來結(jié)束數(shù)據(jù)連接,這個(gè)FIN命令需要另一臺(tái)主機(jī)以ACK確認(rèn),另一臺(tái)主機(jī)也發(fā)送一個(gè)FIN命令,這個(gè)FIN命令同樣需要發(fā)送數(shù)據(jù)的主機(jī)以ACK確認(rèn);
11、客戶端能在控制連接上發(fā)送更多的命令,這可以打開和關(guān)閉另外的數(shù)據(jù)連接;有時(shí)候客戶端結(jié)束后,客戶端以FIN命令來關(guān)閉一個(gè)控制連接,服務(wù)器端以ACK包來確認(rèn)客戶端的FIN,服務(wù)器同樣也發(fā)送它的FIN,客戶端用ACK來確認(rèn)。
一個(gè)PASV請(qǐng)求要求服務(wù)器在服務(wù)器選擇的一個(gè)新的端口上接受數(shù)據(jù)連接,PASV命令沒有任何參數(shù),服務(wù)器端的回應(yīng)只是一行顯示服務(wù)器IP地址和服務(wù)器接受連接的TCP端口號(hào)。
由于PORT模式僅僅是發(fā)送端口給服務(wù)器,由服務(wù)器連回客戶端,如果客戶端有防火墻,這樣的連接會(huì)被認(rèn)為是外部主機(jī)試圖連接內(nèi)部的主機(jī), 通常情況下是不允許的。
為了解決這個(gè)問題, 引入了PASV模式