CSDN博客

img hem

Linux做一个功能完备的路由器 一

发表于2001/6/11 17:53:00  1403人阅读

Linux做一个功能完备的路由器 一

LinuxAid.com.cn wing

返回〗〖转发〗

大家全当看着玩吧 
    本文主要介绍如何用Linux做一个功能完备的路由器,这里将主要介绍静态路由器和动态路由器的配置,但不包括IP伪装或者说公用一个IP地址访问外面网络等问题。其已经不属于本主题讨论的范围,请参考其他如防火墙的配置等的内容。  

    LRP(Linux Router Project)已经成立了有好几年的时间了。这个计划的目的是利用Linux操作系统将老旧的个人电脑如486当成网络的路由器使用。利用Linux低成本建立的路由器可能引起企业界广泛的注意。正如StoneFly Technology的系统整合工程师Bret Berger所说的,对无法负担两千(美元)思科(Cisco)路由器的使用者来说,利用486加上几张以太网卡,当成路由器使用,是另一个选择。而对于一些小型企业、小型ISP ,甚至是政府机构,这是一个很好的解决方案。事实上目前国内高校很多场合正是利用了这一解决方案。  

    由于LRP计划已经把Linux的源代码精简化,LRP软件可以少于2MB ,同时也可以将LRP软件放入一张软盘内。也就是说在没有硬盘的情况下,LPR也可以利用软盘,载入电脑中使用。Virtual Design Group的软件工程师Michael Kornegay则表示,他们已经将Linux路由器软件安装在一架老旧的x86个人电脑上,再加上两张以太网卡,没有使用硬盘的设备,只是使用软盘启动,便当成阳春型的路由器与防火墙使用。  

    我们在这一章里不是教大家如何制作小于2MB的LRP软件包,而是告诉大家如何利用Linux来获得一个性能良好、价格低廉的路由器。利用Linux构建路由器使用的成本虽然便宜,可是在性能与效率上与真正的路由器相比,却还是有一段距离。对于玩家们或是一些要求不高的使用者来说,这是一个不错的选择。  

什么是路由器?  

    简单的说:路由器的功能就是寻路――给IP包寻找正确的路径以通往目的地。下面是比较详细的介绍:  

原理与作用  

    路由器(Router)用于连接多个逻辑上分开的网络,所谓逻辑网络是代表一个单独的网络或者一个子网。当数据从一个子网传输到另一个子网时,可通过路由器来完成。因此,路由器具有判断网络地址和选择路径的功能,它能在多网络互联环境中,建立灵活的连接,可用完全不同的数据分组和介质访问方法连接各种子网,路由器只接受源站或其他路由器的信息,属网络层的一种互联设备。它不关心各子网使用的硬件设备,但要求运行与网络层协议相一致的软件。  

    一般说来,异种网络互联与多个子网互联都应采用路由器来完成。 路由器的主要工作就是为经过路由器的每个数据帧寻找一条最佳传输路径,并将该数据有效地传送到目的站点。由此可见,选择最佳路径的策略即路由算法是路由器的关键所在。为了完成这项工作,在路由器中保存着各种传输路径的相关数据--路径表(RoutingTable),供路由选择时使用。路径表中保存着子网的标志信息、网上路由器的个数和下一个路由器的名字等内容。路径表可以是由系统管理员固定设置好的,也可以由系统动态修改,可以由路由器自动调整,也可以由主机控制。  

静态路径表  

    由系统管理员事先设置好固定的路径表称之为静态(static)路径表,一般是在系统安装时就根据网络的配置情况预先设定的,当网络结构的改变时需管理员手工改动相应的表项。    

动态路径表  

    动态(Dynamic)路径表是路由器根据网络系统的运行情况而自动调整的路径表。路由器根据路由选择协议(RoutingProtocol)提供的功能,自动学习和记忆网络运行情况,在需要时自动计算数据传输的最佳路径。  

