BBS水木清华站∶精华区

 
如何建立一个 Subnet,并以 Linux 当 Static Router ? 
 
Welcome! You are the [Image] th visitor! 
 
---------------------------------------------------------------------------- 
 
本文的主题是要在 Class B 的 net 上,建立一个 Subnet,并且由 Linux 来当做此 
Subnet 的 Router,做为 net 与 Subnet 之 packet 的传递。其架构图如下: 
 
                          [Image] [Image] [Image] 
 
以下将针对各个主题加以说明: 
 
* Linux 当 Router 的先决条件。 
* 如何规划 Subnet 的 IP address。 
* 如何设定 Router 的网路位址。 
* 如何设定 Router 的 Kernel Routing table。 
* 如何设定 Subnet 中机器的网路位址与 Kernel Routing table。 
* 设定 Proxy ARP 来连通 Subnet。 
 
---------------------------------------------------------------------------- 
 
Linux 当 Router 的先决条件 
 
要以 Linux 当 Router,首先必须确认你的 Linux Kernel 中有支援 IP Forwarding 
的功能,也就是在 make Kernel 时,要选择 IP Forwarding 的选项。 
 
在图中,Router 分别以两块网路卡连接 Class B net 与 Subnet,所以让 
Linux 在开机的时候就要抓到这两块网路卡,成了一先决的条件。其方法是在 
 
 /etc/lilo。conf 中加入 
 
        append="ether=irq_0,io_port_0,eth0 ether=irq_1,io_port_1,eth1" 
 
後,再值行 lilo -C lilo。conf,之後再重新开机,应该就可以抓到两块网路卡了。 
要检查是否有抓到两块网路卡的话,可以看 /proc/net/dev 档中是否有 eth0 和 
eth1 两个网路介面,或是值行 ifconfig,看是否有 eth0 和 eth1 两个网路介面, 
若是没有的话,有可能是你的 Kernel 没有支援那种网路卡,那就必须再重新 
make Kernel,将那种网路卡的选项包含进来。 
 
---------------------------------------------------------------------------- 
 
如何规划 Subnet 的 IP address 
 
图中 Router 的两个网路介面分别连接两个 net,且各有其 IP address, 
             eth0=140.115.50.67      为连接 Class B net 的 IP address 
             eth1=140.115.50.161     为连接 Subnet 的 IP address 
现在我们就要来看看如何规划 Subnet. 
首先我们要先决定 Subnet 中有几台机器,也就是要划分几个 IP address 於 Subnet 
中,我以 Subnet 中有 32 台机器为例加以说明.因此 Subnet 之 IP □围为 
140.115.50.160 ~ 140.115.50.191,WHY?? 
 
        140.115.50.160      ===>       140.115.50.101 00000 
                                       ^^^^^^^^^^^^^^ ^^^^^ 
                                      network address host address 
 
        140.115.50.191      ===>       140.115.50.101 11111 
                                       ^^^^^^^^^^^^^^ ^^^^^ 
                                      network address host address 
 
        其 netmask 皆为 
 
        255.255.255.224    ===>       255.255.255.111 00000 
                                      ^^^^^^^^^^^^^^^ ^^^^^ 
        其 broadcast 皆为 
 
        140.115.50.191      ===>      140.115.50.101 11111 
                                      ^^^^^^^^^^^^^^ ^^^^^ 
 
host address 有 5 个 bit,因此可以决定 2^5 = 32 台机器,当然同理你也可以用 
140.115.50.96 ~ 140.115.50.127 为你的 Subnet address,只要不和别人相冲就好了. 
 
所以我们可以将 Subnet 的网路设定做一个整理: 
 
          IP address = 140.115.50.160  ~  140.115.50.191 
          netmask = 255.255.255.224 
          broadcast = 140.115.50.191 
          network address = 140.115.50.160 
 
---------------------------------------------------------------------------- 
 
如何设定 Router 的网路位址 
 
决定好 Subnet 的 IP address 後,接下来就是 Config eth0 和 eth1 这两个 
网路介面,於 /etc/rc.d/rc,inet1 中加入 
 
 ifconfig eth0 140.115.50.67 netmask 255.255.0.0 broadcast 140.115.255.255 
 
 ifconfig eth1 140.115.50.161 netmask 255.255.255.224 broadcast 140.115.50.191 
 
後,再执行 rc.inet1 或重新开机.可以利用 ifconfig 指令来检查设定是否正确, 
以下就是 Router 值行 ifconfig 的输出: 
 
