鳥哥的 Linux ADSL 私房菜


IP Router 的架設
本文已不再維護,更新文章請參考 此處
最近更新日期:2003/08/22
 
我們在 網路基礎 裡面提到 路由 (route) 是一個重要的概念,他可以控制我們的資料封包的走向!此外,如果同一個網域裡面有太多的電腦數量需要來廣播的話,效能一定不會太好,所以才會有 Netmask 對吧!今天我們換個角度來想一想,如果說我的網域內真的有太多的電腦數量了,那麼將整個網域切割成較小的數個子網域 (Subnet) 會是一個比較好的作法,不過,因為網域與網域之間的封包不可以直接互通資料,所以這個時候我們就需要使用 Router ( 路由器 ) 來幫忙封包的傳送了!
 
多個 IP 在一塊網路卡上面
  :為何多 IP
  :如何實作command line, 參數設定檔
  :注意事項
路由器 Router
  :什麼是 Router
  :為何需要 Router
  :觀察與修改路由
一個 Router 架設範例
建議
重點回顧
課後練習

多個 IP 在一塊網路卡上面:
路由器 Router:
一個 Router 架設範例:
    好啦!既然知道 Router 的好處之後,再來當然就是要來架設他囉!其實架設的方法真的很簡單!您只要作幾個動作就可以啦!(註:請特別留意,本文僅在測試 Routing 的功能而已,如果您在貴公司內部需要架設 Router 時,可以依照本文的概念來架設,但是實體佈線則需要用『實體網路卡』來區隔,請不要使用本文的 IP Alias 的方式!切記!)
     
    1. 設定網路卡,使連接不同的網域;
    2. 設定 route 路由表,讓兩網域可以互通;
    3. 啟動 ip_forward 的選項;
    4. 在 Client 端設定 gateway 分別為 server 端的兩個 IP !
     
    由於我們的 Router 需要直接跟兩個網域互相連通,所以囉,您的 Router 上面就需要同時具有在這兩個網域之間的 IP 啦!此外,由於不同的網域需要啟動 Routing 的功能!所以您必須要做一個動作,那就是讓目前 Linux 系統裡面的 Routing 功能啟動!那麼我們在 鳥哥的 Linux 私房菜 -- 基礎學習篇之資源管理 的文章裡面曾經提過,那個核心的程序都是記錄在 /proc裡面的,至於我們 Linux 核心的網路功能則都記錄在 /proc/sys/net/ipv4 這個目錄內!而啟動 Routing 的程序為 ip_forward 這個檔案!只要將內容設定為 1 即為啟動,而當為 0 時,就是關閉的啦!因此,若要啟動 Routing 則需要『 echo 1 > /proc/sys/net/ipv4/if_forward 』即可!底下是我的測試環境啦!請注意,這個範例單純僅只是在測試 Router 的功能罷了!您應該依照您的需求來架設您的 Router 呦!那麼就將我的連線圖示秀出來囉! ^_^
     

    測試環境說明:
     
    在我的實際測試環境當中,每個元件的內容如下:
     
    1. Linux 主機:我的 Linux 伺服器本身未來亦作為 NAT 之用,裡面有兩張網路卡,一張連接 ADSL 數據機,這張對外卡的代號為 eth1 ,一張連接內部網路,代號為 eth0 ;
    2. Hub 連結電腦:Linux 主機對內的網路卡 eth0 連接到 Hub 上面,同時,Hub 上面還存在其他四部個人電腦,取兩部來進行測試, IP 分別為 192.168.1.11 及 192.168.0.11 ;
    3. eth0 對內網路卡:由於對內有兩個 C Class 的網域,所以我的網路卡 eth0 設定為 192.168.1.2 而另一個虛擬介面 eth0:0 設定為 192.168.0.2 !
    4. Client 端的作業系統:我的 client 端的設定方面,在 192.168.1.11 使用 Windows 2000 隨機版,而 192.168.0.11 則使用 Red Hat 7.3 這個咚咚囉!
     
    基本的圖示如下示意:
     

     
    在這個章節當中,我們不談怎麼架設 NAT 主機,那個是後續章節才要提到的東西,所以焦點的地方在於 NAT Server 的左邊之設定,也就是 eth0 的設定!亦即是內部網域的設定而已!基本上,這個可以視為 區域網路架構 那一篇文章的內容延伸啦!在這個地方,我們的網路卡有兩個 IP 呦!
     

    開始設定:
     
    我們就照著上面的步驟一步一步做來吧!
    1. 設定網路介面,其中 eth0 為 192.168.1.2, eth0:0 為 192.168.0.2
    [root@test root]# cd /etc/sysconfig/network-scripts
    [root@test network-scripts]# vi ifcfg-eth0
    DEVICE=eth0
    ONBOOT=yes
    BOOTPROTO=static
    IPADDR=192.168.1.2
    NETMASK=255.255.255.0
    NETWORK=192.168.1.0
    BROADCAST=192.168.1.255
    GATEWAY=192.168.1.2

    [root@test network-scripts]# vi ifcfg-eth0:0
    DEVICE=eth0:0
    ONBOOT=no
    BOOTPROTO=static
    IPADDR=192.168.0.2
    NETMASK=255.255.255.0
    NETWORK=192.168.0.0
    BROADCAST=192.168.0.255

    [root@test network-scripts]# ifup eth0 ; ifup eth0:0
    [root@test network-scripts]# ifconfig eth0; ifconfig eth0:0
    eth0      Link encap:Ethernet  HWaddr 00:50:FC:22:9C:57
              inet addr:192.168.1.2  Bcast:192.168.1.255  Mask:255.255.255.0
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:5975598 errors:0 dropped:0 overruns:0 frame:0
              TX packets:6267765 errors:0 dropped:0 overruns:0 carrier:0
              collisions:1331 txqueuelen:100
              RX bytes:557835433 (531.9 Mb)  TX bytes:2811341821 (2681.1 Mb)
              Interrupt:10 Base address:0x6100

    eth0:0    Link encap:Ethernet  HWaddr 00:50:FC:22:9C:57
              inet addr:192.168.0.2  Bcast:192.168.0.255  Mask:255.255.255.0
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              Interrupt:10 Base address:0x6100
    瞧!啟動兩個網路卡囉!這個沒問題的啦!可以連通兩個網域囉!

    2. 觀察路由情況:
    [root@test network-scripts]# route
    Kernel IP routing table
    Destination     Gateway         Genmask        Flags Metric Ref    Use Iface
    140.116.142.253 *               255.255.255.255 UH    0      0        0 ppp0
    192.168.1.0     *               255.255.255.0   U     0      0        0 eth0
    192.168.0.0     *               255.255.255.0   U     0      0        0 eth0
    127.0.0.0       *               255.0.0.0       U     0      0        0 lo
    default         140.116.142.253 0.0.0.0         UG    0      0        0 ppp0
    嘿!路由表是對的!不用理他也沒有關係呢!

    3. 啟動 IP FORWARD 項目:
    [root@test network-scripts]# echo 1 > /proc/sys/net/ipv4/ip_forward
    相信嗎?竟然只要上面這一行,我們的 Linux 就具有 Router 的功能了! ^_^
    如果一切測試都順利,那麼您可以直接將這一行加入 /etc/rc.d/rc.local 這個檔案中!

    4.1 設定 192.168.1.0 那個網域的 client 電腦:
    IP:192.168.1.11
    Gateway:192.168.1.2 <==極度重要的設定!
    netmask:255.255.255.0
    network:192.168.1.0
    broadcast:192.168.1.255

    4.2 設定 192.168.0.0 那個網域的 Client 電腦
    IP:192.168.0.11
    Gateway:192.168.0.2 <==極度重要的設定!
    netmask:255.255.255.0
    network:192.168.0.0
    broadcast:192.168.0.255
    如此一來,兩個網域之間的溝通將會透過彼此的 GATEWAY 而兩者的 GATEWAY 都在 Linux 上面,所以自然很容易進行溝通啦!尤其我們已經開啟了 Routing 的功能!哈哈!OK!沒問題!

    這樣就設定完成了!如何?很容易吧!這樣一來,就可以讓您的很多電腦的內部網域之網路流量舒緩很多囉!此外,這裡必須提出一點說明,因為我上面的範例直接就是要用來作為測試用的,所以搞的比較簡單,而且還是在同一塊 Linux 主機的網路卡上面搞定的!請注意,如果要架設較大流量的 Router 時,請分別以兩張網路卡來分隔不同的網域,這樣應該會比較好呢!而至於 client 端的設定方面可以參考前面幾章的說明:區域網路設定連上 Internet
     
    另外,請特別留意,就如同剛剛前面我們提過的資訊來看,開機的時候,不論您的 alias 的設定為何 ( 是否設定為 ONBOOT ),只要啟動 eth0 則相關的 eth0:n 都會被啟動!這個時候請特別留意!如果其中有一個 IP alias 設定錯誤的話,那麼可能將會導致您的網路整體都會不通!原因多半出在 GATEWAY 上面!建議設定完成之後,先將 eth0 整個 shutdown ,然後再啟動,亦即『ifdown eth0; ifup eth0』然後再來看看 route 的情況!這樣可以避免這次設定成功,下次開機卻是不通的情況發生的!
     

    測試 Router 工作:
     
    好了,不可免俗的,我們可要好好的測試一下我們的 router 囉!如何測試呢?很簡單呀!
     
    1. 在 192.168.1.11 這個 client 端,先連線到 192.168.1.2 試看看能否連線;
    2. 在 192.168.1.11 這個 client 端測試是否可以連線到 192.168.0.2 這個 Server 端的另一個網路連接介面;
    3. 在 192.168.1.11 這個 client 端測試是否可以連接到另一個 client 端,亦即 192.168.0.11 這個 client !?
    4. 將 Linux 主機的 /proc/sys/net/ipv4/ip_forward 功能關掉,然後再檢驗上面的三個步驟看看!試看看網路是否能夠溝通呢?
     
    測試的工作就是這麼簡單!來吧我們來測試看看吧!
    1. Client 端的測試( Windows 2000 作業系統, IP 為 192.168.1.11 ):
    C:\>ping 192.168.1.2  <==同網域的主機
    Pinging 192.168.1.2 with 32 bytes of data:
    Reply from 192.168.1.2: bytes=32 time<10ms TTL=255
    Reply from 192.168.1.2: bytes=32 time<10ms TTL=255
    Reply from 192.168.1.2: bytes=32 time<10ms TTL=255
    Reply from 192.168.1.2: bytes=32 time<10ms TTL=255
    Ping statistics for 192.168.1.2:
        Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
    Approximate round trip times in milli-seconds:
        Minimum = 0ms, Maximum =  0ms, Average =  0ms

    C:\>ping 192.168.0.2  <==不同網域的主機
    Pinging 192.168.0.2 with 32 bytes of data:
    Reply from 192.168.0.2: bytes=32 time<10ms TTL=255
    Reply from 192.168.0.2: bytes=32 time<10ms TTL=255
    Reply from 192.168.0.2: bytes=32 time<10ms TTL=255
    Reply from 192.168.0.2: bytes=32 time<10ms TTL=255
    Ping statistics for 192.168.0.2:
        Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
    Approximate round trip times in milli-seconds:
        Minimum = 0ms, Maximum =  0ms, Average =  0ms

    C:\>ping 192.168.0.11  <==不同網域的 Client 端!
    Pinging 192.168.0.11 with 32 bytes of data:
    Reply from 192.168.0.11: bytes=32 time<10ms TTL=254
    Reply from 192.168.0.11: bytes=32 time<10ms TTL=254
    Reply from 192.168.0.11: bytes=32 time<10ms TTL=254
    Reply from 192.168.0.11: bytes=32 time<10ms TTL=254
    Ping statistics for 192.168.0.11:
        Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
    Approximate round trip times in milli-seconds:
        Minimum = 0ms, Maximum =  0ms, Average =  0ms
    看到了嗎?用我們的 192.168.1.11 可以 ping 到 192.168.0.11 呦!OK囉!

    2. Server 端的修改:
    [root@test root]# echo 0 > /proc/sys/net/ipv4/ip_forward
    先將 IP routing 的功能關掉一下!試看看結果!

    3. Client 端的測試 ( 作業系統為 windows 2000, IP 192.168.1.11 ):
    C:\>ping 192.168.0.11
    Pinging 192.168.0.11 with 32 bytes of data:
    Request timed out.
    Request timed out.
    Request timed out.
    Request timed out.
    Ping statistics for 192.168.0.11:
        Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),
    Approximate round trip times in milli-seconds:
        Minimum = 0ms, Maximum =  0ms, Average =  0ms
    馬上就無法連線了!很誇張吧!! ^_^

    4. 恢復 Linux Router :
    [root@test root]# echo 1 > /proc/sys/net/ipv4/ip_forward
    不要忘記把 IP Routing 的功能加回來呢!

    5. 用另一部 Linux 主機看一下結果 ( IP 192.168.0.11 ):
    [root@vbird-redhat root]# ping -c 3 192.168.1.11
    PING 192.168.1.11 (192.168.1.11) from 192.168.0.11 : 56(84) bytes of data.
    64 bytes from 192.168.1.11: icmp_seq=1 ttl=127 time=0.542 ms
    64 bytes from 192.168.1.11: icmp_seq=2 ttl=127 time=0.517 ms
    64 bytes from 192.168.1.11: icmp_seq=3 ttl=127 time=0.541 ms
    --- 192.168.1.11 ping statistics ---
    3 packets transmitted, 3 received, 0% loss, time 1998ms
    rtt min/avg/max/mdev = 0.517/0.533/0.542/0.022 ms
    看到上面斜體字了嗎?嘿嘿!沒錯!兩個不同網域確實有在溝通囉! ^_^

    呵呵!測試的結果也告訴我們囉!沒錯!有沒有啟動 Routing 的功能將會影響 Linux 是否可以具有 Router 的能力!

