鸟哥的 Linux 私房菜 -- Routers and IP aliases

since2012/04/23

     
 
多 IP 与 Router 的架设
本文已不再维护,更新文章请参考此处
最近更新日期:2003/08/22
我们在 网络基础 里面提到 路由 (route) 是一个重要的概念,他可以控制我们的资料封包的走向!此外,如果同一个网域里面有太多的计算机数量需要来广播的话,效能一定不会太好,所以才会有 Netmask 对吧!今天我们换个角度来想一想,如果说我的网域内真的有太多的计算机数量了,那么将整个网域切割成较小的数个子域 (Subnet) 会是一个比较好的作法,不过,因为网域与网域之间的封包不可以直接互通数据,所以这个时候我们就需要使用 Router ( 路由器 ) 来帮忙封包的传送了!

大标题的图示多个 IP 在一块网络卡上面:
    在开始介绍 Router 之前,我们先就一个实体网络卡进行多个 IP 的设定来作为介绍,然后再实际来说明 Router 的架设吧!
     

    为何需要多 IP ?
     
    好好一块网络卡,为何需要多个 IP 呢?难道是鸟哥没事找事作?!嘿嘿!我又不是闲的发慌,干嘛没事找事作呢?!其实多个 IP 某些时候是有其必要性的啦!在什么时候『可能』会用的上呢?这样说好了现在您的局域网络当中,由于有些朋友一开始设定错误,结果一个 Hub 却接了两个网域,分别是192.168.1.xx 及 192.168.0.xx ,但是您的朋友们却又都不想改变他们的网络设定,这个时候怎么办?『因为不同的网域之间的数据封包不能直接互相沟通』这个概念还没忘记吧?!所以 192.168.1.xx 及 192.168.0.xx 就不能直接沟通数据啰!因此,您如果要与 192.168.1.xx 沟通,您的 IP 就必须设定在该网域内,但这个时候另一个网域 192.168.0.xx 的数据却又无法沟通了!所以您就必须要常常变更 IP 啰!那您又不想常常变更您的 IP ,呵呵!这个时候多个 IP 就派上用场啦!您可以在一块网络卡上面同时设定 192.168.0.xx 及 192.168.1.xx 的 IP ,如此则您的系统可同时接受来自这两个不同网域的资料!嘿!还不错吧!
     
    除此之外,其实还有很多的用的到多个 IP 的地方啦!例如 Router 的设定,有时后也会使用的到的!另外,在测试系统的时候,也常常会使用到多 IP 的设定!基本上,多 IP 的用途还不少就是了!
     

    如何实作?
     
    其实多个 IP 在一块网络卡上面的设定很简单啦!就只要记得一个概念就够了,那就是网络界面卡( Network Interface Card, NIC )与网络界面( Interface )不一样的东西!一个是实体界面,一个则是联机后所产生的界面,两者并不相同但是 Interface 必需要架构在 NIC 或实际的网络媒介 (如调制解调器) 之上才行!好了!我们来谈一谈实际面吧!
     
    如果您还记得 Linux 底下的硬件装置都是以档案来代表的话,那么就应该知道 Linux 第一块网络卡的代号为 eth0 吧?!OK!那么在这个网络卡上面的第一个虚拟界面( Interface )的代号是什么呢?那就是 eth0:0 啰!第二个虚拟界面则为 eth0:1 .....以此类推!而要启动 eth0:0 时, eth0 务必要被启动,当关闭 eth0 时,其所有相关的 eth0:n ( n 是数字,0, 1....)将会全部被关闭!这就是刚刚上面提到的『虚拟界面是架构在实体界面之上』的意思!嗯!由于设定的方式主要又可以分为直接以『 command line 』手动启动,也可以使用『 装置配置文件案 』来设定!我们分别说明如下啰!
     

      command line 手动设定多个 IP :
       
      Linux 网络常用指令篇 里面我们曾经提到 ifconfig 可以用来达成多个 IP 的设定功能!他的主要设定语法与范例为:
      [root@test root]# ifconfig <device> <ip> netmask <nip> broadcast <bip> <action>
      参数说明:
      <device>  :装置代号,例如 eth0, eth0:0, eth0:1....
      <ip>    :该装置代号的 IP !
      netmask   :该装置代号的子域屏蔽设定参数名称
      <nip>    :就是实际的 netmask ,例如 C Class 则为 255.255.255.0
      boradcast  :广播地址设定参数
      <bip>    :亦即实际的广播地址
      <action>   :动作!例如 up 启动与 down 关闭!
      范例:
       
      # 1. 修改一个 eth0 的 netmask ,由原先的 255.255.255.0 变成 255.255.255.128
      [root@test root]# ifconfig eth0
      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:5972569 errors:0 dropped:0 overruns:0 frame:0
                TX packets:6263943 errors:0 dropped:0 overruns:0 carrier:0
                collisions:1331 txqueuelen:100
                RX bytes:557413197 (531.5 Mb)  TX bytes:2810197942 (2680.0 Mb)
                Interrupt:10 Base address:0x6100
      [root@test root]# ifconfig eth0 netmask 255.255.255.128
      [root@test root]# ifconfig eth0
      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.128<=修改后
                UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
                RX packets:5972745 errors:0 dropped:0 overruns:0 frame:0
                TX packets:6264165 errors:0 dropped:0 overruns:0 carrier:0
                collisions:1331 txqueuelen:100
                RX bytes:557431640 (531.6 Mb)  TX bytes:2810221471 (2680.0 Mb)
                Interrupt:10 Base address:0x6100
      [root @test /root]# ifconfig eth0 netmask 255.255.255.0<==测试完后记得改回来!
       
      2. 新增一个网络界面 eth0:0 ,而且他的 IP 为 192.168.0.2
      [root@test root]# ifconfig eth0:0 192.168.0.2 netmask 255.255.255.0 \
      > broadcast 192.168.0.255 up
      [root@test root]# 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:5973506 errors:0 dropped:0 overruns:0 frame:0
                TX packets:6265264 errors:0 dropped:0 overruns:0 carrier:0
                collisions:1331 txqueuelen:100
                RX bytes:557511152 (531.6 Mb)  TX bytes:2810327518 (2680.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
      看!很简单吧!您的虚拟界面就已经作出来了!目前您的 eth0 这块网络卡上面就有 192.168.1.2 及 192.168.0.2 这两个界面存在了!此外,这两个联机界面是使用同一个实体界面卡!信不信?看一下上面 HWaddr 的部分, eth0 与 eth0:0 都是使用同一组 MAC 呢!还记得吗?每一个网络卡都有一个『独一无二』的硬件地址,那个就是 MAC 亦是上面显示的 HWaddr 的部分!既然都是使用同一个 HWaddr ,当然就是指两个联机界面使用的是同一个实体界面啰!
       
      不相信的话就来测试一下吧!
      [root@test root]# ping -c 3 192.168.1.2; ping -c 3 192.168.0.2
      PING 192.168.1.2 (192.168.1.2) from 192.168.1.2 : 56(84) bytes of data.
      64 bytes from 192.168.1.2: icmp_seq=0 ttl=255 time=482 usec
      64 bytes from 192.168.1.2: icmp_seq=1 ttl=255 time=188 usec
      64 bytes from 192.168.1.2: icmp_seq=2 ttl=255 time=196 usec

      --- 192.168.1.2 ping statistics ---
      3 packets transmitted, 3 packets received, 0% packet loss
      round-trip min/avg/max/mdev = 0.188/0.288/0.482/0.138 ms
      PING 192.168.0.2 (192.168.0.2) from 192.168.0.2 : 56(84) bytes of data.
      64 bytes from 192.168.0.2: icmp_seq=0 ttl=255 time=289 usec
      64 bytes from 192.168.0.2: icmp_seq=1 ttl=255 time=213 usec
      64 bytes from 192.168.0.2: icmp_seq=2 ttl=255 time=203 usec

      --- 192.168.0.2 ping statistics ---
      3 packets transmitted, 3 packets received, 0% packet loss
      round-trip min/avg/max/mdev = 0.203/0.235/0.289/0.038 ms
       
      3. 关掉 eth0:0 这个界面
      [root@test root]# ifconfig eth0:0 down

      嘿嘿嘿嘿!如此一来,您这块网络卡上面就已经有两个界面啦!分别是 192.168.0.2 及 192.168.1.2 !很简单吧!不过,这样还是有点问题,那就是每次开机您都得在手动的输入一次( 除非写到 /etc/rc.d/rc.local 这个档案当中 ),好了!底下我们就介绍一下如何以装置设定的方式来设定多个 IP 的方法吧!
       

      装置配置文件设定多个 IP:
       
      这个东西也不难!还记得我们在 连上 Internet 一文当中,曾经提到网络卡的参数配置文件吧!没错!那就是 /etc/sysconfig/network-scripts/ifcfg-eth0 啰!好了!那么我们目前是以装置 eth0:0 做为装置代号,自然文件名就需要改一改啦!所以您可以这样做一次,来达成与上面 command line 的设定相同的状况!
      [root@test root]# cd /etc/sysconfig/network-scripts
      [root@test network-scripts]# cp ifcfg-eth0 ifcfg-eth0:0   
      请注意,那个 ifcfg 的檔名是必要的,而 eth0:0 则是装置代号!所以请依您的需求来配置文件名!例如您要设定 eth0:1 ,则档名应该写为 ifcfg-eth0:1 才对呦!
       
      1. 开始设定参数档!
      [root@test network-scripts]# vi ifcfg-eth0:0
      # This file is just to be used to test the more IPs
      DEVICE=eth0:0      <==这里请跟刚刚档名的地方写的一样!亦即为装置代号!
      ONBOOT=no        <==是否开机时启动!由于与实体接口有关,所以,无论
                    这里设定为何,开机只要启动 eth0 ,则这里就会被启动!
      BOOTPROTO=static     <==使用的开机设定协议
      IPADDR=192.168.0.2    <==我设定的 IP!
      NETMASK=255.255.255.0  <==就是子域屏蔽
      NETWORK=192.168.0.0   <==就是网域
      BROADCAST=192.168.0.255 <==就是广播地址啦!
       
      2. 正确的启动!
      [root@test network-scripts]# ifup eth0:0
      [root@test network-scripts]# ifconfig eth0:0
      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
       
      3. 正确的关闭!
      [root@test network-scripts]# ifdown eth0:0
      很简单吧!这样就可以达到您的多个 IP 在同一块网络卡上面的目标啰!
       

    需要注意的地方:
     
    一般而言,鸟哥个人是比较偏向于『使用参数配置文件案的方式』来进行我的多个 IP 的设定!这样有很多好处啦!包括我可以在 ifcfg-eth0:0 这个档案里头,先以 # 批注符号后面来说明一下当初我为何要建置这个档案,以及可以使用档案的型态来了解一下我的配置文件,再来,由于所有的网络卡参数档案都在这个目录下『 /etc/sysconfig/network-scripts』,所以我可以很轻易的就找到相关的配置文件啰!所以,比较推荐这个方式!不过,以一张网络卡设定多个 IP 仍有需要特别留意的地方:
     
    • 由于 eth0:n 是依附在 eth0 这个接口上面的,所以开机的时候,不论 eth0:n 里面设定 ONBOOT 为何,只要 eth0 设定为 ONBOOT=yes,那么开机之后,所有与 eth0 相关的接口都会被启动起来,另外, eth0:n 不能单独的被启动, eth0 一定要先启动才行!

    •  
    • 既然可以设定多个 IP ,那么流量是否可以增加?!答案是『否』,因为控制带宽的是硬件,您的网络卡就是那一块,当然无法增加流量了。所以一张卡设定多 IP 时,那些 IP 就不要在同一个网域内了!

大标题的图示路由器 Router:

    什么是 Router ?
     
    还记得我们在 网络基础 里面提过的几个东西吗?『不同网域的数据流,必需要透过 Router 来转译彼此』,也就是说,我们必需要藉由 router 来沟通不同的网域之间的数据啦!通常我们发现 router 的地方,都是在不同的网域之间相互连通的节点上面,好了,那么我们也晓得 Router 是一个『很贵的机器』,呵呵!那么 Linux 可以做成 router 吗?嘿嘿!很好!他可以!
     
    注:路由器与 IP 分享器(或者是 Linux 上面架设 Network Address Translation, NAT )是不太一样的两个咚咚,我们先不谈很高贵的 Router 功能(因为功能太多了!可以转译的数据很吓人,这里我们不谈这些!),单纯的 Router 功能只是在沟通 Router 上面的两个以上接口的数据传输,所以在不同网域的数据传输时,就需要透过 Router 了。不过,这里特别再强调一下,公共 IP 与 私有 IP 是无法直接沟通的,所以万一您的两个界面分别是 Public IP与 Private IP 时,那么简易的 Router 就无法将这两个接口的数据作沟通了!因为是两种不一样的 IP 嘛!这个时候就需要在 Router 上面启用 NAT 功能了。NAT 技术可以将来自 Private IP 的数据封包中,将来源 ( 当然也可以修改目的 ) IP 修改成为 NAT 主机本身的 Public IP 来进行对 Internet 的传送!所以, NAT 主机同时也是 Router ,此外,因为他具有将数据封包伪装的功能,所以可以透过 NAT 主机来让内部的 Private IP 伪装后,来与 Internet 的 Public IP 来沟通!更多关于 NAT 的技术我们在后续的章节会再提及!
     

    为何需要 Router ?
     
    既然 Router 的作用是连通不同的网域,那么我的公司所有的计算机只要都在同一个网域之内,那不就得了!根本就用不着 Router 嘛!不过,不要忘记了我们在 网络基础里面曾将向大家提过的『封包碰撞』与『节点的最大传输量』限制!举个例子来说好了:
     
    • 当您的公司成长到需要 200 部计算机好了,这个时候假如您还是将所有的 200 部计算机都给他在同一个网域之内,那么当一部计算机要将数据丢出来的时候,嘿嘿!所有的网络卡将会停顿一下等他的物理广播!这会造成相当大的网络负荷!此外,在 Hub 里头,所有的资料都在里头流窜,您会发现您的资料很容易有破损而无法联机的情况!这会造成内部网络的极大负荷....
     
    • 那或许您会说:『如果 Hub 不行,那么我将他换成 Switch 总可以了吧! Switch 不是可以将封包碰撞的机率降至最低吗?』是的!您说的没错!但是很不幸的,您买的 Switch 应该是 10/100Mbps 的吧!果然如此的话,那么您的 Switch 最大的实时传输量为 12.5 MBytes 左右,如果平均分配给您的 200 部计算机的话,那么每一部的带宽是多少?答案是 60 KBytes 左右!嘿!在局域网络内的计算机流量怎么会这么慢?!尤其当一个人死命的捉某部计算机的数据的时候,那就惨咯!其他人的平均带宽将会降的更低!
     
    这个时候或许 Router 的功能就可以显现出来啰!怎么说呢?因为不同的网域之间不能直接进行数据的沟通,所以您必需要将网域分别开来,而假设以 200 部计算机平均分为 5 个网域好了,这个时候一个网域里面只有 40 部计算机,在这个情况之下,不但布线容易( 针对 40 部计算机来说 ),而且由于不同网域之间不会互相干扰,所以您的物理广播或逻辑广播时产生的网络停顿情况将会减少非常的多!如此一来,对于您内部局域网络的网络流量舒缓,将有相当大的帮助!『请特别留意,通常比较大的局域网络( 指计算机数量较多的企业 ),如果规划不良,则您对外联机的时候,最大的速度瓶颈可能来自于内部网域!这是因为内部网络的 loading 比起外部网络要『慢的很多!』因为内部网络互连的状况( 例如网络芳邻的资源共享、打印机的分享、文件服务器的分享等等 )就会导致您的 Switch/Hub 的带宽被占用光了!
     
    一般不想要管事的网管人员,最喜欢直接将布线设计成类似底下的模样:
     

     
    这样做最大的好处就是『简单』,您只要控管一个 服务器 就够了!其他的完全不用去理他,管他什么封包碰撞,反正您内部网络的 loading 太大也没有关系,对于懒惰的网管人员来说,他根本就不痛不痒....这个时候您的内部网络的流量可能真的会负荷很大啦!此时,相当的建议设定成类似底下的模样!
     
     
    这样有个好处啦!您的服务器上面有两块网络卡(或者说是两个不同网域的接口, Interface ),分别负责不同的网域,那么由于这两个网域之间分隔开来了,因此封包进行广播时的停顿现象、封包碰撞与 Hub/Switch 流量限制的情况就会比较舒缓一些!而两个不同的网域之间的数据分享呢?嘿嘿!则可以透过服务器架设的 Router 功能来达成呀!这样您可以了解为何需要设定成这个模样了吧?!
     

    观察与修改路由:
     
    其实就如同前面说的, Router 的最大用途就是将不同网域的数据互相流通,而要沟通这些数据,必然就需要有所谓的『路由, route』这个东西了!以我的情况为例,我是以 ADSL 拨接上 Internet 的,但是我有个内部网域,192.168.1.0/24 这一个内部网域存在,所以在我的 Linux 底下输入 route 时,会得到如下的结果:
    [root@test root]# 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
    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
    上面显示什么意义呢?简单的说,就是:
     
    1. 当我有一个封包要送到 192.168.1.0/24 这个网域时,我的输出接口为 eth0 这个界面;
    2. 当我有封包要送到 127.0.0.0/8 ( A Class ) 时,我的输出接口为 lo 这个界面;
    3. 当我有数据要送到 140.116.142.253 时,由于他是 p-p-p 的协议,所以是单点对单点,而界面为 ppp0 这个;
    4. 至于其他没有规定到的所有网域,则统一由 default 这个 Gateway 140.116.142.253 ,界面为 ppp0 丢出去!由于 ppp0 传送到的这个 140.116.142.253 是 ISP 的接口,该接口通常为 Router ,所以他会自动的将您的封包再往前面送,使之最后可以到达目的地
     
    这样了解了吗?那个 default 里头的 Gateway 可能取得的方法很多,例如拨接后来自 ISP 的参数、在 /etc/sysconfig/network-sysconfig/ifcfg-ethn 这个档案里面的设定参数,以 Cable Modem 连接 ISP 后所取得的网络参数等等。OK!那么假设您的网域当中还有另外一个不同的网域,假设为 192.168.0.0/24 好了,而这个网域同样的是接在 eth0 这个网卡上面,所以您要您的 eth0 同时还负责 192.168.0.0/24 这个网域时,可以这样做!
    [root@test root]# route add -net 192.168.0.0 netmask 255.255.255.0 dev eth0
    [root@test root]# 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
    [root@test root]# route del -net 192.168.0.0 netmask 255.255.255.0 dev eth0
    这样就增加啰!不过,这个时候或许您可以连上人家的机器,但是人家却无法连接到您的机器!因为您的网络并没有 192.168.0.0/24 里面的任何一个 IP ,所以别人的计算机自然无法与您进行数据的交流!这个时候就必须要启动 Routing 的功能啦!如何启动呢?继续看下去吧! ^_^""
    注:请特别留意,当您使用 route 来秀出目前的路由表时,如果显示的讯息非常的缓慢,不要怀疑!一定有地方设定错误。请依照 route 所显示的讯息来修改您的网络参数!通常最容易发生 route 问题的地方在于 gateway 的设定啦!或者是重复启动多次的虚拟接口时,也会有这样的情况,例如我曾经看过在 route table 上面出现同一个路由状态共三次以上!例如上面 192.168.0.0 .... 那一行,若在 route table 上面竟然重复出现三次!这肯定有问题呀!!处理的方法为:
     
    1. 将该相关的网络接口关闭!使用 ifdown 来关掉;
    2. 使用 route 的功能,将该路由删除!
    3. 修改相关的接口,将接口符合我们的需求!
    4. 重新启动接口,并持续观察 route !

大标题的图示一个 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,那就会失去区隔效用。

大标题的图示重点回顾:
  • 网络卡的代号为 eth0, eth1, eth2...,而第一张网络卡的第一个虚拟接口为 eth0:0 ....。
  • 可以直接使用 ifconfig 来设定网络参数,也可以使用编辑档案,档案在 /etc/sysconfig/network-scripts/ifcfg-ethn[:m],其中 n 与 m 为数字;
  • Linux 要作为 Router 时,务必启动 ip_forward;
  • Router 上面应该具有两个以上的网络接口,以沟通不同的网域封包数据;
  • 使用 route 指令来设定 Router 的路由表。
  • 事实上,Router 除了作为路由转换之外,在 Router 上面架设防火墙,亦可在企业内部再分隔出多个需要安全 (Security) 的单位数据的区隔!

大标题的图示课后练习
  • 请问您如何将您的 eth0 这个接口修改成为 192.168.100.2 在网域 192.168.100.0/25 之内的网络参数内容?
  • 请手动设定 eth0:1 这个虚拟接口,使成为网络参数: 192.168.200.2, 网域在 192.168.200.0/24。
  • 如何观察路由表?
  • 如何启动 Linux 的 IP Forward 功能?
  • 假设您是一个学校单位的信息管理员,学校内有 200 部计算机,奉上面大头的旨意,必须要将 200 部计算机分为 4 个 Subnet ,请问您应该如何布线(请画出示意图)?而这 4 个 Subnet 的网络参数如何选择(请自行选择)?而是否需要 Router ?如果需要的话,假设每个 Router 仅能有两个网络实体接口,那么该如何布线?(注:不要使用虚拟接口)
  • 万一您的网络有点停顿,发现可能是网络上某个节点出现问题,您应该如何确认是哪一部 Router 出问题?

  • 前往参考用解答
IP Router 的架设

2002/08/09:第一次完成日期!
2003/08/22:重新编辑文章,并增加重点回顾与课后练习
 
     
http://linux.vbird.org is designed by VBird during 2001-2011. ksu.edu 

本网页主要以Firefox配合解析度 1024x768 作为设计依据     鸟哥自由软件整合应用研究室