(1) 路由器的原理及作用
发布时间:2007.06.27 15:59 来源:赛迪网 作者:lynn
什么是路由器?
简单的说:路由器的功能就是寻路――给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这个软件,我们下面主要介绍它的配置和使用方法。
(2) 深入剖解路由器的“心脏”技术
发布时间:2007.06.27 14:13 来源:赛迪网 作者:sixth
宽带上网已经不是什么新鲜事情,人们对相关的网络器件已经不再陌生,比如说常见的路由器。对于一般的网络用户,他们能知道怎样使用路由器来上网、玩游戏等就已经感到很满足了,
通常情况下对路由器的深层技术很少去过问研究,但做为兴趣广泛的技术爱好者,对这方面的知识是非常感兴趣的。但限于各种条件的制约,这些爱好者都非开发者,很大程度上无法深入了解真正的技术实现过程以及相关的核心内幕。正是基于此点,笔者凭借自身的知识沉淀,尽最大努力为爱好技术的读者架设一坐能通向深层核心的桥梁,为大家揭开路由器的神秘面纱,剖开其核心内脏。为使读者能清晰明白的理解掌握,笔者尽量将专业的技术内容转化为容易接受的知识讲解,其中可能有不足偏颇之处,还请大家多见谅。
概述
什么是路由器?
互联网是依靠路由器连接起来的,路由器是互联网或者说IP网络的核心设备。宽带接入的不断增长,带动了路由器的需求不断增加。
路由器究竟是什么样的技术产物?
谈到路由器的开发,我们就不免要谈到“嵌入式”设备的开发,没错,通俗的说,路由器就是一种嵌入式产品。那么究竟什么是嵌入式设备呢?
其实就目前而言,嵌入式设备已经不断深入我们的日常生活方方面面。通俗的讲,嵌入式设备是指具有计算机功能,但又不称为计算机的设备或器材,它几乎包括了我们周围的所有电器设备:PDA、手机、机顶盒、汽车、微波炉、电梯、安全系统、自动售货机、医疗仪器、立体音响、自动取款机等。
用较为专业的话来表述的话,嵌入式设备就是使用微处理器或微控制器芯片(MCU)加上外围电路再加上内部的程序部分来实现特定功能的嵌入设备。比如8位的单片机、32的ARM以及DSP芯片等都属于嵌入式核心芯片的范畴。8位MCU市场已逐步趋向稳定,32位MPU代表着嵌入式技术的发展方向,正在加速发展。在32位嵌入式微处理器市场上,基于ARM内核的微处理器在市场上处于绝对的领导地位,因此追踪ARM技术的发展趋势显得尤为重要。
路由器的开发通常都是基于32位处理器的,就通常的中低端路由器而言,在开发的配置上有多种选择,比如有ARM9核心芯片+Wince操作系统、ARM7核心芯片+uClinux操作系统、DSP芯片+Vxworks操作系统等等各种各样的选择。本文针对常用的SOHO路由器来介绍,选择ARM7核心芯片+uClinux操作系统开发模式,以完整形象的实例为大家清晰讲解路由器的技术实现过程。
我们为什么以SOHO路由器为介绍对象呢?什么是SOHO路由器?前很多家庭中有不止一台电脑,需要上网获取信息、收发邮件等。这些小型公司和家庭网络用户计算机的数目一般不多,网络结构不复杂。功能和带宽的要求不高。出于提高网络性能、共享有限IP地址或节省上网费用等原因,这些用户迫切需要具有较高性价比的小型路由器。我们把这种小型路由器称为SOHO路由器。目前市场上已经充斥了大量的这类低端路由器.由于ARM7系列芯片价格便宜,非常适合嵌入式系统使用。目前市场上的SOHO路由器大多采用ARM7系列处理器。不过由于技术的发展,ARM9系列的专用路由芯片的路由器也逐渐普及。
路由器宏观介绍
我们可以形象的把嵌入式设备的开发简单的理解成三层模式,最底层的是微控制器芯片加外围器件组成的硬件系统,比如我们介绍的开发小型SOHO路由器所使用的ARM7TDMI芯片等硬件环境,它是设备功能实现的硬件基础,要实现上层的应用肯定离不开最底层硬件的支持。中间层是操作系统,比如我们所选择的uClinux操作系统,它是衔接硬件部分和应用程序的过渡层,它既可以完成对底层硬件的基本操作,又能为上层应用程序提供运行环境支持。最上层自然就是应用程序层了,它是实现针对性应用的程序代码部分,比如路由设置等功能程序部分。
那对与SOHO路由器来说,它当然也脱离不了这样的技术框架,它的更为具体的实现过程简单的汇总的话,莫过于如下内容:
首先先要知道SOHO实现的网络功能,典型路由器应该具备以下功能:
支持PPPoE,固定IP上网;
DHCP动态主机配置协议;
网络地址转换(NAT)技术;
根据TCP,UDP的端口号(port number),IP 的(协议号)protocol number,对IP地址进行简单过滤的防火墙;
虚拟服务主机/端口映射(Port Forwarding)技术;
支持一定数量的特殊应用程序;
然后针对于上边的功能要求,相应地要通过硬件和软件的构造来实现:
硬件方面:
1、要明确家用小型路由器(一个WAN接口,四个LAN接口)的硬件原理。
2、实现硬件电路板设计,完成电路布线设计,并对元件焊接,通过硬件板的调试。
软件方面:
1、在分析 uClinux内核源代码的基础上,对uClinux操作系统的内核裁剪。
2、完成BoaWeb服务器的配置,并对CGI脚本进行设计,完成动态网页的功能。
3、对PPPOE的拨号进行配置实现。
4、针对Linux内核防火墙部分,运用IPtable工具进行防火墙规则操作。
通过如上的基本构造,一个路由器就基本成型了。说起来简单,但其中包含了很多很多的技术细节,要有大量的实践经验才能真正实现。做为门外观奇的好学读者,现在肯定有些不耐烦了吧,想要了解更多的更详细的构造内容吧?那好,现在就可以开始我们真正的技术之旅了。
路由器工作原理
1、基本原理
要实 现 网 络中通信节点彼此之间的通信,首先必须给每个节点分配一个唯一的IP地址。路由器应该至少有两个网络端口,分别连接LAN或者WAN子网上,每个端口必须具有一个唯一的IP地址,并且要求与所连接IP子网的网络号相同。不同的端口有不同的网络号,对应不同的IP子网,这样各子网中的主机才能通过自己子网的IP地址把要求发出去的IP数据报送到路由器上。
当路由器收到一份IP数据报后,首先要对该报文进行判断,然后根据判断的结果做进一步的处理。如果数据报是有效或正确的,路由器就根据数据报的目的IP地址转发该报文:否则就把报文丢弃。如果这个数据报的目的IP地址与路由器直接相连的一个子网上,路由器会通过相应的接口把报文转发到目的子网上去;否则会把它转发到下一跳(Hop)路由器。为了完成上述的操作,每台路由器必须维护一个路由表。把对应不同目的地的最佳路径存放在路由表中,这就是路由策略(Routing Policy)问题。路由表反映网络的拓扑结构,一般一条表项应该包含数据报的目的IP地址(通常是目的主机所在网络的地址)、下一跳路由器的地址和相应的网络接口等,在网络拓扑发生变化的时候,路由表也应该做相应的变动。所以路由器必须能够生成并更新路由表。
选路机制实际上就是如何查找路由表,通过查询路由表来决定向哪个方向转发数据。一般来说,路由器首先搜索匹配的主机地址:如果没有,再搜索匹配的网络地址:最后搜索默认路由。一旦查到匹配的表项,路由器就会把数据从相应的接口发送出去。
路由器具备了上述各要素后,就可以完成数据转发任务了。另外,路由器不仅负责对IP包的转发,还要负责与别的路由器进行联络,共同确定互联网的路由选择和路由表的更新维护。
2、SOHO路由器原理
当内部计算机要与外部Internet网络进行通信时,各内部间通过私有IP地址进行通信的计算机必须把私有IP地址转换成合法IP。这种网络地址转换技术称为NAT(Network Address Translation,网络地址转换)。在一个实际的私有网络中,NAT功能通常内建在路由器、防火墙或独立的NAT设备之上,网络中的主机将这些设备作为自己的默认网关。通过这样的配置,每一台内部主机发送往Internet的数据报就会送到具有NAT功能的设备中进行转换。NAT是SOHO路由器的必备功能,它是为解决IPv4地址不够分配的矛盾而产生的一个简单高效的解决方案。它能将任何两个地址域的地址进行转换,使私有网络中多台主机共享一个合法IP地址访问Internet。
嵌入式路由器硬件系统介绍
1、硬件系统总体结构
硬件结构是非常重要的部分,因为我们拆开一个路由器后首先看到的、所能看到的也就是硬件结构,我们就举例简单介绍一下硬件设计的各个部位的细节内容。
为了宏观查看,我们给出交换式宽带路由器的硬件设计实例图一张。图中主要分为两部分:
ARM4510B部分和交换芯片RTL8305部分,前者主要见上半图,后者为下半图。还有电源及各自的复位电路。
ARM4510B部分中,中央处理芯片为带有网络接口的S3C4510B–16/32位RISC微控制器,根据嵌入式操作系统的运行需要,扩展了SDRAM存储器和Flash存储器。SDRAM存储器由两片4X1MX16位的HY57V641620HGT
组成,作为嵌入式操作系统内核及应该程序运行的内存空间。Flash存储器由一片1MX16位的SS139VF160组成,作为内核映像的存储,并在嵌入式操作系统启动时加载系统内核及程序。根据调试程序及烧写Flash存储器的需要,引出JTAG接口。根据显示调试和运行信息的需要,提供了RS232接口。交换芯片 RTL8305部分中,提供4个LAN口(PORTO–PORT3)通过一四口的网络隔离变压器连接一个四口RJ45口,每个口可连接到10/10013aseT以太网,各端口之间有交换功能:还有一个WAN接口(CPO RT4)通过一单口的隔离变压器连接RJ45口。根据显示连接速度、状态和电源等需要,接出LED灯进行显示。根据交换芯片的管理需要,提供一串行EEPROM 24C01电路接口。根据交换芯片的主电源为2.5V.提供一个3.3V到2.5V的转换器。
中央处理芯片通过MR(独立媒体接口)接口与交换芯片RTL8035SB的PORT4的Mil接口相联,将交换芯片的PORT4配置为物理层接收器。
当各部分电路设计完成后,形成硬件连接图,进而焊接之后,就可以作为开发用的实验硬件板了。下面就简要介绍一下个硬件电路部分。
2、硬件系统的简要设计介绍
⑴ARM处理器系统设计介绍
①S304510B概述
Samsung公司的S34510B是基于以太网应用系统的高性价比的16/32位RISC微控制器,内含一个由ARM公司设计的16/32位的ARM7TDMI RISC处理器核。ARM7TDMI为低功耗,高性能的16/32位核。
除了ARM7TDMI外,该芯片还有一些片内外围功能模块,主要为: 内部RAM (8Kbyte unified cache/SRAM),I2 C接口电路(I2C interface)、以太网控件器(Ethernetco ntroller),HDLC,GDMA、串口(UART),时钟(Timers)、可编程1/O口(Programmable I/O ports)及中断控件器(Interrupt controller)等。
S3C4510B结构框图所示。在实际运行过程中最主要用到的部分为:以太网接口及串口部分,前者用于收发以太包,后者主要作为操作系统调试接口。
②ARM 处理器系统电源电路和复位电路
主要是实现供电和复位功能,电路部分不做详细讲解,有深入研究需要的爱好者可以查看相关的电子相关参考资料进行深入学习。为使文章通俗易懂,以下各电路部分也是做一宏观介绍,细节部分包括电路布线等不再深入讲解。
③ARM处理器与Flash存储器接口电路
读者只要知道这部分的电路连接是为实现能在Flash存储器编写程序即可。
④ARM处理器与SDRAM接口电路设计介绍
与 Flash存储器相比,SDRAM不具有掉电保持数据的特性,但其存储速度大大高于Flash存储器,且具有读/写属性。因此SDRAM在系统中主要用于程序的运于空间、数据及堆栈。当系统启动时,CPU首先从复位地址0x0片读取启动代码,在完成系统的初始化后,程序代码调入SDRAM中运行,以提高系统的运行速度。
SDRAM 具有单位空间存储量大和价格便宜的特点,广泛用于各种嵌入式系统中。SDRAM 的存储单元可以理解为一个电容,总是倾向于放电,为了避免数据丢失,必须定时刷新(充电)。因此,在系统中使用SDRAM,就要求微处理器有刷新的控制逻辑或者在系统中另外加刷新控制逻辑电路。S3C4510B在片内具有独立的SDRAM刷新控制逻辑,可以方便的与SDRAM接口。
⑤ARM处理器串行接口电路设计介绍
几乎所有的微控件器、PC都提供串行接口,使用美国电子工业协会(EIA)推荐的RS-232-C接口标准,这是一个很常用的串行数据传输总线接口标准。早期被用于计算机和终端通过电话线和MODEM进行远距离的数据传输,随着微型计算机和微控制器的发展,不仅在远距离,近距离也采用了该通信方式。在近距离的通信中不采用电话线和MODEM,而是直接进行端到端的连接。
RS-232-C标准采用的是9芯或是25芯的D型插头。
⑥ARM处理器JTAG接口电路设计介绍
JTAG(JointTe stAc tionG roup,联合测试行动小组)是一种国际标准测试协议,主要用于芯片内部测试及系统进行仿真、调试。JTAG是一种嵌入式调试技术,它在芯片内部封装了TAP(Test Access Port,测试访问接口),通过专用的JTAG测试工具对内部节点进行测试.标准的JTAG接口是四线:TMS、TCK、TDI、TDO,分别为测试模式选择、测试时钟、测试数据输入、测试数据输出。JTAG测试允许多个器件通过JTAG接口串联在一起,形成一个JTAG链,能实现以各个器件分别测试。JTAG接口还常用于ISP(In System Programmable)功能,如对Flash器件进行编程。
⑵以太网交换电路设计介绍
以太网交换电路主要是采用五口交换芯片RTL8305SB来实现。RTL8305SB是一个集成了片内存储器,五个MAC层接口,五个物理层(PHY)接口的l0M/l00M自适应的五口交换芯片,该集成芯片具有低功耗,可灵活配置为五口小型办公及家用(SOHO)交换机,家用网关,xDSL路由器及其它智能应用。要实现必要的网络功能,这部分的电路是关键中的关键。
操作系统介绍
1、Linux
Linux是一个诞生于网络,成长于网络且成熟于网络的奇特的操作系统。1991年,芬兰大学生Linus Torvalds萌发开发了一个自由的UNIX操作系统的想法,并将Linux通过Internet进行发布。从此一大批编程人员加入到开发过程中来,Linux逐渐成长起来。Linux一开始要求所有的源代码必须公开,后来转向GPL( GNUG eneral Public Licence),成为GUN的阵营的主要一员。只要遵守GPL的规定,就可以免费获得复制,因此Linux是一个免费软件。同样,Linux下遵循GPL规定的C, C++, Java等一系列的工具开发包,从功能的角度上看并不亚于商用的开发包,但却可以极大的降低开发成本,这一优势是其它商用操作系统无法比拟的。
Linux 操作系统最突出的是网络部分,基本上所有的网络协议和网络接口都可以在Linux上找到,Linux的内核比标准的UNIX处理网络协议更加高效,系统的网络吞吐性能更好,这也是Linux网络服务器市场上占据较大的市场分额的重要原因。对于一般的小型的SOHO路由器,Linux的网络技术无疑是其开发运行的最佳选择,Linux完全能对给其提供全方位的网络技术支持。Linux作为互联网的产物,许多关于Linux的文档可以在Internet上下载到。
2、uClinux操作系统
uclinux是嵌入式Linux的一个分支,在uClinux这个英文单词中u表示Micro,小的意思,C表示Control,控制的意思,所以uclinux就是Micro-Control-Linux,字面上的理解就是“针对微控制领域而设计的Linux系统”。同标准的Linux相比,由于uClinux自身不支持MMU,多任务的实现就需要技巧了。但是,在uClinux上运行的绝大多数的用户程序并不需要多任务。另外,针对uclinux内核的二进制代码和源代码都是经过了重新编写,以紧缩和裁剪基本的代码。这就使得uClinux的内核同标准的Linux内核相比非常之小,但是它仍保持了Linux操作系统的主要的优点,如稳定性、强大的网络功能和出色的文件系统支持等。uclinux包含Linux常用的API、小于512K的内核和相关的工具。操作系统所有的代码加起来小于900KB。
uClinux简介
uClinux的基本架构
在PC机上开发应用程序的用户都会有这样的感觉,PC机有完善的操作系统并提供应用程序接口(API),开发好的应用程序可以直接在操作系统上运行。虽然嵌入式系统的应用程序完全可以在裸板上运行,但为了使系统具有任务管理、定时器管理、存储器管理、资源管理、事件管理、系统管理、消息管理、队列管理和中断处理的能力,提供多任务处理,更好的分配系统资源的功能,用户就需要针对自己的硬件平台和实际应用选择适当的嵌入式操作系统(Embedded Operating System,以下简称EOS)。由于本文实例中的硬件平台是以不含MMU (Memory Management Unit,内存管理单)的S3C4510B为核心的,因此采用不带MMU的ARM 微处理器的嵌入式操作系统uclinux。uclinux 是一个完全符合GNUIGPL公约的操作系统,完全开放代码,现在由Line。公司支持维护。uClinux从Linux 2.0(2.4内核派生而来,沿袭了主流Linux的绝大部分特性。它是专门针对没有MMU的CPU,并且为嵌入式系统做了许多小型化的工作.适用于没有虚拟内存或内存管理单元(MMU )的处理器,例如ARM7TDMI。它通常用于具有很少内存或Flash的嵌入式系统。uclinux是为了支持没有MMU的处理器而对标准Linux作出的修正。它保留了操作系统的所有特性,为硬件平台更好的运行各种程序提供了保证。在GNU通用公共许可证(GNU GPL)的保证下,运行uClinux操作系统的用户可以使用几乎所有的Linux API函数,不会因为没有MMU而受到影响。由于uClinux在标准的Linux基础上进行了适当的裁剪和优化,形成了一个高度优化的、代码紧凑的嵌入式Linux,虽然它的体积很小,uClinux仍然保留了Linux的大多数的优点:稳定、良好的裁剪性、优秀的网络功能、完备的对各种文件系统的支持、以及标准丰富的API等。
BootLoader:负责uCLinux内核的启动,它用于初始化系统资源,包括SDRAM。这部分代码用于建立uCLinux内核运行环境和从Flash中装载初始化内核镜象。
内核初始化:uCLinux内核的入口点是start kernel() 函数。它初始化内核的其他部分,包括捕获,IRQ通道,调度,设备驱动,标定延迟循环,最重要的是能够fork “init”进程,以启动整个多任务环境。
系统调用函数/捕获函数:在执行完“init”程序后,内核对程序流不再有直接的控制权,此后,它的作用仅仅是处理异步事件(例如硬件中断)和为系统调用提供进程。
设备驱动 :设备驱动占据了uCLinux内核很大部分。同其他操作系统一样,设备驱动为它们所控制的硬件设备和操作系统提供接口。
文件系统 :uCLinux最重要的特性之一就是对多种文件系统的支持。这种特性使得uCLinux很容易地同其他操作系统共存。文件系统的概念使得用户能够查看存储设备上的文件和路径而无须考虑实际物理设备的文件系统类型。ucLinux透明的支持许多不同的文件系统,将各种安装的文件和文件系统以一个完整的虚拟文件系统的形式呈现给用户。uClinux带有一个完整的TCP/IP协议,同时它还支持许多其他网络协议。uclinux对于嵌入式系统来说是一个网络完备的操作系统。
uClinux开发环境
⑴GNU开发套件
GNU软件包括C编译器GCC,C ++编译器G++,汇编器AS,链接器LD,二进制转换工具(OBJCOPY,OBJDUMP),调试工具(GDB.GD BSERVER,KGDB)和基于不同硬件平台的开发库。在GNU GCC支持下用户可以使用流行的C/C++语言开发应用程序,满足生成高效率运行代码、易掌握的编程语言的用户需求,这些工具都是按GPL版权声明发布,任何人可以从网上获取全部的源代码,无需任何费用。关于GNU和公共许可证协议的详细资料,读者可以参看GNU网站的介绍,http://www,gnu.oTgfhDmc.html。GNU开发套件作为通用的Linux开放套件,包括一系列的开发调试工具。GNU开发工具都是采用命令行的方式,用户掌握起来相对比较困难,不如基于Windows系统的开发工具好用,但是GNU工具的复杂性是由于它更贴近编译器和操作系统的底层,并提供了更大的灵活性。一旦学习和掌握了相关工具后,就了解了系统设计的基础知识。运行于Linux操作系统下的自由软件GNU gcc编译器,不仅可以编译Llnux操作系统下运行的应用程序,还可以编译Linux内核本身,甚至可以作交叉编译,编译运行于其它CPU上的程序。所以,在进行嵌入式系统应用程序开发时,这些工具得到了日益广泛的应用。
⑵uCIinux的打印终端
通常情况下,uClinux的默认终端是串口,内核在启动时所有的信息都打印到串口终端(使用printk函数打印),同时也可以通过串口终端与系统交互。uClinux在启动时启动了telnetd(远程登录服务),操作者可以远程登录上系统,从而控制系统的运行。至于是否允许远程登录可以通过烧写romfs文件系统时由用户决定是否启动远程登录服务。
⑶交叉编译调试工具
支持一种新的处理器,必须具备一些编译,汇编工具,使用这些工具可以形成可运行于这种处理器的二进制文件。对于内核使用的编译工具同应用程序使用的有所不同。
路由器软件系统的设计过程
uClinux 操作系统提供了嵌入式Web服务器、PPPOE拔号软件、基于IPTable过滤防火墙等功能模块的源代码。路由器软件系统的设计包括uClinux操作系统的裁剪、基于uClinux操作系统提供的以上功能模块源代码下的修改和设计,从而实现本路由器的嵌入式Web服务器、PPPOE拔号软件、基于IPTable过滤防火墙。
uClinux操作系统裁剪
⑴裁剪前准备
uclinux的裁剪牵涉到对目标的硬件支持问题。要让uClinux支持一个新硬件体系,要做的第一件事情就是收集和构建代码的工具。然后就可以裁减和编译内核。一旦内核支持基本的处理器功能,它就可以运作了,但是如果缺乏驱动程序的支持,就起不了多大作用。典型的驱动程序集合中包括了诸如控制台终端、基本串行设备和一个可能包含了根文件系统的块设备的驱动等。
在这里主要介绍针对我们刚才介绍的实例系统采用的uClinux裁剪方法。本实例中的宿主机上装redhat9操作系统,因为redhat9具备安装uClinux交叉编译工具时所需要的库。
首先必须在redhat9下建立uclinux开发环境,建立uclinux开发环境的方法有很多,而且也十分方便。可以从http://www.uClinux.org处下载最新的uClinux的源代码、最新的gcc3的工具链,不过针对于不同的工具链在不同的操作系统下,以及目标板的MCU的不一样,可能在编译内核时会产生错误,在这里,我讲解实例所使用的不是最新版本的。同样的,针对不同的硬件开发环境要对uClinux源代码进行不同的适当修改,修改部分通常是以代码补丁形式实现的,一般网络上会有各种通用模式的补丁提供使用。好了,切入正题,有了齐全的软件包后,安装过程如下:
(1) 下载内核和工具包
内核包 : uClinux-disc-200408.tar.gz
补丁文件:uClinux-disc-200408.patch
uclinux的源代码和文件系统的源代码,软件包后的数字代表完成的日期。
工具链 : arm-elf-gcc-200403.sh
(2) 安装工具包
sh arm -elf-gcc-200403.sh
(3) 解压缩内核
tar -xzvfuClinux-dist-200408.tar.gz,生成uClinux-disk目录。
(4)安装补丁:
将补丁文件复制到uClinux-disk目录下,进入该目录,在Shell命令中使用如下命令:
patch -pl-f
⑵内核的编译和生成
执行以下命令可以进行uClinux编译:
make xconfig。具体的编译选项配置过程本文不做详细介绍。但在此给出编译的一些基本思想:
ucLinux作为一个自由软件,在广大爱好者的支持下,内核版本不断更新。新的内核修订了旧内核的bug,并增加了许多新的特性。如果用户想要使用这些新特性,或想根据自己的系统度身定制一个更高效,更稳定的内核,就需要重新编译内核。
为了正确的合理地设置内核编译配置选项,从而只编译系统需要的功能的代码,一般主要有下面四个考虑:
自己定制编译的内核运行更快(具有更少的代码)。
系统将拥有更多的内存(内核部分将不会被交换到虚拟内存中)。
不需要的功能编译进入内核可能会增加被系统攻击者利用的漏洞。
将某种功能编译为模块方式会比编译到内核内的方式速度要慢一些。
在此需要补充说明的是内核编译的目的是为了创建一个能够放置在flash上支持flash读取的完成要求功能的内核,同时也是flash读取步骤其中一步。对uCLinux的内核进行配置和创建要对uCLinux内核的版本进行选择:uCLinux内核的版本号有三种:主号、次号、修订号。以2.4.10为例一般来说,主号如目前的2是很稳定的。主号的变动说明了操作系统发生了很大的变动。次号如目前的.4,用来说明内核的稳定性。当次号为偶数号((0,2, 4, 6) 时,表明现在的内核的稳定性强,而当次号为奇数号(1,3, 5) 时,表明现在的内核处于测试的阶段,其稳定性值得考虑,如果你使用次号为奇数号的内核进行配置和创建时、就值得三思而行了。而修订号的发表比较的频繁,它主要是用来对前面的版本进行修补。开发新的版本和修改以前的版本是同时进行的,很有可能修改的修订版本在新的版本出来之后。
依次执行以下命令完成uClinux的编译过程:
cd/usr/local/src/uclinux=dist
make dep
make clean
make lib_only
make user_only
make romfs
make image
最终在image目录下生成2个文件:
zImage——uClinux内核2.4.x的压缩方式可执行映象文件;
romfs——文件系统的映象文件。
这就是我们要用来烧录到硬件板内的最终文件了。具体烧写可以通过使用专用的烧写工具来实现,烧写过程一定要参照烧写工具的说明要求来进行。
其中zImage已经包含了文件系统映象文件,通常直接烧写到Flash文件上即可执行了。当然在这之前要进行BootLoader的烧录, BootLoader其实就是一个引导程序,主要作用就是初始化系统,进而来引导操作系统。在嵌入式系统中,处理器上电后首先执行的一段代码就是BootLoader,BootLoader与硬件密切相关,其代码主要用C和汇编语言写成,不同的系统中,BootLoader的功能有所不同,但主要作用还是差不多的,主要有下面几点:
初始化微控制器MCU运行的时钟频率;
初始化Flash和内存的数据宽度,读/写访问周期和刷新周期;
初始化中断系统;
初始化系统中各种片内、片外设备和I/O端口设备;
初始化系统各种运行模式下的寄存器和堆栈;
加载和引导操作系统;
BLOb是BootLoaderObject的缩写,它是一个功能强大、源代码公开的自由软件,它已经实现了对多种处理器芯片的Linux 引导支持。对ARM7等核心的BootLoader支持版本可以到专业网站上进行下载,并稍微做适当修改来满足开发应用中的硬件环境要求即可,在此我们不做过多讲述。
上面所讲述的内核编译过程只是比较宽泛的、笼统的操作过程,也就是说只是基本的操作过程,而在真正的路由功能实现过程中,还要对内核进行多种设置编译,比如说对硬件系统中设计到的部件进行驱动配置安装等,当然,这些并不是特别难的操作技术,再比如我们下面就要讲到的内容,这可就是很有挑战性的核心技术了,这些都是针对内核进行技术性操作来实现特定的网络功能。
内核编译核心部分
1、文件系统分析
文件系统是uClinux操作系统的重要组成部分,uClinux文件系统是操作运行的基础。许多嵌入式系统在不存在磁盘的情况下也可以运行。文件系统可以随同内核一起被打包并在启动时作为一个文件系统的映像被加载。对一个简单的应用系统来说,这己足够了。文件系统可以存放在一个传统磁盘中,但也可以存放在非易失性的存储介质— 闪存中。闪存有一个引导块,它存放了CPU上电后运行的第一个软件,这个软件可以是uclinux的引导程序,也可以是自己编的bootloader。uClinux的内核可以被引导程序从闪存中拷贝到RAM中全速运行。闪存也可以作为文件的存储介质,必要时写入一些需要保存的数据。
uClinux支持NFS(Network File System),它允许通过网络加载各种应用程序。由于用在每一个嵌入式系统上的软件可以从一个公用的服务器上加载,这在控制软件的修订或升级中是很重要的.在系统运行的过程中,导入和导出数据、配置、状态信息的备份也很重要。对用户监控而言,这是一个非常强大的功能。例如,一个嵌入式系统可能装配了一个RAM DISK,它包含着与系统当前状态的更新维持一致的(状态)文件。那么别的嵌入式系统仅需通过网络把这个RAM DISK作为远程磁盘mount过来便可以访问那些位于远端RAM DISK中的状态文件。这也允许在另一台机器上的WEB服务器借助简单的CGI脚本来访问那些状态信息。运行在其他机器上的应用程序包能够很容易地访问这些数据。uClinux操作系统根据不同的安装选择可以生成不同的文件系统。系统中提供了十分丰富的文件系统以供不同需要的用户选择。每种类型的文件系统的基本块大小、优化分配策略、一次传送的数据长度等等都是相互匹配的,使得本类文件系统均有相应的最佳性能。
2、嵌入式Web服务器
对uClinux操作系统下嵌入式Web技术的实现主要用于用户可以通过网
页方式来管理路由器。
⑴uClinux下Web Server的实现
uClinux下,主要有三个WebServer:htpd,thttpd和Boa。Httpd是最简单的一个Web Server,它的功能最弱,不支持认证,不支持CGI。Thttpd和Boa都支持认证、CGI等,功能都比较全。为了实现动态Web技术,这里我们选择实现一个支持CGI的、非常适合于嵌入式系统的Boa Web Server。Boa是一个单任务的http服务器,源代码开放、性能高。目前,uClinux的代码中已经包含boa的源代码,在uClinux下实现Boa,需要对Boa做一些配置和修改。这主要通过对boa.conf和mime.types文件进行修改来实现,需要改动的配置有以下几项:
①建目录
由于uClinux默认的根文件系统romfs是只读的,不能用mkdir等命令来新建目录,故应在编译内核前先建好要用到的目录,这通过修改
/uclinux-samsung/vendors/Samsung/4510b/makefile文件来实现。在ROWFS_DIRS=bin dev etc home lib mnt proc usr var的后边增加home/webhome/web/cgi-bin,这样修改后编译内核,编译好的根文件系统romfs中就包含这些目录了。
②指定Web 服务器的根目录路径(SERVER ROOT)
进入 /uclinux-samsung/user/boa/src/目录,通过修改define.h文件中#define ERVER ROOT “/home”语句来指定SERVER ROOT。另外,还可以通过命令行来指定,例如:boa-c/home/&。而且命令行指定的SERVER ROOT可以覆盖define.h文件所指定的。
③修改boa.conf文件
在. /uclinux-samsung/user/boa/src/boa.conf里修改:
*将 user obody和Group ogroup改为User0 和Group0 ;
*将 DocumentRoot/var/www改为DocumentRoot/home/web,这样web服务器的文档根目录为/home/web;
*将 MimeTypes/eWmime.types改为MimeTypes/home/web/mime.types;
定义默认首页和CGI程序所在目录,即
DirectoyIndex index.html
ScriptAlias/cgi-bin//home/web/cgi-bin/
这样指定后,.index.htm为远程浏览客户访问WebServer所看到的首页默认值,用C编写的CGI程序编译成二进制文件,放到/cgi-bin/目录下,CGI程序能被正确地执行。
Boa.conf文件和mime.types文件必须放到Web服务器根目录下,所以把修改后的bao.conf和mime.types拷贝到“./uclinux-samsung/romfs/home/”目录下。然后在/uclinux- samsung/Vendors/Samsung/4510b/initab里修改,在:inet:unknown:/bin/inetd后加入: boa:unknown:/bin/boac/homeo
配置过程后,重新编译内核,编译时选中Boa选项。把编译好的内核下载到硬件板,启动uclinux,完成IP配置,启动Boa Web Server,然后就可以通过lE访问你的网页了。如果想启动uclinux时自动启动Boa Web Server,可以修改re文件,进入uclinux-samsung/vendors/Samsung/4510B目录,在运行脚本rc中增加两行:
ifconfig eth0 192.168.0.101 up
boa-c/home/&
修改后重新编译内核,再下载到硬件板运行.运行uclinux后,不需要配置就可以直接通过IE来访问http://192.168.0.101,看到你的网页了。
⑵uclinux下实现动态Web页面的CGI技术
到目前为止,实现动态Web页面有4种技术可供选择:CGI(Common Gateway Interface), ASP(ActiveXServerPage),PHP(PersonalHomePage)和JSP(JavaServerPage).在uclinux下如果要实现动态网页,只能采用CGI,因此目前uclinux还不支持ASP, PHP等动态Web页面技术。CGI(通用网关接口)提供Web服务器一个执行外部程序的通道,这种服务端技术使得浏览器和服务器之间具有交互性。CGI程序属于一个外部程序,需要编译成可执行文件,以便在服务端运行。浏览器将用户输入的数据送到Web服务器,Web服务器将数据使用STDIN送给CGI程序,在执行CGI程序后,可能会访问存储数据的一些文档,最后使用STDOUT输出HTML形式的结构文件,经Web服务器送回浏览器显示给用户。CGI程序可以用任何程序设计语言编写,如Shell脚本语言、Perl,Fortran, Pascal, C语言等。但目前uclinux不支持Pert, Fortran等语言,而且C语言在平台无关性上表示不错,所以我们选择用C来编写CGI程序。另外,uClinux也不支持数据库,所以需要保存的数据只能保存到文件中,CGI查询数据时也是查询这些文件,而不是访问数据库。
⑶uClinux下动态Web页面的实现
下面通过一个例子来说明如何实现uClinux下的动态Web页面技术。此例子的目的是使用户能够通过Web页面内嵌表单提交数据,并能把用户提交的数据通过Web浏览器正确地返回给用户。实现动态Web页面的第一步是用HTML语言编写Web页及内建表单。编写Web页面时,要由ACTION属性来指定相关的CGI程序,如ACTION=cgi-bin/demo;由MOTHOD属性来指明所用的提交数据的方法,即MOTHOD=POST(GET)。
实现动态 Web页面的第二步是用C编写CGI程序,CGI程序分为以下几部分:①根据POST方法或GET方法从提交的表单中接收数据;②URL编码的解码;③用printf() 函数来产生HTML源代码,并将经过解码后的数据正确地返回给浏览器。包括demo.c, cgivars.h和cgivars.c三个文件。将编写好的CGI程序编译成二进制文件放在cgi-bin/目录下,CGI程序能被正确地执行,最终CGI程序就可以对上述表单数据的进行处理了。
下面对程序稍加说明。若以GET方法提交数据,表单中的数据被保存在QUERY_STRING环境变量中,通过调用函数getenv(“QUERY_STRING”)来读取数据;若以POST方法提交数据,则程序先从CONTENT LENGTH环境量得到数据的字长,然后从标准输入中读取相应长度的字符串即可得到提交的数据。数组postinput[i] 中保存的就是从表单中提取的数据。
URL编码的解码过程较为复杂,URL编码的规则下:①变量之间用“&”分开;② 变量与其对应值之间用“=”连接;③空格符用“+”代替;④特殊意义的字符用%接相应的十六进制ASCI码代替。解码即为编码的逆过程。在程序中,对于从表单中提取过来的postinput[i]中的数据,当发现字符为“+”时,将它转换成空格;当发现字符为“&”时,意味着个名字2值对的结束,在此处将字符中切成几个字符串;当再现字符为“=”时,意味着一个名字/值对的名字部分的结束,在此再将名字/值对分开。最后通过调用unescape_url(char *url)子函数将十六进制ASCII码值表示的特殊字符转换成相应的ASCII字符。
3、PPPOE拨号实现
PPPOE主要针对ADSL宽带接入方式,实现用户的的认证上网方式就是采用这种方式接入。
⑴PPPOE简介
1998年后期问世的以太网上点对点协议(PPP over Ethernet)技术是由Redback网络公司、客户端软件开发商RouterWare公司以及Worldcom子公司UUNET Technologies公司在IETF RFC制的基础上联合开发的。通过把最经济的局域网技术以太网和点对点协议的可扩展性及管理控制功能结合在一起,网络服务提供商和电信运营商便可利用可靠和熟悉的技术来加速部署高速互联网业务。它使服务提供商在通过数字用户线、电缆调制解调器或无线连接等方式,提供支持多用户的宽带接入服务时更加简便易行.同时该技术亦简化了最终用户在动态地选择这些服务时的操作.
⑵PPPOE实现
实现步骤 :
pppoe的实现有两种方式,一种是作为一个用户态的应用程序运行,就是rp-pppoe这个程序;另一种是选择在kernel ppp里支持pppoe功能,这同时也需要pppd支持pppoe。
具体的细节实现步骤本文不做详述,有兴趣的读者可以查阅相关的Linux资料进行更深一步的学习研究。
基于IPTable过滤式防火墙
网络防火墙用来保护一个网络不受来自另一个网络的攻击,是网络安全环节中进行的一个防御步骤。在路由器中配置IPTable过滤式防火墙,可以对IP数据封包进行规则检查和过滤,保证内网安全。
⑴防火墙概述
防火墙是一套能够在两个或两个以上的网络之间,明显区隔出实体线路联机的软硬件设备组合。被区隔开来的网络,可以透过封包转送技术来相互通讯,透过防火墙的安全管理机制,可以决定哪些数据可以流通,哪些资料无法流通,藉此达到网络安全保护的目的。
防火墙产品可以概略归类为硬件式防火墙和软件式防火墙,但实际上无论是硬件式或软件式防火墙,它们都需要使用硬件来作为联机介接,也需要使用软件来设定安全政策,严格说两者间的差别并不太大。我们只能从使用的硬件与操作系统来加以区分,硬件式防火墙是使用专有的硬件,而软件式防火墙则使用一般的计算机硬件,硬件式防火墙使用专有的操作系统,而软件式防火墙则使用一般的操作系统。
防火墙依照其运作方式来分类,可以区分为封包过滤式防火墙(Packet Filter)、应用层网关式防火墙(Application-Level Gateway,也有人把它称为Proxy防火墙)、电路层网关式防火墙(Circuit-Level Gateway).其中被广为采用的是封包过滤式防火墙,本文要介绍的iptables防火墙就是属于这一种。
封包过滤是最早被实作出来的防火墙技术,它是在TCP/IP四层架构下的IP层中运作.封包过滤器的功能主要是检查通过的每一个IP数据封包,如果其标头中所含的数据内容符合过滤条件的设定就进行进一步的处理,主要的处理方式包含:放行(accept)、丢弃(drop)或拒绝(reject)。要进行封包过滤,防火墙必须要能分析通过封包的来源IP与目的地IP,,还必须能检查封包类型、来源端口号与目的端口号、封包流向、封包进入防火墙的网卡接口、TCP的联机状态等数据。
⑵IPtable的原理及实现
IPTables是Linux操作系统中的一个管理内核包过滤的工具,它可以添加、插入或删除核心包过滤表(1)中的规则,以实现防火墙功能。
一个iptables命令基本上包含如下五部分:希望工作在哪个表上、希望使用该表的哪个链、进行的操作(M入,添加,删除,修改)、对特定规则的目标动作、匹配数据报条件。
基本的语法为:
iptables -t table -Operation chain -target match(es)
例如,希望添加一个规则,允许所有从任何地方到本地smtp端口的连接:
iptables -t filter -A INPUT -ACCEPT -p tcp –dport smtp
当然 ,还有其他的对规则进行操作的命令如:清空链表,设置链缺省策略,添加一个用户自定义的链…
经过一系列深入的配置后,基本的路由功能器就这样诞生了,当然实际中路由器还有相当多的应用功能,这些都是通过软件开发来逐步深层次实现的,如果你想成为一个嵌入式工程师的话,那这篇文章就算是一个引路人吧,要达到更高的境界,还需要自己刻苦学习研究,一步一步在魔幻般的技术殿堂中自由遨游。
(责任编辑:凌云通)
(3) 用 Linux 打造路由器
发布时间:2006.08.01 16:55 来源:linux宝库 作者:韩波
Linux 作为一种新近崛起的操作系统,由于其性能稳定,源码开放及价格方面的优势而逐渐被广大用户所接受。现在Linux的主要用武之地在于服务器领域,但是,经过适当的配置之后,它还可以担当互联网的物理基石–路由器这一重要角色。
路由器是通信子网中的通信节点,每个路由器都计算并维护一张路由表,并据此指导数据报前往最佳路径中的下一站,这便是所谓的路由。这样,经过互联网上所有路由器的通力合作,数据报就能够沿着一条”最佳”路径到达目的地。在 GNU 软件 Zebra 的协助下,我们可以将 Linux 机器打造成一台功能完备的路由器,它能够同时支持 RIPv1、 RIPv2、RIPng、OSPFv2、OSPFv3、BGP – 4 和 BGP – 4+ 等诸多 TCP/IP 协议。现在我们首先了解一下 OSPF 和 BGP 协议的运行模式和基本原理,然后介绍 Zebra 的安装配置方法,让你的 Linux 机器变成支持 OSPF 与 BGP 的路由器。
BGP/OSPF 概述
如今,许多公司都建有多个网络,如果这些网络的类型不尽相同,则需要用路由器进行互联。路由器是与两个或两个以上的网络连接的计算机,它根据路由协议生成并维护一个路由表,并按照该路由表中的信息转发包。这些路由器对公司内部的网络结构了如指掌,知道将分组送到目的地的全部细节,但对于其他公司的网络结构并不了解。像这样”在同一机构下管理的一系列路由器和网络”被称为自治系统(AS)。由不同机构掌管的自治系统,可以采用不同的路由选择算法;但同一自治系统内的所有路由器都使用同一路由协议,以便于自治系统内部各个路由器互换路由信息来维持相互的连通性。每一个自治系统都有一个16位的”自治系统(AS)编号”作为标志,就像 IP 地址一样,它是由专门机构来分配的。
自治系统内的路由器称为”内部网关”,所用的协议称为”内部网关协议”。内部网关协议大体上分为两类,一类是距离向量协议,如 RIP,EIGRP 协议;另一类是链路状态协议如 OSPF 协议。链路状态路由协议与距离向量协议的不同之处在于,采用链路状态路由协议的路由器不是交换到达目的地的距离,而是维护一张网络拓扑结构图。然后用数据库表示该图,其中的表项对应网络的一条链路。路由器根据数据库的信息计算出”最佳路由”,由此指导包的转发。当网络拓扑结构发生变化时,只需将相应纪录而非整个数据库通知其他节点。各路由器做出相应修改并重新计算路由后,就可以继续正常工作。
因为”开放式最短路径优先协议”的文档必须公开发表,所以它是”开放式的”(Open);又因为它采用”最短路径优先”(SPF)算法来计算一个节点到所有其它节点间的最短路径,故名为 OSPF。OSPF 具有支持多重度量制式和多重路径等诸多优点,因此成为因特网上推荐使用的内部网关协议,RIP 却由于自身的局限性而被打入冷宫。现在,在性能上唯一能够与 OSPF 相匹敌的内部网关协议便是 EIGRP–Cisco 的一个专有协议,但 OSPF 的”开放”本身就是一个响亮的招牌,因为谁也不想受制于某家供应商。
前面提到,自治系统内的路由器不必知道其他自治系统的内部结构细节,从而有效地节约了路由器的内存和 CPU 时间,并提高了网络带宽的利用率。但是,如果想与其他公司(自治系统)通信时该怎么办呢?很简单,我们可以在自治系统内指定一个与其他自治系统相连的路由器为”外部网关”,通过它进入其他自治系统。该路由器使用的协议叫做”外部网关协议”,如边界网关协议(BGP)。相邻的两个网关必须首先互换”邻机探测 “报文,协商是否愿意成为”邻机”。成为邻机则意味着两个自治系统同意中转双方的通信流。同意后,两个邻机互换”邻机可达性报文”,来监督他们之间的链路的工作情况。接下来便是最重要的工作,用”网络可达性报文”来交换通过各邻机所能到达的网络的信息,从而实现自治系统之间的连通性。在外部网关的眼里只由外部网关和连接他们的链路,如此以来,自治系统内的通信由内部网关处理,自治系统之间的通信交由外部网关处理–一个分级路由的景象已经展现在我们面前,实际上,因特网正是由大量自治系统组成的。
建立一个高级路由器
许多人对路由器感到比较陌生,事实上作为一个防火墙使用的 Linux 系统已经是一个路由器了,只不过还有点”简陋”而已。然而,我们的目标是用 Linux 打造一个”高级”路由器,它必须能够利用动态路由协议(上文提到的协议皆为动态路由协议)工作。这些协议能够使路由器互换相关信息,从而共享穿越网络时所用的那些路径–路由。这一点对于大型网络(比如 Internet)而言是”异常”重要的,因为此时再用静态路由(也就是人工计算设置路由)是根本不现实的。
举例来说,即使在比较理想–即不考虑路由的变化的情况下,一个边界网关协议(BGP)路由表也至少包含 100,000 条以上的表项。这时,手工建立这样的静态路由是难以忍受的。很明显,即使我们的网络小于 Internet–比如一个大型公司网络,我们还是更加喜欢动态路由协议。
外部网关协议 BGP 通常作为 Internet 的骨干使用,而其它的协议(如 OSPF)则适于小型的互连网络。开放式最短路径优先(OSPF)协议是一个应用最广的内部网关协议(IGP)。Zebra 是一个开放源代码程序包,通过它你可以在 Linux 上运行 BGP 与 / 或 OSPF。
安装 Zebra
你既可以从 Zebra.org 网站下载 Zebra 的最新源程序,也能从 Redhat 和 Debian 中获得它,但不一定是最新版的。从源代码中进行软件安装,你就会发现使用的是一些普通的安装过程。简介如下:
代码:
./configure
make
make install
配置脚本会搜索系统上已经安装的 IP 栈并且自动地设置成支持他们。当前,IP 栈很可能仅仅是指 IPv4,但是 IPv6 用户也不用担心,因为 Zebra 也会发现并且支持它。
程序安装之后,还可能必须在 /etc/services 中增加一些命令行。Zebra 的守护程序在他们自己的虚拟终端连接(VTY)下运行,所以你的系统必须知道这些虚拟终端连接。这里是你应该增加的一些连接∶
代码:
zebrasrv 2600/tcp # zebra service
zebra 2601/tcp # zebra vty
ripd 2602/tcp # RIPd vty
ripngd 2603/tcp # RIPngd vty
ospfd 2604/tcp # OSPFd vty
bgpd 2605/tcp # BGPd vty
ospf6d 2606/tcp # OSPF6d vty
配置 Zebra
如果你已经熟悉 Cisco IOS,那你就能在短时间内掌握 Zebra,因为你会发现两者极为相似。Zebra 的每个守护程序使用一个单独的 VTY,这些 VTY 可以通过一个远程登录会话进行动态配置。所以,如果你需要设置 OSPF,简单地远程登录到该 Linux 上 2604 端口;为了修改内核的路由表或设置路由协议间的再分发,你可以远程登录到端口 2601,该 Zebra 守护程序充当内核管理器,管理其他的守护程序和系统本身之间的通信。
现在介绍如何在一个服务器上创建和运行 OSPF 和 BGP。Zebra 的守护程序运用纯文本文件储存它们的配置。对于 OSPF/BGP 路由器,将用到三个文件∶zebra.conf、ospfd.conf 和 bgpd.conf。举例来说,zebra.conf 文件可能会是这样:
代码:
! Zebra configuration saved from vty
! 2002/02/28 01:46:12
!
hostname LinuxRouter /*主机名为 LinuxRouter*/
password zebra /*口令为 zebra*/
enable password z3bRa /*进入特权模式时的口令为 z3bRa */
log file /var/log/zebra/zebra.log /*日志文件的地址*/
!
interface eth0 /*以太接口 eth0*/
description Interface to External Network/*对接口的描述*/
ip address 10.0.0.1/24 /*该接口的 IP 地址*/
!
interface eth1/*以太接口 eth0*/
description Interface to Internal Network/*对接口的描述*/
ip address 192.168.66.1/24/*该接口的 IP 地址*/
这里的感叹号充当注解标识或分隔符。尽管存在大量不同的网络接口类型(Ethernet、ISDN 等等),但只要是 Linux 内核能够辨认的网络接口类型,Zebra 都可以使用。
子网掩码都带有网络位的位数(例如/24),默认掩码则不然(比如 255.255.255.0)。注意存在两个口令,一个用于用户模式而另一个用于特权模式。这不仅有利于向非管理员提供访问权限,而且对于创建路由服务器或者路由探测镜也是非常重要的。所有 BGP 管理员都知道,这些探测镜是调试路由问题的关键,因为他们能够使你就象从一个外部 AS( AS代表自治系统)一样查看路由。 BGP 路由需要用到 AS 编号,AS 编号是一些由 ARIN (美国互联网络号码注册机构)控制的注册号码。
下一步将启动一些必要的程序。用以下命令完成∶
代码:
/usr/sbin/zebra -dk
/usr/sbin/ospfd -d
/usr/sbin/bgpd -d
第一个命令,启动 zebra,该守护程序实际上用来更新内核的路由表。-dk 告诉该程序作为一个守护程序运行(d),它的大部分时间在后台运行。k 是另外的一个选项,告诉 Zebra 维护所有已配置的路由。它用来保证在你测试 Zebra 的时候不会意外地删除路由表。一般情况下,设置路由和接口,需要将 ifconfig 和 route 这两个命令配合使用。而 Zebra 完全可以替代这种路由管理方式,使用起来更为简洁。
设置OSPF
至此,基本的服务已经具备,现在让我们 Telnet 到本地机器的 2604 端口,开始配置 OSPF。为进入特权模式,键入 enable (正如在Cisco IOS 中一样),然后键入特权模式口令。接下来,用 configuration terminal 命令切换到配置模式。值得一提的是 Zebra 也能接受命令缩写形式,这与 Cisco 极为相似,如 configuration terminal 可以简写为 config t,这大大缩短了输入时间,使用起来更为方便。另外,如果输入 list 和 ?,它将显示一个当前可用命令的清单,并附有一些简略解释。除此之外,还可以键入 tab 用于命令的自动完成。这就是说,如果你想键入命令 clock,只要键入前两个字母 cl 然后按 tab 键,机器就会自动”补全”这条命令–前提是你键入的字符足以唯一地确定这条命令。这是一个很好的功能,尤其是当你习惯于这种用法时。
接下来,我们还需要告诉守护程序将通过 OSPF 广播哪些网络以及相关的域(area)。OSPF 的可伸缩性允许它支持多个域。键入 router ospf 开始配置 OSPF,然后键入 network 192.168.66.0/24 area 0。这告诉路由器,我们将使用 OSPF 广播一个子网掩码为 255.255.255.0 的 192.168.66.0 网络。
在本例中,我们让 eth0 接口变成一个被动(passive)接口,以便使它不能发送路由更新。这对于实验是非常重要的,因为在那个方向上的其他的路由器可能监听到发送的路由更新,将接口变成一个被动(passive)接口,从而有效的避免扰乱网络的正常运行。为此,键入命令 passive – interface eth0。如果打算将此路由器作为工作路由器使用时,就没有这个必要了。一旦你完成修改,用 end 命令从配置模式中退出,然后用 write file 命令保存。这里是一个快照:
代码:
labrat:~# telnet 0 2604 /*Telnet 到本地机器的 2604 端口*/
Trying 0.0.0.0…
Connected to 0.
Escape character is ‘^]’. /*用 ‘^]’退出该会话*/
Hello, this is zebra (version 0.84b)
Copyright 1996-2000 Kunihiro Ishiguro
User Access Verification
Password: /*在此键入口令,如 zebra*/
ospfd> enable/*进入特权模式*/
Password: /*输入特权模式口令,如 z3bRa*/
ospfd# configure terminal /*从终端配置路由器*/
ospfd(config)# router ospf /*配置 OSPF*/
ospfd(config-router)# network 192.168.66.0/24 area 0 /*通过 OSPF 广播网络 network 192.168.66.0,/24 指出子网掩码为 24 位,area 0 指出该网络所在的域*/
ospfd(config-router)# passive-interface eth0 /*将 eth0 接口设置成一个被动(passive)接口*/
ospfd(config-router)# end /*退出配置模式*/
ospfd# write file /*保存修改*/
Configuration saved to /etc/zebra/ospfd.conf
请记住,为了让 OSPF 或 BGP 在某接口上工作,那么该接口必须处于”运行”状态。为手工运行一个接口,登录到端口 2601 并且在该接口上执行 no shut 命令。
建立 BGP
BGP 与 OSPF 的配置大致相同。开始,打开一个远程登录会话到端口 2605。之后执行 configure terminal,输入 router bgp 进入 BGP 配置模式。如前所述,BGP 使用 AS 编号建立邻机关系并路由通信流。在我们的试验中,我们将使用一个范围在 64512 到 65534 之间的私有 AS 号码(换句话说,该号码旨在机构内部有效,而在因特网上无效)。用 network 命令设置由 BGP 广播的那些网络,如 network 192.168.66.0/24.。与 OSPF 不同的是,BGP 邻机必须静态指定。如同下述∶neighbor remote-as 。这里是一个范例:
代码:
labrat:~# telnet 0 2605
Trying 0.0.0.0…
Connected to 0.
Escape character is ‘^]’.
Hello, this is zebra (version 0.84b)
Copyright 1996-2000 Kunihiro Ishiguro
User Access Verification
Password:
bgpd> enable
Password:
bgpd# configure terminal
bgpd(config)# router bgp 65530 /*配置 BGP,65530 是自治系统编号。也就是将该系统配置成自治系统 65530 上的外部网关*/
bgpd(config-router)# network 192.168.66.0/24 /*由 BGP 广播的网络*/
bgpd(config-router)# neighbor 10.0.0.5 remote-as 65531 /*静态指定自治系统 65531 上 IP 地址为 10.0.0.5 的路由器为本机的邻机*/
bgpd(config-router)# end
bgpd# write file
Configuration saved to /etc/zebra/bgpd.conf
对于 OSPF 和 BGP,有大量选项可用,限于篇幅不能在此一一介绍。对于每个协议,我建议在实际使用之前,不妨先研究一番。为此,可以参考 GNU Zebra 文档,它会给你提供许多帮助。
结束语
在网络中,路由通信流的方法有若干种。就路由器而论,虽然有用各种硬件可用,但是费用较高–人们自然就会想到运行一个用 Linux 系统构筑的功能丰富的路由器作为代替。Zebra 路由守护程序已经使这一切变为现实。因为支持 IPv4、IPv6 和其它各式各样的协议,所以 Zebra 能够满足我们所有的路由需求。它还有一个好处就是,因为 Cisco IOS 和 Zabra 极为相似,如果你以前在 Cisco IOS 环境中工作,可以轻松的过渡到 Zebra 系统;同时,使用 Zebra 也能让你积累起丰富的类似于使用 Cisco IOS 路由器的经验和知识。
作者简介:
韩波,自由撰稿人,有近十年的 C 语言编程经验,主要感兴趣的领域为 TCP/IP 协议以及 Linux 内核。个人认为自由撰稿人的价值在于:在不影响问题实质的前提下,用一种通俗的,易于理解的方式来阐述自己的见解。您可以通过 Email:hbzzx2001@yahoo.com.cn 与他取得联系。
- 本文固定链接: http://www.wy182000.com/2011/07/23/路由器的原理及作用/
- 转载请注明: lijia 于 Studio 发表