建議:
上面的那個範例單純只是為了作為範例來示範!要注意,我們在公司內部架設 router 的時候,通常是希望降低內部網路流量的負載,這個時候,當然是將兩個網域分別分開在兩個實體網路卡上面比較好!而不是在一塊網路卡上面設定兩組 IP ,這樣做對於減低流量負荷的幫助應該不大!所以,您的實體線路配線方面可能要變成如下圖所示的模樣( 當然,設定方面則是完全一樣啦! ):
無論如何,上面的方式可以提供一些中小企業,電腦數要多不多,偏偏又會影響整體流量的情況時,可以使用來解決問題!再來,對於中小學的網路佈線情況呢,也可以達到不錯的降低整體網路負荷的效果!而這個簡單的 Router 您可以使用 486 那種等級的舊舊的電腦來架設就可以啦!反正他的 loading 又不重∼∼此外,附上一篇小州前輩的建議給大家參考:
 
其實這樣子弄是有點問題的。我的意思是說,一般弄切割的話,還是需要弄獨立的網路卡分隔,這不只是區隔網路而已,而且還是考慮到實體封包流通時的問題。
 
您網頁上的架構,實體網路佈線,那 linux 只有一張網路卡,所以網路卡接網路線時會接到 hub 上,而 a、b 兩端不同網路區段的電腦也都是把網路線接到該 hub。這個佈線方式,其實底層封包流通時,a、b 兩端網路都還是可以收到,只不過 ip 那層看到因為不是自己網路區段的封包而不理會。
 
 ip alias 時機,一般不建議用在提供 router/nat 這類同一個 ip 區段內,因為不同網路區段的封包還是會撞在一起... 真正商業使用上,要提供router/nat 功能時,通常不會建議使用 ip alias (除非真的是臨時需要或者是真的少網路卡可以用),而會使用兩張網路卡並且各自使用 hub/switch切割開處理。
 
另外以管理實際網路的經驗來看,其實若是有使用者作怪,像是 a 網路有人架設dhcp,那 b 網路使用者可能就遭殃了:Q 還有就是,若是 a 網路內的電腦作怪,也可以把自己的 ip 設定為 b 網路區段內的 ip,那就會失去區隔效用。

重點回顧:
課後練習
IP Router 的架設

2002/08/09:第一次完成日期!
2003/08/22:重新編輯文章,並增加重點回顧與課後練習