路由器技术深入剖解(5)
操作系统介绍
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对于嵌入式系统来说是一个网络完备的操作系统。
3、uClinux开发环境
⑴GNU开发套件
GNU软件包括C编译器GCC,C ++编译器G++,汇编器AS,链接器LD,二进制转换工具(OBJCOPY,OBJDUMP),调试工具(GDB.GD BSERVER,KGDB)和基于不同硬件平台的开发库。在GNU GCC支持下用户可以使用流行的C/C++语言开发应用程序,满足生成高效率运行代码、易掌握的编程语言的用户需求,这些工具都是按GPL版权声明发布,任何人可以从网上获取全部的源代码,无需任何费用。关于GNU和公共许可证协议的详细资料,读者可以参看GNU网站的介绍, [url]http://www[/url],gnu.oTgfhDmc.html。GNU开发套件作为通用的Linux开放套件,包括一系列的开发调试工具。GNU开发工具都是采用命令行的方式,用户掌握起来相对比较困难,不如基于Windows系统的开发工具好用,但是GNU工具的复杂性是由于它更贴近编译器和操作系统的底层,并提供了更大的灵活性。一旦学习和掌握了相关工具后,就了解了系统设计的基础知识。运行于Linux操作系统下的自由软件GNU gcc编译器,不仅可以编译Llnux操作系统下运行的应用程序,还可以编译Linux内核本身,甚至可以作交叉编译,编译运行于其它CPU上的程序。所以,在进行嵌入式系统应用程序开发时,这些工具得到了日益广泛的应用。
⑵uCIinux的打印终端
通常情况下,uClinux的默认终端是串口,内核在启动时所有的信息都打印到串口终端(使用printk函数打印),同时也可以通过串口终端与系统交互。uClinux在启动时启动了telnetd(远程登录服务),操作者可以远程登录上系统,从而控制系统的运行。至于是否允许远程登录可以通过烧写romfs文件系统时由用户决定是否启动远程登录服务。
⑶交叉编译调试工具
支持一种新的处理器,必须具备一些编译,汇编工具,使用这些工具可以形成可运行于这种处理器的二进制文件。对于内核使用的编译工具同应用程序使用的有所不同。
 
 
路由器技术深入剖解(6)
路由器软件系统的设计过程
uClinux 操作系统提供了嵌入式Web服务器、PPPOE拔号软件、基于IPTable过滤防火墙等功能模块的源代码。路由器软件系统的设计包括uClinux操作系统的裁剪、基于uClinux操作系统提供的以上功能模块源代码下的修改和设计,从而实现本路由器的嵌入式Web服务器、PPPOE拔号软件、基于IPTable过滤防火墙。
1、uClinux操作系统裁剪
⑴裁剪前准备
uclinux的裁剪牵涉到对目标的硬件支持问题。要让uClinux支持一个新硬件体系,要做的第一件事情就是收集和构建代码的工具。然后就可以裁减和编译内核。一旦内核支持基本的处理器功能,它就可以运作了,但是如果缺乏驱动程序的支持,就起不了多大作用。典型的驱动程序集合中包括了诸如控制台终端、基本串行设备和一个可能包含了根文件系统的块设备的驱动等。
在这里主要介绍针对我们刚才介绍的实例系统采用的uClinux裁剪方法。本实例中的宿主机上装redhat9操作系统,因为redhat9具备安装uClinux交叉编译工具时所需要的库。
首先必须在redhat9下建立uclinux开发环境,建立uclinux开发环境的方法有很多,而且也十分方便。可以从 [url]http://www.uClinux.org[/url]处下载最新的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 p_w_picpath
最终在p_w_picpath目录下生成2个文件:
zImage——uClinux内核2.4.x的压缩方式可执行映象文件;
romfs——文件系统的映象文件。
这就是我们要用来烧录到硬件板内的最终文件了。具体烧写可以通过使用专用的烧写工具来实现,烧写过程一定要参照烧写工具的说明要求来进行。
其中zImage已经包含了文件系统映象文件,通常直接烧写到Flash文件上即可执行了。当然在这之前要进行BootLoader的烧录, BootLoader其实就是一个引导程序,主要作用就是初始化系统,进而来引导操作系统。在嵌入式系统中,处理器上电后首先执行的一段代码就是BootLoader,BootLoader与硬件密切相关,其代码主要用C和汇编语言写成,不同的系统中,BootLoader的功能有所不同,但主要作用还是差不多的,主要有下面几点:
初始化微控制器MCU运行的时钟频率;
初始化Flash和内存的数据宽度,读/写访问周期和刷新周期;
初始化中断系统;
初始化系统中各种片内、片外设备和I/O端口设备;
初始化系统各种运行模式下的寄存器和堆栈;
加载和引导操作系统;
BLOb是BootLoaderObject的缩写,它是一个功能强大、源代码公开的自由软件,它已经实现了对多种处理器芯片的Linux 引导支持。对ARM7等核心的BootLoader支持版本可以到专业网站上进行下载,并稍微做适当修改来满足开发应用中的硬件环境要求即可,在此我们不做过多讲述。
上面所讲述的内核编译过程只是比较宽泛的、笼统的操作过程,也就是说只是基本的操作过程,而在真正的路由功能实现过程中,还要对内核进行多种设置编译,比如说对硬件系统中设计到的部件进行驱动配置安装等,当然,这些并不是特别难的操作技术,再比如我们下面就要讲到的内容,这可就是很有挑战性的核心技术了,这些都是针对内核进行技术性操作来实现特定的网络功能。
 
路由器技术深入剖解(7)
内核编译核心部分
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来访问 [url]http://192.168.0.101[/url],看到你的网页了。
⑵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字符。
 
路由器技术深入剖解(8)
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资料进行更深一步的学习研究。
4、基于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
当然 ,还有其他的对规则进行操作的命令如:清空链表,设置链缺省策略,添加一个用户自定义的链...
经过一系列深入的配置后,基本的路由功能器就这样诞生了,当然实际中路由器还有相当多的应用功能,这些都是通过软件开发来逐步深层次实现的,如果你想成为一个嵌入式工程师的话,那这篇文章就算是一个引路人吧,要达到更高的境界,还需要自己刻苦学习研究,一步一步在魔幻般的技术殿堂中自由遨游。