Song <Song.bbs@bbs.cynix.com.tw>
wrote in message
news:3c0a4Q$6Pm@bbs.cynix.com.tw...
>
> ※ 引述《netmanforever@yahoo.com
(網中人)》之銘言:
> > 末日無極 <Doomday@bbs.ee.ntu.edu.tw>
wrote in message
> > news:3bj7a5$HDP@bbs.ee.ntu.edu.tw...
> > > 小弟目前也在架NAT , 有些問題想請教您. 我目前接ADSL,
有5 個IP, 範圍從
> > > 211.20.240.170 - 211.20.240.174 , submask=255.255.255.248,
gateway=
> > > 211.20.240.169 . 我的NAT 架構如下:
> > > Internet
> > >
|
> > >
|
> > > ADSL
Modem(Gateway)211.20.240.169
> > >
|
> > >
|
> > > +------+-------+
> > > | eth0
| DMZ Area
> > > |211.20.240.170|
|
> > > |
| |
> > > |
|eth1 211.20.240.171
> > > |
+------+----------+
> > > |
| WWW MAIL
211.20.240.173
> > > | Linux server |
211.20.240.172
> > > |
|
> > > +------+-------+
> > >
|eth2 192.168.0.1
> > >
|
> > > Internal Network 192.168.0.2-X
> > 另外在附上一篇與網友的討論﹐希望有助理解﹕
> > 而且您別忘了 gateway 上的 netmask
不容易修改﹐因為還要牽涉到上游 router
的修
> > 改。有鑒與此弟覺得 33 到 35
這段就不要切了﹐讓它繼續用 29 bit mask 吧。
> > 然後另一段 36 到 39
可以進行再切割﹐但正如您所知道的﹐就剩下 37 和 38 可
以用
> > 而已。沒錯﹐您可以用這兩個 IP 給 DMZ
用﹐但卻只能裝一台 server 而已﹐因
為其
> > 中一個 IP 一定要給 FW
用。但您有沒想過從外面的封包進來的時候﹐如果到達
DMZ
> > 呢﹖下面讓我們模擬一下﹕
> > internet 上可以將封包路由到 ISP﹐然後 ISP
可以將封包路由到 33 那個
router ﹐
> > 除非您能修改 33
上面的路由表﹐否則﹐它就不知道如何將封包丟給 DMZ 了。而
33
> > 上面的管理密碼﹐是 ISP
設定的﹐除非他們給您﹐否則您就要破解才可以進入修
改。
> > Okay﹐您現在明白到問題所在了嗎﹖
>
> 小弟在這點上有些懷疑,有關於對外
router 的 routing table 如果沒修改
> 是否寄給 DMZ 的封包會找不到路?
嗯﹐很好的一個討論。應該詳細研究一下的。
>
>
以上方的圖形架構作比喻,假設分配到的 ip
211.20.240.168/255.255.255.248
> 在 adsl router 的 ip 211.20.240.169/255.255.255.248 ,我們在 linux
router
> eth0 上設定 211.20.240.170/255.255.255.252 ,這時由外部進入的
ip 指定要到
> linux router 211.20.240.170 能否到達?
>
> 應該是可以。因為 adsl router 接到這個 subnet
的封包時只有一條路:向
localnet
> 遞送,並不會因為 linux router 的 netmask 設成 255.255.255.252
而不肯遞送封
包
既然往 localnet 去遞送﹐那 ADSL
應該丟到哪台主機去﹖對網路廣播嗎﹖
假如將 Linux router 和 ADSL 相連的界面之 mask 改為 30bit﹐而 ADSL
繼續保持
29bit。它們之間的溝通本身就有問題﹐如果 ADSL 是使用 supernet
技術而非
subnet 的話﹐倒是可以的﹐但我們這裡用的就是 subnet
的切割嘛。
>
> 相同的,如果我們將 DMZ 設定為
211.20.240.172/255.255.255.252 ,eth1 為
> 211.20.240.173/255.255.255.252 ,DMZ 內主機為
211.20.240.174/255.255.255.252
> 當 adsl router 收到 211.20.240.174 的封包時,也只有一條路往
local net 遞
送,
> 而此封包到達 linux router 時,因其 ip 不在同一 subnet
內,再經由 routing
判斷
> 後( 假設 routing table 已經設定好 ),將此封包交往 eth1。
不知道如何判斷 ADSL 送往 localnet 的封包一定會丟給 linux router
呢﹖
先決條件有二﹕
1﹐ADSL 和 Linux router 可以順利溝通
2﹐ADSL 關於 localnet 的預設路由是給 linux router。
在相同 29bit mask 的請求下﹐ADSL
和所有機器都在同一個子網下﹐封包直接就可以
丟給對方﹐而根本無需理會有否 linux router 的存在。
但如果改變 mask 後﹐ ADSL 在自己的 routing table
是沒有這個切割子網的路由資
訊的。所以我在上一封回應所附附的文章中就建議不切割前端
IP﹐目的就是保留
相同的mask﹐讓 ADSL 和 Linux router 保留在同一個 subnet
內﹐才能順利進行溝
通。
但是﹐我並沒建議 DMZ 使用 ip masquerading 技術來偽裝 DMZ
的封包﹐而是直接用
routing 來做﹕
假如在這樣的環境中﹕
1﹐ADSL 和 Linux router 其中一個界面繼續使用 29bit mask﹔
2﹐DMZ 和 Linux router 另一個界面使用 30bit mask。
那麼﹐DMZ 和 ADSL 如何溝通呢﹖
既然 netmask 不同﹐net_id 也就不同﹐既然 net_id 不同﹐就需要
router 的參與。
我們這裡討論的前提是不去修改 ADSL
﹐所以以後的推理都只能讓 ADSL 繼續使用
29bit mask。
我實作過﹐如果應將原本 29bit 的 IP 改成 30bit﹐是不能直接和
ADSL 溝通的。(很
簡單﹐試試就知道了﹐不用理論支持)
既然這環境中我們需要 router ﹐那剛好就用 linux router 好了。
因為 linux router 有兩個界面分別和兩個 net_id 一樣﹐linux router
和兩邊的溝
通沒問題(無需再用 router 了)﹐然後 DMZ 的於是 gateway 在 linux
router
上﹐linux 的
預設 gw 在 ADSL 上﹐ADSL的預設 gw 在 ISP 那裡﹐isp 的 gw
我們不用擔心了。
那好﹐ 從 DMZ 出去的路由不成問題了。但回來呢﹖
因為 ISP 都將 routing 設定好了﹐從外面到達 ADSL
應該不成問題。
ISP 只要加一筆關於這個 29bit 子網的記錄﹕
netowrk: 211.20.240.168 netmask 255.255.255.248 gw: adsl_ip_on_wan 就可以
了。而無需管它下面是怎樣劃分 subnet 。
然後到 ADSL 那裡的路由表格。沒錯﹐如果 netmask 一樣﹐net_id
相同﹐直接丟封包
就到了。但 netmask 不一樣﹐net_id 也不一樣﹐丟哪裡去﹖ADSL
會進行這樣的動作
﹕
-----------------------------------
if 我有這個目的地的路由
從路由表中取得下一站的地址
將封包傳給下一站
###﹕因為沒有﹐所以繼續以下的 else。
else
決定目的地網路號碼
###﹕如何決定﹖看 mask。
if 我有這個網路的界面
決定我的界面上這個網路的子網路遮罩
###﹕沒有﹐因為 net_id 是不一樣的。
###﹕雖然看上去前 29bit 都一樣﹐但 subnet 就是 subnet﹐不能混為一談。
###﹕所以繼續下面 else
else
從這個網路的層級決定它的子網路遮罩
endif
###﹕上一個 if 將會使用預設 24bit mask。
###﹕這個顯然也不對﹐層級是 24bit。
利用遮罩套在目的地位址上﹐取得子網路
###﹕得出的子網顯然是錯誤的。
if 我有這個子網路的界面
將封包直接送往目的地
###﹕沒有這樣的子網界面﹐所以繼續。
else if 我的路由表格包含這個子網路的記錄
從路由表格中取得下一站的地址
將封包傳給下一站
###﹕路表中並沒有這子網的記錄﹐除非手工去寫(也就回到這篇討論的起點了。)
else if 我的路由表格中有一筆預設路由
從路由表格中取得下一站的地址
將封包傳給下一站
###﹕預設路由是 ISP 那邊﹐卻是來源之處﹐當然不對。
else
宣佈這個目的地無效
###﹕看來只能如此了。
endif
endif
-----------------------------------
從上面整個 routing
流程中﹐我們不難發現﹐如果界面所在的子網和目的地不一樣﹐
就要看路由表的設定。
路由表如何改﹖不進入 ADSL 的話﹐如何改﹖
豈能一個籠統的“localnet ”就概括過去了﹖如果判斷封包一定要傳個
linux
router?今天 linux router 的 IP 是 170﹐明天是 171 (因為這段繼續用
29bit﹐所
以這個
IP 成立)。ADSL 如何知道這樣的變化﹖不去修改 routetable 或
netmask 行嗎﹖
>
> 這個做法有一個地方要注意就是,linux
router 的 ip 要與 adsl router 的
ip
> 處於切割後的同一個 subnet。以上例來說,adsl router ip =>
211.20.240.169
> 則 linux router 就必須使用切割的前半段子網 211.20.240.170。
沒錯﹐因為在 routing 的處理中﹕
-----------------------------------
決定目的地網路號碼
###﹕如何決定﹖看 mask。
if 我有這個網路的界面
決定我的界面上這個網路的子網路遮罩
###﹕有﹗因為 net_id 是一樣的。
else
從這個網路的層級決定它的子網路遮罩
endif
###﹕這會使用界面的 netmask。
-----------------------------------
> 一般慣例,gateway 會使用 subnet
內最後一個可用 ip ,也就是 adsl router
的
> ip => 211.20.240.174,則 linux router 就必須設成 211.20.240.173。
嗯﹖怎麼又從 169 換成 174 了﹖
不管這個﹐實際上中華電信的 ADSL 設定卻是用第一個可用 IP
做 router 的。
>
>
> 簡單的說,我的想法是基於「netmask
僅供判斷是否同一 subnet ,而不是能否
> 通訊的條件」。
沒錯﹐這在 CIDR (Classless Inter-Domain Routing) 是成立的﹐但 router
必須支
持。我不確定中華電信派下來的 ADSL 是否具備 CIDR
的功能。但我沒發現
linux router上可以做到。
關於 CIDR 和 Variable Length Subnet Mask (VLSM)
的技術﹐可以參考下面網站﹕
http://www.optimized.com/COMPENDI/IP-VLSM.htm
(那裡的例子可以參考一下﹐但更詳細的研究﹐我推薦 O'Reilly
的 “Cisco 路由器管
理”)
>
> 這也有一些想法未解決,關於 Broadcast
的問題。如果使用後半段 subnet,則
> 211.20.240.174/255.255.255.248 與 211.20.240.173/255.255.255.252 的
Broadcast
> 均為 211.20.240.175 。但如果使用前半段時,Broadcast
會處於不同的位置。所以
>
是否使用後半段會比較好?或是使用前半段會有什麼問題?
沒差﹐反正切割後已經不在同一個 subnet
內了﹐各子網都只用兩台主機會回應關於所
屬子網的廣播而已。用哪段沒問題﹐關鍵是選擇好後要將
routing 設定好就可以了﹕
1﹐netmask 一樣﹐net_id 一樣﹐無需 router﹔直接用 arp 協定找到
MAC 地址﹐就
可以傳遞。
2﹐netmask 不一樣﹐niet_id 不一樣﹐就要 router﹐要用 arp
協定找到 router 的
MAC 地址﹐再傳遞﹔之後看 router 的能耐了。
假如在下這裡說的有問題﹐歡迎隨時指教。事實上﹐因為資源限制﹐弟有許多理論不能
一一用實踐驗證過(我是比較迷信實踐的)。
例如 ADSL
這個硬體﹐弟就不是很了解。這裡僅把它當成一個普通 router
看待而已。