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

小節
我在內網和實驗室外網間,設置了兩個節點——路由器和部署了LAN路由的雙網卡服務器——如果內網的機器想訪問Internat(非實驗室外網),則以路由器為網關,進行網絡地址轉換。如果內網機器想和實驗室外網互聯,則通過雙網卡服務器進行地址交換。在一定程度上解決了NAT和LAN路由不能共存的問題。