路由器的功能  

    (1) 协议转换:能对网络层及其以下各层的协议进行转换。  
    (2) 路由选择:当分组从互联的网络到达路由器时,路由器能根据分组的目的地址按某种路由策略,选择最佳路由,将分组转发出去,并能随网络拓扑的变化,自动调整路由表。  
    (3) 能支持多种协议的路由选择:路由器与协议有关,不同的路由器有不同的路由器协议,支持不同的网络层协议。如果互联的局域网采用了两种不同的协议,例如,一种是TCP/IP协议,另一种是SPX/IPX协议(即Netware的传输层/网络层协议),由于这两种协议有许多不同之处,分布在互联网中的TCP/IP(或SPX/IPX)主机上,只能通过TCP/IP(或SPX/IPX)路由器与其他互联网中的TCP/IP(或SPX/IPX)主机通信,但不能与同一局域网中的SPX/IP(或TCP/IP)主机通信。多协议路由器能支持多种协议,如IP,IPX及X.25协议,能为不同类型的协议建立和维护不同的路由表。这样不仅能连接同一类型的网络,还能用它连接不同类型的网络。这种功能虽然使路由器的适应性变强,但同时也使得路由器的整体性能降低,现在IP协议在网络中越来越占主导地位,因此在下一代路由器(如交换式路由器)只需要支持IP协议。  
    (4) 流量控制:路由器不仅具有缓冲区,而且还能控制收发双方数据流量,使两者更加匹配。  
    (5) 分段和组装功能:当多个网络通过路由器互联时,各网络传输的数据分组的大小可能不相同,这就需要路由器对分组进行分段或组装。即路由器能将接收的大分组分段并封装成小分组后转发,或将接收的小分组组装成大分组后转发。如果路由器没有分段组装功能,那么整个互联网就只能按照所允许的某个最短分组进行传输,大大降低了其他网络的效能。  
    (6) 网络管理功能:路由器是连接多种网络的汇集点,网间分组都要通过它,在这里对网络中的分组、设备进行监视和管理是比较方便的。因此,高档路由器都配置了网络管理功能,以便提高网络的运行效率、可靠性和可维护行。  

    一个路由器必然有大于或者等于2的网络接口,这样它才存在路由的功能,否则,如果只有一个接口的话,也就无所谓"寻路"了!这里说的网络接口不一定是物理上的接口,例如网卡或其他,也可以是虚拟的接口,例如隧道入口等。  

    如前面所描述的,一个路由器上运行的路由信息可以是静态配置的,也可以是动态产生。前者通过手工配置完成、而后者则通过在路由器上运行跑相关路由协议的程序来根据网络状态动态改变内核中的路由表。下面我们仔细介绍一些这两类路由器的配置。通常,一个路由器既有静态配置的部分,又有动态配置的部分,二者结合起来。  

多网卡的设置  

静态路由器的配置  

    Linux下最常用的指定路由规则的命令是route,当然也有些图形化的工具可以使用,我们下面一个一个介绍。  

route命令的使用  

    route工具主要功能是管理Linux系统内核中的路由表。它最大的用途就是用来设定静态的路由表项,通常是在系统用ifconfig配置网络接口(例如网卡等)后,用它来设定主机或者一网段的IP地址应该通过什么接口发送等。  

Route工具有复杂的调用参数。  
调用格式如下:  

route [-CFvnee]  

route [-v] [-A family] add [-net|-host] target [netmask  
Nm] [gw Gw] [metric N] [mss M] [window W] [irtt I]  
[reject] [mod] [dyn] [reinstate] [[dev] If]  

route [-v] [-A family] del [-net|-host] target [gw Gw]  
[netmask Nm] [metric N] [[dev] If]  

route [-V] [--version] [-h] [--help]  

主要参数说明如下:  

    -v 使用冗余输出模式。  
    -A family   指定特定的地址族(例如"inet"、"inet6")。  
    -n 使用数字显示的地址(例如,202.38.75.75)而不是去解释域名。  
    -e 使用与netstat相同的输出格式。  
    -ee 参数会产生很长的输出,包括内核路由表的几乎所有信息。  
    -net 目标(target)是一个网段。  
    -host 目标(target)是一个单独的主机。  
    -F 显示内核FIB路由表。结果可能被-e 和-ee参数改变。  
    -C 显示内核中路由缓存信息。  
    del 删除一个路由表项。  
    add 增加一个路由表项。  
    target 配置的目的网段或者主机。可以是IP,或者是网络或主机名。  
    netmask Nm   用来指明要添加的路由表项的网络掩码。  
    gw Gw 任何通往目的(target )的IP分组都要通过这个网关。  
    metric M  设置路由表中该项的尺度域(metric field)为M。  
    mss M 设置TCP的最大分片长度(MSS)M bytes。  系统缺省值是536。  
    window W  设置TCP发送窗口的尺寸为W bytes。  
    irtt I 设置TCP的初始化回路时间(irtt)I毫秒(1-12000)。缺省情况下按照RFC 1122 规定是300ms。  
    reject 安装一个阻塞型的路由,这样可能会有路由查找失败。  
    mod, dyn, reinstate  添加或者修改一个动态路由表项。主要用来测试和诊断。  
    dev If 强行使用某个特定的输出接口(If),而不用系统去寻找接口。  

