Dict.CN 在線(xiàn)詞典, 英語(yǔ)學(xué)習(xí), 在線(xiàn)翻譯

          都市淘沙者

          荔枝FM Everyone can be host

          統(tǒng)計(jì)

          留言簿(23)

          積分與排名

          優(yōu)秀學(xué)習(xí)網(wǎng)站

          友情連接

          閱讀排行榜

          評(píng)論排行榜

          內(nèi)網(wǎng)FTP服務(wù)器架設(shè)指南(proftpd版)【轉(zhuǎn)帖】

          版權(quán)聲明:可以任意轉(zhuǎn)載,但轉(zhuǎn)載時(shí)必須標(biāo)明原作者charlee、原始鏈接http://tech.idv2.com/2004/12/02/make-ftp-with-proftpd-in-lan/以及本聲明。

          由于最近很多人詢(xún)問(wèn)關(guān)于如何在內(nèi)網(wǎng)架設(shè)FTP的問(wèn)題,因此在這里把經(jīng)驗(yàn)總結(jié)一下供大家分享。

          本文將分為四個(gè)部分。第一部分闡述“什么是內(nèi)網(wǎng)架設(shè)FTP”的問(wèn)題。第二部分分析FTP協(xié)議的原理。第三部分闡述在內(nèi)網(wǎng)中架設(shè)FTP服務(wù)器時(shí)會(huì)遇到的問(wèn)題以及解決方法,使外網(wǎng)的用戶(hù)能夠訪(fǎng)問(wèn)位于內(nèi)網(wǎng)的FTP服務(wù)器。第四部分為總結(jié)。建議讀者能夠?qū)⑦@五部分全部讀完。如果只想要一個(gè)快速安裝指南,那么請(qǐng)閱讀第一部分和第四部分。

          本文所使用的FTP服務(wù)器為proftpd。


          內(nèi)網(wǎng)FTP服務(wù)器的概念

          設(shè)想下面的這種環(huán)境:幾臺(tái)計(jì)算機(jī)組成一個(gè)局域網(wǎng),該局域網(wǎng)中擁有一臺(tái)DHCP服務(wù)器負(fù)責(zé)為局域網(wǎng)中每臺(tái)計(jì)算機(jī)分配IP地址。其中有一臺(tái)計(jì)算機(jī)(或網(wǎng)絡(luò)設(shè)備)作為網(wǎng)關(guān)(可以與DHCP服務(wù)器為同一臺(tái)設(shè)備),網(wǎng)關(guān)通過(guò)撥號(hào)或其他方式連接到Internet,獲取一個(gè)真實(shí)IP地址。局域網(wǎng)內(nèi)的計(jì)算機(jī)通過(guò)網(wǎng)關(guān)的轉(zhuǎn)發(fā)來(lái)實(shí)現(xiàn)與Internet的連接。我們定義該局域網(wǎng)內(nèi)部為內(nèi)網(wǎng),相對(duì)地,定義Internet為外網(wǎng)。

          舉個(gè)例子,假設(shè)我們擁有兩臺(tái)計(jì)算機(jī)A、B和一個(gè)擁有撥號(hào)和DHCP功能的網(wǎng)關(guān)G。各自的網(wǎng)絡(luò)配置如下:

          網(wǎng)關(guān)G:
          局域網(wǎng)IP地址:192.168.0.1(由網(wǎng)關(guān)硬件指定)
          局域網(wǎng)子網(wǎng)掩碼:255.255.255.0(由網(wǎng)關(guān)硬件指定)
          廣域網(wǎng)IP地址:12.34.56.78(撥號(hào)之后獲得)
          計(jì)算機(jī)A:
          局域網(wǎng)IP地址:192.168.0.10(通過(guò)網(wǎng)關(guān)的DHCP功能獲得)
          局域網(wǎng)子網(wǎng)掩碼:255.255.255.0(通過(guò)網(wǎng)關(guān)的DHCP功能獲得)
          網(wǎng)關(guān):192.168.0.1(通過(guò)網(wǎng)關(guān)的DHCP功能獲得)
          計(jì)算機(jī)B:
          局域網(wǎng)IP地址:192.168.0.11(通過(guò)網(wǎng)關(guān)的DHCP功能獲得)
          局域網(wǎng)子網(wǎng)掩碼:255.255.255.0(通過(guò)網(wǎng)關(guān)的DHCP功能獲得)
          網(wǎng)關(guān):192.168.0.1(通過(guò)網(wǎng)關(guān)的DHCP功能獲得) 

          這樣,從A、B發(fā)出的所有網(wǎng)絡(luò)請(qǐng)求都會(huì)被發(fā)送到網(wǎng)關(guān)G(192.168.0.1),網(wǎng)關(guān)再將這些請(qǐng)求變換之后通過(guò)12.34.56.78發(fā)送到Internet,以實(shí)現(xiàn)A、B與Internet的連接。

          需要提醒一點(diǎn)的是,你的網(wǎng)關(guān)必須擁有端口映射(Port Mapping)的功能(也稱(chēng)轉(zhuǎn)發(fā),F(xiàn)orwarding),這是下文架設(shè)服務(wù)器的先決條件。所謂端口映射功能,就是指網(wǎng)關(guān)能夠?qū)耐饩W(wǎng)發(fā)送到網(wǎng)關(guān)的指定端口的包轉(zhuǎn)發(fā)到內(nèi)網(wǎng)中指定的IP地址上。舉個(gè)例子,假如我們定義了如下一條規(guī)則:將端口21映射到192.168.0.10上。那么

          從外網(wǎng)發(fā)送到網(wǎng)關(guān)的一個(gè)包,其信息為源地址:200.12.34.56:7890,目的地址:12.34.56.78:21

          那么網(wǎng)關(guān)將修改該包的目的地址,結(jié)果為源地址:200.12.34.56:7890,目的地址:192.168.0.10:21

          并將該包發(fā)送到局域網(wǎng)中的192.168.0.10上。這樣對(duì)于192.168.0.10來(lái)說(shuō),這個(gè)包仿佛是從Internet上直接發(fā)給自己的一樣。

          FTP協(xié)議原理

          一般我們說(shuō),F(xiàn)TP協(xié)議使用TCP端口21。實(shí)際上這這并不準(zhǔn)確;FTP協(xié)議使用TCP的21端口傳送的是控制命令,同時(shí)使用隨機(jī)端口來(lái)傳送數(shù)據(jù)。也就是說(shuō),下載一個(gè)文件至少需要在客戶(hù)端與服務(wù)器之間建立兩個(gè)TCP連接,這兩個(gè)連接分別稱(chēng)為控制連接和數(shù)據(jù)連接。

          控制連接總是由客戶(hù)端主動(dòng)連接服務(wù)器的21端口來(lái)建立的;而數(shù)據(jù)連接則不一定。根據(jù)數(shù)據(jù)連接的建立方式的不同,F(xiàn)TP傳送方式可分為主動(dòng)方式和被動(dòng)方式兩種。主動(dòng)方式下,服務(wù)器連接客戶(hù)端的某個(gè)端口以建立數(shù)據(jù)連接;被動(dòng)方式下,客戶(hù)端連接服務(wù)器的某個(gè)端口來(lái)建立數(shù)據(jù)連接。

          主動(dòng)方式的連接過(guò)程如下:

          1. 客戶(hù)端用隨機(jī)端口連接服務(wù)器的21端口,建立控制連接,并發(fā)送用戶(hù)名和密碼進(jìn)行登錄。
          2. 客戶(hù)端打開(kāi)一個(gè)隨機(jī)端口P進(jìn)行監(jiān)聽(tīng),并通過(guò)控制連接將自己的IP地址和P端口的信息通知服務(wù)器。
          3. 服務(wù)器用自己的隨機(jī)端口連接客戶(hù)端的端口P,建立數(shù)據(jù)連接,并進(jìn)行數(shù)據(jù)傳送。
          4. 數(shù)據(jù)傳送完畢之后,數(shù)據(jù)連接斷開(kāi)。
          5. 客戶(hù)端通過(guò)控制連接發(fā)送結(jié)束命令,以斷開(kāi)控制連接,F(xiàn)TP交互過(guò)程結(jié)束。

          被動(dòng)方式的連接過(guò)程如下:

          1. 客戶(hù)端用隨機(jī)端口連接服務(wù)器的21端口,建立控制連接,并發(fā)送用戶(hù)名和密碼進(jìn)行登錄。(與主動(dòng)方式相同)
          2. 客戶(hù)端通過(guò)控制連接通知服務(wù)器使用被動(dòng)方式。
          3. 服務(wù)器選擇一個(gè)隨機(jī)端口P進(jìn)行監(jiān)聽(tīng),并通過(guò)控制連接將自己的IP地址和P端口的信息通知客戶(hù)端。
          4. 客戶(hù)端用自己的隨機(jī)端口連接服務(wù)器的端口P,建立數(shù)據(jù)連接,并進(jìn)行數(shù)據(jù)傳送。
          5. 數(shù)據(jù)傳送完畢之后,數(shù)據(jù)連接斷開(kāi)。(與主動(dòng)方式相同)
          6. 客戶(hù)端通過(guò)控制連接發(fā)送結(jié)束命令,以斷開(kāi)控制連接,F(xiàn)TP交互過(guò)程結(jié)束。(與主動(dòng)方式相同)

          舉個(gè)實(shí)際的例子來(lái)說(shuō)明。下文中以S:開(kāi)頭的為服務(wù)器返回的信息,C:開(kāi)頭的為客戶(hù)端命令。主動(dòng)方式:

          S: 220 ProFTPD 1.2.10 Server(控制連接建立,服務(wù)器返回歡迎信息)
          C: USER foo(發(fā)送用戶(hù)名)
          S: 331 Password required for foo.
          C: PASS mypassword (發(fā)送密碼)
          S: 230 User foo logged in. (登錄成功)
          C: SYST (獲取服務(wù)器類(lèi)型)
          S: 215 UNIX Type: L8
          C: PWD (獲取當(dāng)前目錄)
          S: 257 "/" is current directory.
          C: PORT 192,168,0,11,10,171 (客戶(hù)端監(jiān)聽(tīng)端口2731,并將IP地址和端口2731通過(guò)PORT命令通知服務(wù)器。2731為10*256+171)
          S: 200 PORT command successful
          C: TYPE A (設(shè)置傳輸方式為文本方式)
          S: 200 Type set to A
          C: LIST (發(fā)出獲取文件列表的命令)
          S: 150 Opening ASCII mode data connection for file list (服務(wù)器嘗試連接客戶(hù)端的2731端口以建立數(shù)據(jù)連接)
          (通過(guò)數(shù)據(jù)連接發(fā)送文件列表……)
          S: 226 Transfer complete. (文件列表傳送完畢,數(shù)據(jù)連接斷開(kāi))
          C: QUIT (退出命令) 

          被動(dòng)方式:

          S: 220 ProFTPD 1.2.10 Server(控制連接建立,服務(wù)器返回歡迎信息)
          C: USER foo(發(fā)送用戶(hù)名)
          S: 331 Password required for foo.
          C: PASS mypassword (發(fā)送密碼)
          S: 230 User foo logged in. (登錄成功)
          C: SYST (獲取服務(wù)器類(lèi)型)
          S: 215 UNIX Type: L8
          C: PWD (獲取當(dāng)前目錄)
          S: 257 "/" is current directory.
          C: PASV (通知服務(wù)器使用被動(dòng)方式)
          S: 227 Entering Passive Mode (192,168,0,10,132,29).
          (服務(wù)器監(jiān)聽(tīng)端口33821,并將IP地址和端口33821通過(guò)PORT命令通知服務(wù)器。33821為132*256+29)
          C: TYPE A (設(shè)置傳輸方式為文本方式)
          S: 200 Type set to A
          C: LIST (發(fā)出獲取文件列表的命令)
          S: 150 Opening ASCII mode data connection for file list (客戶(hù)端嘗試連接服務(wù)器的33821端口以建立數(shù)據(jù)連接)
          (通過(guò)數(shù)據(jù)連接發(fā)送文件列表……)
          S: 226 Transfer complete. (文件列表傳送完畢,數(shù)據(jù)連接斷開(kāi))
          C: QUIT (退出命令)
          

          內(nèi)網(wǎng)FTP服務(wù)器的問(wèn)題及解決方案

          在這里我們沿用第一部分的網(wǎng)絡(luò)實(shí)例,并假設(shè)FTP服務(wù)器架設(shè)在計(jì)算機(jī)A(192.168.0.10)上。

          如何使外網(wǎng)的客戶(hù)端能夠與內(nèi)網(wǎng)的FTP服務(wù)器建立控制連接

          由于控制連接的服務(wù)器端端口為21,因此我們只需要在網(wǎng)關(guān)的端口映射上添加一條規(guī)則,將21端口映射到192.168.0.10即可。

          如何建立數(shù)據(jù)連接

          在主動(dòng)方式下,數(shù)據(jù)連接由服務(wù)器發(fā)起,相當(dāng)于內(nèi)網(wǎng)的服務(wù)器主動(dòng)去連接外網(wǎng)的客戶(hù)端,這種連接可以穿過(guò)網(wǎng)關(guān)正常建立,因此不需要做任何特殊設(shè)置即可實(shí)現(xiàn)。問(wèn)題是被動(dòng)連接。由于被動(dòng)方式下服務(wù)器會(huì)監(jiān)聽(tīng)隨機(jī)端口并需要將自己的IP地址和端口號(hào)通知客戶(hù)端,這樣就產(chǎn)生了以下兩個(gè)問(wèn)題: a) 服務(wù)器僅知道自己的內(nèi)網(wǎng)IP地址(192.168.0.10),它會(huì)將這個(gè)IP地址通知給外網(wǎng)的客戶(hù)端,而客戶(hù)端從外網(wǎng)是無(wú)法連接這個(gè)內(nèi)網(wǎng)IP地址的(客戶(hù)端不知道該如何路由); b) 服務(wù)器需要監(jiān)聽(tīng)隨機(jī)端口,范圍為1024-65535,出于安全起見(jiàn),也考慮到可能存在其它的服務(wù)也使用該范圍內(nèi)的端口,因此不可能在網(wǎng)關(guān)上將這些端口全部映射給192.168.0.10。

          由于以上的問(wèn)題的存在,我們經(jīng)??梢钥吹竭B接服務(wù)器時(shí)下方的連接日志停在

          150 Opening ASCII mode data connection for file list 

          處遲遲不動(dòng),這就是因?yàn)楸粍?dòng)數(shù)據(jù)連接無(wú)法建立。

          對(duì)此proftpd提供了如下的解決方案。

          1. 通過(guò)MasqueradeAddress命令指定服務(wù)器通知給客戶(hù)端的IP地址。即使得FTP服務(wù)器不再將自己的內(nèi)網(wǎng)IP地址192.168.0.10通知給客戶(hù)端,而是將MasqueradeAddress命令指定的IP地址通知給客戶(hù)端。在proftpd.conf中添加如下命令:
            MasqueradeAddress 12.34.56.78 (指定為網(wǎng)關(guān)的外網(wǎng)地址) 
            如果網(wǎng)關(guān)的外網(wǎng)地址不固定(例如通過(guò)撥號(hào)獲取IP的情況),那么你需要為你的網(wǎng)關(guān)申請(qǐng)一個(gè)動(dòng)態(tài)域名,并用MasqueradeAddress命令將域名指定給服務(wù)器。
            MasqueradeAddress myftpserver.vicp.net 
          2. 通過(guò)PassivePorts命令來(lái)限制被動(dòng)方式下監(jiān)聽(tīng)的端口的范圍。例如
            PassivePorts 60000 65535 
            這樣服務(wù)器在被動(dòng)方式下將僅使用60000-65535之間的端口,而不是原來(lái)的1024-65535。然后在網(wǎng)關(guān)上添加規(guī)則,將60000-65535的所有端口映射到192.168.0.10上。

          這樣,外網(wǎng)的客戶(hù)端就可以正常訪(fǎng)問(wèn)FTP服務(wù)器了。

          但是上面的方法并不是十全十美的。我們用MasqueradeAddress命令強(qiáng)制FTP通知網(wǎng)關(guān)的IP地址,這對(duì)于客戶(hù)端位于外網(wǎng)的情況下是正確的,但是當(dāng)客戶(hù)端位于內(nèi)網(wǎng)時(shí),客戶(hù)端可能會(huì)無(wú)法解析網(wǎng)關(guān)的IP地址,導(dǎo)致無(wú)法建立數(shù)據(jù)連接。

          總結(jié)

          內(nèi)網(wǎng)架設(shè)FTP服務(wù)器的方法:

          1. 在proftpd.conf中利用MasqueradeAddress命令將網(wǎng)關(guān)的IP地址或域名指定給FTP服務(wù)器,例如
            MasqueradeAddress myftpserver.vicp.net 
            MasqueradeAddress 12.34.56.78 
            然后通過(guò)PassivePorts命令來(lái)限制被動(dòng)方式下監(jiān)聽(tīng)的端口的范圍,例如
            PassivePorts 60000 65535 
          2. 在網(wǎng)關(guān)的端口映射上將第一步中指定的端口范圍(例中為60000-65535)以及FTP端口21映射到FTP服務(wù)器的內(nèi)網(wǎng)地址上。

          posted on 2009-12-25 13:45 都市淘沙者 閱讀(542) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): lighttpd/nginx/HA/LVS/FTP

          主站蜘蛛池模板: 横峰县| 专栏| 奉化市| 井陉县| 林口县| 靖安县| 延庆县| 永德县| 黑龙江省| 新蔡县| 玉溪市| 三原县| 汽车| 涞源县| 南投县| 林西县| 土默特右旗| 晋江市| 嘉荫县| 滦平县| 贺州市| 澄江县| 仪征市| 肥乡县| 宁德市| 灌南县| 额敏县| 武陟县| 大荔县| 靖安县| 满城县| 济南市| 洛浦县| 乌恰县| 新巴尔虎右旗| 武穴市| 卢龙县| 潢川县| 丰都县| 扶风县| 蒙自县|