隨著實(shí)驗(yàn)室規(guī)模不斷擴(kuò)大,對(duì)外IP漸漸不夠用。于是在原有網(wǎng)絡(luò)的基礎(chǔ)上,重新劃出一塊區(qū)域作為實(shí)驗(yàn)室“內(nèi)網(wǎng)”,這面臨著兩個(gè)需求:內(nèi)網(wǎng)機(jī)器必須訪問互聯(lián)網(wǎng);實(shí)驗(yàn)室其他外網(wǎng)IP的機(jī)器能夠訪問內(nèi)網(wǎng)機(jī)器。以下是規(guī)劃中的網(wǎng)絡(luò)拓?fù)鋱D:
概念
路由
路由(routing)就是通過互聯(lián)的網(wǎng)絡(luò)把信息從源地址傳輸?shù)侥康牡刂返幕顒?dòng)。這里需要明確兩點(diǎn):
路由不等于路由器,很多人一提起路由,就想到路由器,實(shí)際上這是不對(duì)的。路由器僅僅作為路由的一個(gè)硬件實(shí)現(xiàn),同樣,我們還可以借助一些軟件實(shí)現(xiàn)“軟路由”。
既然路由是通過互聯(lián)的網(wǎng)絡(luò)把信息從源地址傳輸?shù)侥康牡刂返幕顒?dòng),那么存在著從源地址到目標(biāo)地址的“路徑”,至于這個(gè)“路徑”是如何找到的,可以通過一系列算法得到動(dòng)態(tài)路由,或者直接手動(dòng)設(shè)置靜態(tài)路由。
我們平常設(shè)定的“網(wǎng)關(guān)”,實(shí)際上就相當(dāng)于手動(dòng)設(shè)置的靜態(tài)路由。
路由器
路由器(router)是路由的實(shí)現(xiàn)者,它工作在OSI第三層(網(wǎng)絡(luò)層)上、具有連接不同類型網(wǎng)絡(luò)的能力并能夠選擇數(shù)據(jù)傳送路徑的網(wǎng)絡(luò)設(shè)備。路由器有三個(gè)特征:工作在網(wǎng)絡(luò)層上、能夠連接不同類型的網(wǎng)絡(luò)、能夠選擇數(shù)據(jù)傳遞路徑。它能理解數(shù)據(jù)中的IP地址,如果它接收到一個(gè)數(shù)據(jù)包,就檢查其中的IP地址,如果目標(biāo)地址是本地網(wǎng)絡(luò)的就不理會(huì),如果是其他網(wǎng)絡(luò)的,就將數(shù)據(jù)包轉(zhuǎn)發(fā)出本地網(wǎng)絡(luò)。
TTL
TTL(Time To Live)是IP協(xié)議包中的一個(gè)值,它告訴網(wǎng)絡(luò)路由器包在網(wǎng)絡(luò)中的時(shí)間是否太長(zhǎng)而應(yīng)被丟棄。有很多原因使包在一定時(shí)間內(nèi)不能被傳遞到目的地。例如,不正確的路由表可能導(dǎo)致包的無限循環(huán)。一個(gè)解決方法就是在一段時(shí)間后丟棄這個(gè)包,然后給發(fā)送者一個(gè)報(bào)文,由發(fā)送者決定是否要重發(fā)。TTL的初值通常是系統(tǒng)缺省值,是包頭中的8位的域。TTL的最初設(shè)想是確定一個(gè)時(shí)間范圍,超過此時(shí)間就把包丟棄。由于每個(gè)路由器都至少要把TTL域減一,TTL通常表示包在被丟棄前最多能經(jīng)過的路由器個(gè)數(shù)。當(dāng)記數(shù)到0時(shí),路由器決定丟棄該包,并發(fā)送一個(gè)ICMP報(bào)文給最初的發(fā)送者。
NAT
NAT,網(wǎng)絡(luò)地址轉(zhuǎn)換(Network Address Translation),是通過將專用網(wǎng)絡(luò)地址(如企業(yè)內(nèi)部網(wǎng)Intranet)轉(zhuǎn)換為公用地址(如互聯(lián)網(wǎng)Internet),從而對(duì)外隱藏了內(nèi)部管理的 IP 地址。這樣,通過在內(nèi)部使用非注冊(cè)的 IP 地址,并將它們轉(zhuǎn)換為一小部分外部注冊(cè)的 IP 地址,從而減少了IP 地址注冊(cè)的費(fèi)用以及節(jié)省了目前越來越缺乏的地址空間(即IPV4)。同時(shí),這也隱藏了內(nèi)部網(wǎng)絡(luò)結(jié)構(gòu),從而降低了內(nèi)部網(wǎng)絡(luò)受到攻擊的風(fēng)險(xiǎn)。
在一個(gè)典型的配置中,一個(gè)本地網(wǎng)絡(luò)使用一個(gè)專有網(wǎng)絡(luò)的指定子網(wǎng)(比如192.168.x.x或10.x.x.x)和連在這個(gè)網(wǎng)絡(luò)上的一個(gè)路由器。這個(gè)路由器占有這個(gè)網(wǎng)絡(luò)地址空間的一個(gè)專有地址(比如 192.168.0.1),同時(shí)它還通過一個(gè)或多個(gè)因特網(wǎng)服務(wù)提供商提供的公有的IP地址(叫做“過載” NAT)連接到因特網(wǎng)上。當(dāng)信息由本地網(wǎng)絡(luò)向因特網(wǎng)傳遞時(shí),源地址被立即從專有地址轉(zhuǎn)換為公用地址。由路由器跟蹤每個(gè)連接上的基本數(shù)據(jù),主要是目的地址和端口。 當(dāng)有回復(fù)返回路由器時(shí),它通過輸出階段記錄的連接跟蹤數(shù)據(jù)來決定該轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)的哪個(gè)主機(jī);如果有多個(gè)公用地址可用,當(dāng)數(shù)據(jù)包返回時(shí),TCP或UDP客戶機(jī)的端口號(hào)可以用來分解數(shù)據(jù)包。對(duì)于因特網(wǎng)上的一個(gè)系統(tǒng),路由器本身充當(dāng)通信的源和目的地址。
我們通常使用的路由器一般都自動(dòng)集成了NAT。
LAN路由
Windows Server 系列,可以在路由和遠(yuǎn)程訪問中設(shè)置LAN 路由,這僅僅是路由的一個(gè)實(shí)現(xiàn),不存在NAT功能。
最初規(guī)劃
最初,我采用最簡(jiǎn)單的路由器組網(wǎng)方式,來組建實(shí)驗(yàn)室網(wǎng)絡(luò):在網(wǎng)絡(luò)中接入路由器,設(shè)置路由器WAN端IP地址為222.200.176.144,對(duì)內(nèi)網(wǎng)段為10.96.32.*。這時(shí),內(nèi)網(wǎng)地址能輕松訪問外網(wǎng)機(jī)器,但是,外網(wǎng)機(jī)器卻不能訪問內(nèi)網(wǎng)機(jī)器:
執(zhí)行tracert命令,結(jié)果如下:
這說明,tracert試圖通過默認(rèn)路由(222.200.176.254)來查找路徑,這顯然到達(dá)不了目標(biāo)。
既然我們的內(nèi)網(wǎng)是通過222.200.176.144這個(gè)IP連接互聯(lián)網(wǎng)的,因此我需要在我的機(jī)器里手動(dòng)添加一條靜態(tài)路由,告訴網(wǎng)絡(luò),如果訪問10.96.32.*段的東西,直接從222.200.176.144這個(gè)地址尋找就好了,不要麻煩222.200.176.254。
route add -p 10.96.32.0 mask 255.255.255.0 222.200.176.144
在執(zhí)行tracert,結(jié)果……
#@¥#@?。
這是為什么呢?
請(qǐng)教某網(wǎng)絡(luò)牛人,得到答案如下:
路由器上是做了NAT的,當(dāng)信息由本地網(wǎng)絡(luò)向因特網(wǎng)傳遞時(shí),源地址被立即從專有地址轉(zhuǎn)換為公用地址。由路由器跟蹤每個(gè)連接上的基本數(shù)據(jù),主要是目的地址和端口。當(dāng)有回復(fù)返回路由器時(shí),它通過輸出階段記錄的連接跟蹤數(shù)據(jù)來決定該轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)的哪個(gè)主機(jī)。這就意味著,NAT和路由沖突!或者說,路由器下的網(wǎng)絡(luò),只允許內(nèi)網(wǎng)主動(dòng)連接外網(wǎng),不允許外網(wǎng)直接訪問內(nèi)網(wǎng)。
解決辦法一
既然知道原因,就尋求解決方案,牛人給出的方案有兩個(gè):
- 取消路由器的NAT功能,改用CCProxy之類的代理提供內(nèi)網(wǎng)機(jī)器連接互聯(lián)網(wǎng)。
- 在路由器上開設(shè)端口映射。
不過,以上兩個(gè)方案都是無法接受的:CCProxy共享版只支持有限的客戶端,而且,對(duì)于某些不支持代理服務(wù)器的軟件,使用該方案無疑斷送了這些軟件上網(wǎng)的可能!至于第二種方案,很多服務(wù)所使用的端口是不確定的(例如FTP的被動(dòng)模式),根本無法一一設(shè)定這些端口。
添加雙網(wǎng)卡服務(wù)器
既然上述的兩個(gè)解決方案都出局了,還有其他的途徑嗎?這個(gè)問題如鯁在喉,不吐不行。為此我在網(wǎng)上查了些資料,終于想到了一個(gè)可行的解決方案:既然外網(wǎng)機(jī)器無法通過路由器(222.200.176.144)訪問內(nèi)網(wǎng),那么是不是可以開辟另一條路呢?于是我在內(nèi)外網(wǎng)間增加一臺(tái)Server 2008服務(wù)器,該服務(wù)器有兩塊網(wǎng)卡,一塊接入外網(wǎng)(222.200.176.148),另一塊則接入內(nèi)網(wǎng)(10.96.32.148)。同時(shí),在路由和遠(yuǎn)程連接中添加“LAN路由”:
在本機(jī)的靜態(tài)路由修改為:
route add -p 10.96.32.0 mask 255.255.255.0 222.200.176.148
再執(zhí)行tracert,結(jié)果:
再度 #@¥#@?。
這是為什么呢?
牛人聯(lián)系不上,只好自己解決。從上圖tracert的記錄,數(shù)據(jù)包到了222.200.176.148,就不知道該如何發(fā)送到目標(biāo)了。按理說,在222.200.176.148的機(jī)器上,開啟了LAN路由服務(wù),應(yīng)該沒什么問題啊?百思不得其解。
不是辦法的辦法
最后,只能采用以下方案,暫時(shí)解決了問題:
在內(nèi)網(wǎng)的機(jī)器上添加一條靜態(tài)路由,指明:通過IP10.96.32.148訪問222.200.176.*網(wǎng)段:
route add -p 222.200.176.0 mask 255.255.255.0 10.96.32.148
嘗試一下在本機(jī)tracert 10.96.32.144,奇跡般的可以了!
最后的網(wǎng)絡(luò)拓?fù)鋱D如下:

小節(jié)
我在內(nèi)網(wǎng)和實(shí)驗(yàn)室外網(wǎng)間,設(shè)置了兩個(gè)節(jié)點(diǎn)——路由器和部署了LAN路由的雙網(wǎng)卡服務(wù)器——如果內(nèi)網(wǎng)的機(jī)器想訪問Internat(非實(shí)驗(yàn)室外網(wǎng)),則以路由器為網(wǎng)關(guān),進(jìn)行網(wǎng)絡(luò)地址轉(zhuǎn)換。如果內(nèi)網(wǎng)機(jī)器想和實(shí)驗(yàn)室外網(wǎng)互聯(lián),則通過雙網(wǎng)卡服務(wù)器進(jìn)行地址交換。在一定程度上解決了NAT和LAN路由不能共存的問題。