下面举几个配置的例子:  

    route add -net 192.56.76.0 netmask 255.255.255.0 dev eth0  
    添加一条路由表项,网段192.56.76.x 应该从接口"eth0"走。  

    route add default gw mango-gw  
    添加一条缺省路由(如果没有其他匹配的路由项,就使用这个路由规则)。"mango-gw"是一个主机名, 而通往这个主机的路由规则应该事先已经设置好了。  

    route add ipx4 sl0  
    给主机"ipx4"添加一条路由规则,使用SLIP接口sl0。  

Route命令的输出结果  
输出的格式有以下几栏:  

    Destination  目标网段或者主机。  
    Gateway  网关地址,如果没有设置,则是"*"表示。  
    Genmask  网络掩码。  
    Flags 一些可能的标记如下:  
     U (路由是活动的)  
     H (目标是一个主机)  
     G (使用网关(gateway))  
     R (reinstate route 动态路由产生的表项)  
     D (dynamically installed by daemon or redirect)  
     M (modified from routing daemon or rederict)  
     ! (reject route)  
    Metric 路由距离。  
    Ref 路由项引用次数。(linux内核中没有使用)  
    Use 查找路由项的次数。.  
    Iface 该路由表项对应的输出接口。  
    MSS 缺省的TCP最大分片尺寸。  
    Window 缺省的TCP窗口的尺寸。  
    irtt 缺省的TCP回路时间。  
    HH (cached only)  
    ARP入口的数目。  
    Arp (cached only)  该路由项对应的物理地址是否过期等信息。  

下面是route -n的输出实例:  

tarn:~$ /sbin/route -n  
Kernel IP routing table  
Destination Gateway Genmask Flags Metric Ref Use Iface  
202.38.64.3 202.38.75.62 255.255.255.255 UGH 0 0 0 eth0  
202.38.75.75 0.0.0.0 255.255.255.255 UH 0 0 0 eth2  
202.38.75.0 0.0.0.0 255.255.255.128 U 0 0 0 eth0  
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth2  
192.168.75.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1  
159.226.0.0 202.38.75.62 255.255.0.0 UG 0 0 0 eth0  
127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo  
0.0.0.0 202.38.75.62 0.0.0.0 UG 1 0 0 eth0  

    上面的输出中我们可以看出,该路由器配置的缺省网关是202.38.75.62,它上面有3个以太网接口(eth0、eth1和eth2)。其中第一条和第二条路由规则是针对一个主机的,其他的都是针对一个网段的,这可以重掩码看出。  

动态路由器的配置 

基本原理介绍 

先解释一下什么是动态路由。 

    从前面的描述中我们可以看到,路由器的基本功能就是为IP分组寻找到达目的地址的路径。我们前一节介绍的是人工手动静态配置路由规则,也就是人为的设定寻路方式。但是因特网是个庞大的系统,上面跑的网络结构负责,而且拓扑结构也在随时改变,这样在某些复杂的范围里我们的静态配置就不一定能获得最佳的寻路路径了。而且一旦网络结构发生改变,我们手动的静态配置也往往无法及时跟着改变。在这个背景下,产生了动态路由配置的概念,也就是动态路由器。 

    动态路由器上的路由表项是通过相互连接的路由器之间交换彼此信息,然后按照一定的算法优化出来的,而这些路由信息是在一定时间间隙里不断更新,以适应不断变化的网络,以随时获得最优的寻路效果。为了实现IP分组的高效寻路,IETF制定了多种寻路协议。其中用于自治系统(AS:Autonomous System)内部网关协议有开放式最短路径优先(OSPF:Open Shortest Path First)协议和寻路信息协议(RIP:Routing Information Protocol)。所谓自治系统是指在同一实体(如学校、企业或ISP)管理下的主机、路由器及其他网络设备的集合。还有用于自治域系统之间的外部网络路由协议BGP-4等。 

    运行这些路由协议的软件就是我们通常说的路由软件,Linux下常见的路由软件有gated和zebra,。前者既有GPL版本的发行,又有收费的版本;而后者则是日本某组织开发的完全GPL的高效的路由软件。Linux的发行里面一般都缺省就有gated这个软件,我们下面主要介绍它的配置和使用方法。 

