易截截图软件、单文件、免安装、纯绿色、仅160KB

[转]Linux Netfilter实现机制和扩展技术


Linux Netfilter实现机制和扩展技术
 
 
级别: 初级
杨沙洲
(pubb@163.net
)国防科技大学计算机学院
2003 年 3 月 01 日
http://www.ibm.com/developerworks/cn/linux/l-ntflt/
2.4.x的内核相对于2.2.x在IP协议栈部分有比较大的改动,
Netfilter-iptables更是其一大特色,由于它功能强大,并且与内核完美结合,因此迅速成为Linux平台下进行网络应用扩展的主要利器,
这些扩展不仅包括防火墙的实现--这只是Netfilter-iptables的基本功能--还包括各种报文处理工作(如报文加密、报文分类统计等),甚
至还可以借助Netfilter-iptables机制来实现虚拟专用网(VPN)。本文将致力于深入剖析Netfilter-iptables的组织结
构,并详细介绍如何对其进行扩展。Netfilter目前已在ARP、IPv4和IPv6中实现,考虑到IPv4是目前网络应用的主流,本文仅就IPv4
的Netfilter实现进行分析。
要想理解Netfilter的工作原理,必须从对Linux IP报文处理流程的分析开始,Netfilter正是将自己紧密地构建在这一流程之中的。
1. IP Packet Flowing
IP
协议栈是Linux操作系统的主要组成部分,也是Linux的特色之一,素以高效稳定著称。Netfilter与IP协议栈是密切结合在一起的,要想理解
Netfilter的工作方式,必须理解IP协议栈是如何对报文进行处理的。下面将通过一个经由IP
Tunnel传输的TCP报文的流动路径,简要介绍一下IPv4协议栈(IP层)的结构和报文处理过程。
IP Tunnel是2.0.x内核就已经提供了的虚拟局域网技术,它在内核中建立一个虚拟的网络设备,将正常的报文(第二层)封装在IP报文中,再通过TCP/IP网络进行传送。如果在网关之间建立IP Tunnel,并配合ARP报文的解析,就可以实现虚拟局域网。
我们从报文进入IP Tunnel设备准备发送开始。
1.1报文发送
ipip模块创建tunnel设备(设备名为tunl0~tunlx)时,设置报文发送接口(hard_start_xmit)为ipip_tunnel_xmit(),流程见下图:


图1 报文发送流程

1.2 报文接收
报文接收从网卡驱动程序开始,当网卡收到一个报文时,会产生一个中断,其驱动程序中的中断服务程序将调用确定的接收函数来处理。以下仍以IP Tunnel报文为例,网卡驱动程序为de4x5。流程分成两个阶段:驱动程序中断服务程序阶段和IP协议栈处理阶段,见下图:


图2 报文接收流程之驱动程序阶段




图3 报文接收流程之协议栈阶段


相关文档:

实战Linux Bluetooth编程(六) L2CAP编程实例

例一:发送Signaling Packet:
Signaling Command是2个Bluetooth实体之间的L2CAP层命令传输。所以得Signaling Command使用CID 0x0001.
多个Command可以在一个C-frame(control frame)中发送。
 如果要直接发送Signaling Command.需要建立SOCK_RAW类型的L2CAP连接Socket。这样才有机会自己填充Command Code,Identi ......

MySQL将会像BSD、Linux那样弄出不同的分支和发行版?

    从用户的角度看,MySQL被Sun收购,又被Oracle收购可能真不是什么好事。MySQL本来就被Oracle通过并购其依赖的存储引擎Innobase、BerkeleyDB折腾的不行,又在被Sun收购后发生了Monty创建新分支MariaDB这样的事情,最终还是随着Sun一起被Oracle并购,没有逃脱Larry Elison的魔爪。也许,开源软件的好处就在 ......

ARM嵌入式Linux系统开发详解——前言

前  言
随着超大规模集成电路的发展,计算机处理器技术不断提高,计算机芯片的处理能力越来越强,体积越来越小,计算机技术应用到生活的方方面面。与人们日常生活打交道最多的就是嵌入式系统,从目前广泛使用的手机、MP3播放器到家用电器,嵌入式系统的应用无处不在。嵌入式系统的开发占整个计算机系统开发的比重也越 ......

linux—select详解

linux—select详解
select系统调用时用来让我们的程序监视多个文件句柄的状态变化的。程序会停在select这里等待,直到被监视的文件句柄有一个或多个发生了状态改变。
关于文件句柄,其实就是一个整数,通过socket函数的声明就明白了:
int socket(int domain, int type, int protocol);
我们最熟悉的句柄是0、1、2 ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号