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 看待而已。