lo        Link encap:Local Loopback 
          inet addr:127.0.0.1  Bcast:127.255.255.255  Mask:255.0.0.0 
          UP BROADCAST LOOPBACK RUNNING  MTU:2000  Metric:1 
          RX packets:0 errors:0 dropped:0 overruns:0 
          TX packets:24 errors:0 dropped:0 overruns:0 
 
eth0      Link encap:10Mbps Ethernet  HWaddr  04:00:23:53:90:21 
          inet addr:140.115.50.67  Bcast:140.115.255.255  Mask:255.255.0.0 
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1 
          RX packets:107061 errors:0 dropped:0 overruns:0 
          TX packets:22060 errors:0 dropped:0 overruns:0 
          Interrupt:5 Base address:0x290 Memory:d0000-d4000 
 
eth1      Link encap:10Mbps Ethernet  HWaddr 12:30:51:47:23:85 
          inet addr:140.115.50.161 Bcast:140.115.50.191 Mask:255.255.255.224 
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1 
          RX packets:107061 errors:0 dropped:0 overruns:0 
          TX packets:22060 errors:0 dropped:0 overruns:0 
          Interrupt:6 Base address:0x350 Memory:d8000-db000 
 
---------------------------------------------------------------------------- 
 
如何设定 Router 的 Kernel Routing table 
 
网路位址设定好後,接下来就是要设定 Kernel Routing table,当 Router 收到一个 
Packet 时,会依照 Packet 中的目的位址去 Kernel Routing table 比对,而决定该往 
那一个网路介面送,所以 Kernel Routing table设错了,Packet 就无法由正确的网路介 
面送到目的地. 
 
Kernel Routing table  的设定亦加入於 /etc/rc.d/rc.inet1 
 
     route   add   -net 140.115.0.0    netmask 255.255.0.0   eth0 
 
     route   add   -net 140.115.50.160   netmask 255.255.255.224   eth1 
 
     route   add   default  gw 140.115.1.254   metric 1 
                   ^^^^^^^^^^^^^^^^^^^^^^^^^ 
                   此为通往校外的 Gateway 
 
後,再执行 rc.inet1 或重新开机,可以利用 route 指令来检查设定是否正确,以下就是 
Router 值行 route 的输出: 
 
Destination     Gateway         Genmask         Flags MSS    Window Use Iface 
140.115.50.160  *               255.255.255.224 U     1436   0      234 eth1 
140.115.0.0     *               255.255.0.0     U     1436   0    29125 eth0 
127.0.0.0       *               255.0.0.0       U     1936   0       34 lo 
default         140.115.1.254   *               UG    1436   0       79 eth0 
 
---------------------------------------------------------------------------- 
 
如何设定 Subnet 中机器的网路位址与 Kernel Routing table 
 
Subnet 中的机器其设定方法较 Router 简单.其只有一张网路卡,即 eth0,所以在 
机器 ds170 的 /etc/rc.d/rc.inet1 中加入 
 
 ifconfig eth0 140.115.50.170 netmask 255.255.255.224 broadcast 140.115.50.191 
 
 route add -net 140.115.50.160 netmask 255.255.255.224 eth0 
 
 route add default gw 140.115.50.161 metric 1 
           ^^^^^^^^^^^^^^^^^^^^^^^^^^ 
           此我们将 Gateway 设为 Router 的 eth1 IP address 
 
---------------------------------------------------------------------------- 
 
设定 Proxy ARP 来连通 Subnet 
 
以上设定完成後,你就可以由 Router 连上 ds170,亦可以由 ds170 联上 Router, 但是 
若要由 ds170 直接连到外面 Class B net 上之机器,如 dslab,则无法直接连通, 因为 
ds170 直接将 package(注意是资料不是ARP) 送到 router(可由 static routing 
table 中决定),router 再帮你在 class B network 中送 ARP,所以 dslab 会听到此 
ARP ,但当 dslab 要将 ARP 送回来时,由於 router 或 gateway 会将 broadcast 和 
multicast 的 package 挡下来,而不会forwarding,所以说 dslab 回应的 ARP 无法让 
ds170 所收到 ,於是我们需在 Router上设定 Proxy ARP,其功能就是代 subnet 中的机 
器回应 class B 中机器所 broadcast 的 ARP,让 class B 中要送往 subnet 的 
package 先送到 router, 之後 router 再帮其送往 subnet 中的机器. 
 
所以应该在 Router 的 /etc/rc.d/rc.inet1 中加入 
 
      arp   -s   140.115.50.170   04:00:23:53:90:21   pub 
                                  ^^^^^^^^^^^^^^^^^ 
                                此为 Router eth0 介面的 hardware address 
 
---------------------------------------------------------------------------- 
 
Good Luck ! 
 
如果您有任何意见或指教,可以直接写信给我. 

BBS水木清华站∶精华区