鸟哥的 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:重新编辑文章,并增加重点回顾与课后练习

2002/08/08 以来统计人数


Designed by VBird during 2001-2004.  Aerosol Lab.