路由协议的介绍 

我们这里介绍一下RIP协议。 

    RIP是Routing Information Protocol的缩写,直接翻译就是"路由信息协议"。RIP计算路由时使用了"距离向量(distance vector)"算法,因此,它也被称作"距离向量寻路协议(distance vector routing protocol)。 

    RIP的特点是路由器间定时地交换网络的整体知识,并且只和相邻路由器交换这种知识。换句话说,路由器只和相邻路由器共享网络信息。路由器一旦从相邻路由器获取了新的知识,就将其追加到自己的数据库中,并将该信息传递给所有的相邻的路由器。相邻路由器做同样的操作,经过若干次传递,使自治系统内的所有路由器都能获得完整的路由信息。 

    RIP报文用UDP数据报来传送。为了区别于其他的UDP应用,规定RIPng的公认专用UDP端口号为521。主动寻路更新报文的源/目的的端口都是RIPng端口,应答的更新报文送往发起请求的端口。应当注意,IPv4中RIP使用的端口号是520,与RIPng的有所不同。 

    定时器爱RIP中有着比较重要的作用。在RIP中为支持寻路操作使用了三个不同的定时器。 

    第一个是启动定时进行RIP更新操作的定时器。此定时器通常设置成30秒。在RIP标准中对其进一步加以限制,它要求路由器对更新报文的发送间隔采用随机数,将RIP更新报文的间隔选取在25秒到35秒之间。其目的是为了避免网络上所有的路由器以相同的定时发送更新报文,大量的业务量压迫网络造成冲突。利用随机间隔可均衡业务量,从而减少路由器的冲突。 

    RIP在避免冲突方面还有一点需要注意,在触发更新中不论何时发送了报文,不对30秒定时器复位。如果复位,多个路由器的更新报文的发送间隔就会发生冲突。这是由于所有的路由器在发送触发更新后同时启动定时器造成的。如不对该定时器复位,即使与在数秒前刚广播的触发更新报文的内容完全一样,定时的更新报文也照发不误。 

    RIP使用的第二个定时器时期满(expiration)定时器。路由器只要收到通往特定信宿的路由,就对通往该信宿的期满定时器初始化。期满定时器虽然被设定为180秒,但在稳定的网络中总是每隔30秒被初始化。当网络不稳定时,此定时器的时间区间表示该路由无效。 

    RIP最后一个定时器时垃圾收集(garbage collection)定时器。路由器对无效路由打上尺度为无穷大的无效标记并将垃圾收集定时器置位。此时,定时器在120秒的区间内工作。在该期间内路由器将尺度费用置成无穷大的同时,继续公布该信宿。以这种方法公布路由,相邻路由表就能迅速从寻路表中删除该路由。 

RIP协议也有它的缺陷: 

    网络直径较小 

    RIP将尺度(即费用)无穷大定义为16,这一定义对使用RIP的所有网络的规模作出了严格的限制。因尺度必须是整数,故网络的费用至少为1。在基于RIP的Internet中,所有的系统距其他任何系统不能超过15个网络。这一大小被称作网络直径。 

    这一限制对管理员分配费用的灵活性是一个很大的制约。管理员分配费用最直接的方法是对各个网络的费用都设成1。但是,在这种分配方式下,RIP就会选择费用最小的路径,而不管该路径上的信道容量的大小。因此会舍弃"较长"的高速路径而通过低效的"较短"路径传送数据。为了避免这种情况的发生,管理员可将大于1的费用分配给低效链路,人为地提高其费用。其结果是最大网络直径随之变小,进一步限制了RIP的网络规模。 

    对网络变化的反应较慢 

    RIP网络中的路由器从路由失效到将其识别出来要等待180秒,而在OSPF中典型值是1~2秒。 

    不支持组播 

    在RIP中没有公布组成员信息的方法,因此不支持组播寻路。为实现组播寻路需和其他协议并用。 
 

责任编辑:iamafan(2001-06-11 13:58)
阅读全文
0 0

相关文章推荐

img
取 消
img