Linux系统下网络数据包的处理流程

本文主要探讨linux环境下,数据包从网卡接收到协议栈处理的处理流程和对应的代码逻辑。

分析的内核代码版本为4.17.6,涉及到的网卡硬件功能特性和逻辑均以intel的82599以太网控制器为例,驱动为ixgbe。本文仅讨论physical function的驱动代码逻辑。

数据包从网卡接收开始,其总体处理流程如下:

  1. 网卡接收光/电信号,将其转换为数据帧内容,如果帧符合以太网地址等过滤条件,则保存到FIFO缓存中。82599控制器中共有8个FIFO缓存队列。

  2. 网卡解析FIFO中数据帧的2/3/4层信息,进行流过滤、流定向、RSS队列分流,计算出帧对应的分流队列号。82599控制器支持最多16个RSS分流队列。

  3. 网卡将数据帧内容通过DMA方式写入驱动程序指定的内存空间,并将帧的基本信息写入报文描述信息队列的寄存器(descriptor ring)中。

  4. 网卡发起硬件中断,系统响应硬件中断,进入驱动中的顶半部处理流程。

  5. 顶半部处理流程通过NAPI调度接口(napi_schedule)发起软件中断后就结束了,帧的具体处理逻辑在响应软中断的底半部流程中完成。

  6. 底半部流程中,驱动从DMA内存空间和网卡寄存器中获取帧信息和内容。之后重新分配新的DMA内存空间并更新网卡寄存器,使网卡能够继续处理并写入数据帧。

  7. 对于每个数据帧,驱动根据报文类型调用协议栈注册的处理接口函数进行协议栈解析处理。

下面具体介绍一下每一步的具体代码逻辑。

  1. 网卡接收光/电信号,将其转换为数据帧内容,如果帧符合以太网地址等过滤条件,则保存到FIFO缓存中。82599控制器中共有8个FIFO缓存队列。

    这一步是完全由网卡硬件完成的。但是L2的报文过滤可以通过驱动修改过滤地址的方式加以控制。一般情况下,只有以太网地址符合本地网卡以太网地址时帧才能通过过滤,82599控制器支持最多设置128个以太网地址。此外,可以设置打开网卡的混杂模式(promisc mode)来接收所有MAC地址帧,这个操作可以通过ixgbe_set_rx_mode函数实现,该函数修改了IXGBE_FCTRL_UPE 和 IXGBE_FCTRL_MPE寄存器来跳过L2报文过滤。

  2. 网卡解析FIFO中数据帧的2/3/4层信息,进行流过滤、流定向、RSS队列分流,计算出帧对应的分流队列号。82599控制器支持最多16个RSS分流队列。

    这一步也是由网卡硬件实现的,驱动可以设置流过滤、流定向的规则,具体的方式可参见82599 datasheet第7.1.2节。RSS队列分流的具体逻辑参见82599 datasheet的7.1.2.8节,驱动在启动网卡时,需要修改MRQC、RSSRK、RETA等寄存器来打开RSS分流功能、设置分流算法、哈希种子、分流映射表等。相关的代码可在ixgbe_setup_mrqc中找到。

    PS:由于第1步和第2步完全由硬件实现,无从验证,其功能步骤执行的具体顺序不一定完全与本文相符。

  3. 网卡将数据帧内容通过DMA方式写入驱动程序指定的内存空间,并将帧的基本信息写入接收报文描述信息队列(receive descriptor ring)中。

    这一步同样由网卡硬件实现。但网卡寄存器的初始化,以及可DMA访问的内存缓存空间申请是由网卡驱动在启动网卡时完成的。每个队列的具体初始化代码在ixgbe_configure_rx_ring中。该函数首先初始化IXGBE_RDH、IXGBE_RDT等缓存队列寄存器,然后调用ixgbe_alloc_rx_buffers分配缓存队列的内存空间,并进行DMA映射。接收报文描述信息队列(descriptor ring)同样是一系列DMA映射的内存空间,每个队列的ring空间是连续的,这个空间地址在ixgbe_setup_rx_resources函数中分配,在ixgbe_configure_rx_ring的起始部分写入到IXGBE_RDBA寄存器中。

    receive descriptor有两种格式,Legacy Receive Descriptor和Advanced Receive Descriptor,一般使用后者。数据结构的定义在ixgbe_type.h的ixgbe_adv_rx_desc函数中,字段解释可以参见datasheet的7.1.6节。需要注意的是这个数据结构是网卡和驱动公用的接口数据结构,因此其结构定义是不能在驱动中修改的。这个结构分成两个部分:read部分由驱动负责写入,网卡负责读取,用于向网卡传递每个报文的DMA缓存空间地址;wb(write-back)部分由网卡写入,驱动读取,用于网卡写入与报文相关的信息,例如报文长度等。

  4. 网卡发起硬件中断,系统响应硬件中断,进入驱动中的顶半部处理流程。

    在驱动打开网卡的函数ixgbe_open过程中,会在ixgbe_request_msix_irqs函数中调用request_irq(entry->vector, &ixgbe_msix_clean_rings, 0, q_vector->name, q_vector)函数注册硬件中断号和中断处理函数ixgbe_msix_clean_rings。这里的中断号在ixgbe_acquire_msix_vectors函数中使用pci_enable_msix_range函数分配。

    网卡发起硬件中断后,系统调用中断处理函数ixgbe_msix_clean_rings进行处理。

  5. 顶半部处理流程通过NAPI调度接口(napi_schedule)发起软件中断后就结束了,帧的具体处理逻辑在响应软中断的底半部流程中完成。

    ixgbe_msix_clean_rings函数的流程非常简单,函数判断一下这个中断是否有对应的rx或tx队列,如果有则调用napi_schedule_irqoff发起napi调度,将具体的处理工作交给napi的底半部处理函数。

  6. 底半部流程中,驱动从DMA内存空间和网卡寄存器中获取帧信息和内容。之后重新分配新的DMA内存空间并更新网卡寄存器,使网卡能够继续处理并写入数据帧。

    napi的底半部处理函数为ixgbe_poll,在ixgbe_alloc_q_vector函数中使用netif_napi_add接口注册。ixgbe_poll主要调用ixgbe_clean_rx_irq和ixgbe_clean_tx_irq来处理网卡收到和发送的报文。这里主要分析ixgbe_clean_rx_irq。clean_rx_irq函数会从缓存队列中获取若干个报文信息,并调用ixgbe_alloc_rx_buffers向队列补充缓存空间资源,最后调用ixgbe_rx_skb函数,这个函数直接调用napi_gro_receive函数,之后的流程就与网卡和网卡驱动无关了。

  7. 对于每个数据帧,驱动根据报文类型调用协议栈注册的处理接口函数进行协议栈解析处理。

    napi_gro_receive函数的逻辑较复杂,一般最终会调用__netif_receive_skb_core函数。该函数调用deliver_skb,最终调用注册的packet_type->func函数对skb数据进行解析处理。例如IPv4协议的packet_type中的func函数就是ip_rcv。

由于内核代码结构复杂,上述流程中仍有一些不明或不确之处,欢迎指正。

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
第一篇 基础知识篇  第一章 文件系统和进程系统  1.1 文件系统  1.1.1 文件系统的总体结构  1.1.2 文件结构和目录结构  1.2 文件系统的相关编程  1.3 进程系统  1.3.1 进程的概念  1.3.2 Linux中描述进程的核心数据结构。  1.3.3 和进程相关的系统调用  本章小结 第二章 进程间通信和同步  2.1 信号的处理  2.1.1 Linux中支持的信号  2.1.2 信号的捕获和处理  2.1.3 系统调用和信号的相互作用  2.1.4 pause和suspend函数  2.2 信号量  2.2.1 进程间的互斥  2.2.2 信号量的结构和信号量操作函数 . 2.2.3 应用示例  2.3 消息队列  2.3.1 消息队列的结构  2.3.2 消息队列的操作函数  2.3.3 应用示例  2.4 共享内存  2.4.1 共享内存的操作函数  2.4.2 应用示例  本章小结 第三章 TCP/IP协议  3.1 OSI参考模型、协议和服务  3.2 协议和服务  3. 2.1 TCB/IP  3.2.2 TCP和UDP的比较  3.2.3 Internet上两主机进程间通信数据的封装和解包  3.2.4 IP地址、网络地址和网络掩码  3.2.5 传输层端口  3. 3 域名系统  3.4 域名解析和名字服务器  3. 4. 1 TCP协议  3.4.2 TCP的确认和超时重发机制  3.4.3 TCP头部格式(HeaderFFormat)  3.4.4 TCP连接的状态转移过程  3.5 IP数据包格式  3.6 Internet消息控制协议  本章小结 第二篇 初级应用篇  第四章 基本套接字编程实践  4.1 基本套接字函数族  4.1.1 socket编程的基本流程  4.1.2 函数socket  4.1. 3 函数connect  4.1. 4 函数bind  4.1.5 函数listen  4.1.6 函数accept  4.1.7 函数read和write  4.1.8 函数close  4.2 应用示例  4.3 程序结果和异常说明  4.3.1 程序的运行结果  4.3. 2 程序的异常  本章小结  第五章 无阻塞套接字和单进程轮询服务器  5.1 无阻塞套接字  5.1.1 阻塞套接字的缺点  5.1. 2 阻塞和无阻塞的比较  5.1.3 无阻塞的实现  5.2 单进程轮询服务器工作方式  5. 3 应用示例  5.3.1 应用说明  5.3.2 应用源码  第六章 带外数据与多路复用、信号驱动的输入J输出模型  6.1 多路复用的输入/输出模型  6.1.1 多路复用模型的概念与select函数  6.1.2 应用示例  6.1.3 pselect函数对select的增强  6.2 信号驱动的输入/输出模型  6.3 系统I/O模型的总结  6.4 带外数据  6.4.1 带外数据的发送  6.4.2 带外数据的接收  6.4.3 带外数据接收方法的示例  本章小结  第七章 UDF数据报  7.1 UDP数据报的概述  7.2 UDP通信的过程  7.3 UDP的服务器和TCP服务器的比较  7.4 UDP的“连接”  7.5 应用示例  本章小结  第八章 域名系统和通用套接字选项  8.1 域名系统  8.1.1 域名系统的回顾  8.1.2 通过地址获取主机信息  8.1.3 通过主机名获取主机信息  8.1.4 获取本地主机的信息  8.1.5 通过服务名获取服务端口  8.1.6 通过端口号获取服务名  8.2 套接字选项  8.2.1 获取和设置套接字选项  8.2.2 通用套接字选项  本章小结 第三篇 应用提高篇  第九章 高级套接字函数编程实践  9.1 函数recv和send  9.1.1 函数send  9.1.2 函数recv  9.1.3 应用示例  9.1.4 应用源码和分析  9.2 函数readv和writev  9.2.1 函数说明  9.2.2 应用示例  9.3 函数比recvmsg和sendmsg  本章小结  第十章 守护进程和超级服务器inetd  10.1 守护进程的原理  10.2 编程实践  10.3 超级服务器inetd的工作原理  10.3.1 超级服务器的概念  10.3.2 超级服务器使用的配置文件  10.3.3 inetd处理并发服务的过程  本章小结  第十一章 数据结构的传输和xDR标准  11.1 数据结构的传送  11.1.1 数据结构传送的问题  11.1.2 简单的示例  11.2 XDR标准  11.2.1 XDR中包含的数据类型  11.2.2 XDR实现的原理  11.2.3 XDR的转换函数库  本章小结  第十二章 BPC远程过程调用原理和实践  12.1 RPC的原理  12.1.1 XDR的更进一步  12.1.2 本地函数调用的过程  12.1.3 用远程调用来虚拟本地调用  12.2 RPC的实现  12.2.1 远程过程的标识  12.2.2 端口的动态映射  12.2.3 RPC的报文  12.2.4 RPC开发工具  12.2.5 设计的原则  12.3 应用示例:网络记事本  12.3.1 编写本地应用  12.3.2 Rpcgen构建RPC应用  12.3.3 编写RPC说明文件  12.3.4 修改客户端程序  12.3.5 修改服务器端程序  12.3.6 调用的完整过程  12.3.7 程序的结果、分析和总结  本章小结 第四篇 高级编程篇  第十三章 UNIX域套接字和并发服务器的预创建技术  13.1 UNIX域套接字  13.1.1 UNIX域的地址结构  13.1.2 UNIX(套接字使用的示例  13.1.3 传递文件描述符  13.2 并发服务器的预创建技术  13.2.1 预创建固定服务器进程的数量  13.2.2 动态的管理子进程  13.2.3 重用服务器子进程  本章小结  第十四章 原始套接字编程实践  14.1 原始套接字  14.1.1 原始套接字的创建  14.1.2 原始套接字的使用  14.1.3 IP包头和ICMP报文的C语言描述  14.2 Ping应用程序  14.2.1 程序设计  14.2.2 程序源码  14.3 IP套接字选项  14.3.1 IP_TTL选项  14.3.2 IP_TOS选项  14.3.3 IP_OPTIONS选项  14.3.4 IP_HDRINCL选项  本章小结  第十五章 多线程编程  15.1 线程的概念  15.1.1 线程的概念  15.1.2 线程的分类  15.1.3 线程的创建和等待函数  15.1.4 线程的属性函数  15.2 线程间的同步  15.2.1 无名信号量  15.2.2 互斥锁、条件变量和条件信号  15.2.3 线程和信号  15.3 在网络程序中应用多线程  15.3.1 线程间参数的传递  15.3.2 线程安全函数的设计  15.3.3 多进程的并发服务器和多线程的并发服务器  15.3.4 客户端进程的多线程化  本章小结 第十六章 网络售票系统的简单模拟  16.1 系统的总体设计  16.1.1 应用的说明  16.1.2 数据格式的设计  16.1.3 服务器端的设计  16.1.4 客户端的设计  16.2 程序源码和解析  16.2.1 服务器端的源码  16.2.2 客户端的源码  本章小结
编辑推荐 本书介绍如何在Linux下建立,运行并维护站点的综合技术,它适合于有一定的LinuxLinux基本操作基础的网络建立者。 本书从建站的准备工作开始,写到建立功能强大的INTERNET网站,层层深入,涉及到网站建设中所遇到的种种问题。从Linux的安装和设置入手,详尽地介绍了如何建立普通站点及具有WWW、E-MAIL、FTP、BBS等功能的完整的INTERNET站点,并在最后介绍了网络的安全及网站的升级。本书还提供了笔者在实际操作中积累的一些小技巧。 内容简介 本书介绍如何在Linux下建立,运行并维护站点的综合技术,它适合于有一定的LinuxLinux基本操作基础的网络建立者。 本书从建站的准备工作开始,写到建立功能强大的INTERNET网站,层层深入,涉及到网站建设中所遇到的种种问题。从Linux的安装和设置入手,详尽地介绍了如何建立普通站点及具有WWW、E-MAIL、FTP、BBS等功能的完整的INTERNET站点,并在最后介绍了网络的安全及网站的升级。本书还提供了笔者在实际操作中积累的一些小技巧。 目录 第1章 了解Linux及其网络结构 1.1 Linux简介 1.1.1 何谓Linux 1.1.2 Linux的功能 1.1.3 Linux当前的版本 1.2 Linux的TCP/IP网络结构 1.3 IPv6简介 1.3.1 IPv6与IPv4头标的比较 1.3.2 简化的头标 1.3.3 参数的修订 1.3.4 新导入的域 1.4 站点注册 1.4.1 何谓站点注册 1.4.2 注册Linux站点 1.5 常见问题及解答 1.5.1 关于运行DOS/Windows上的程序 1.5.2 关于Linux的资料来源 1.5.3 关于获取帮助 第2章 服务器平台安装和设备管理 2.1 硬件选择 2.1.1 CPU、RAM和主板与性能的关系 2.1.2 硬盘的选择 2.1.3 显示卡与监视器的选择 2.1.4 电源与UPS的选择 2.2 Linux的安装准备 2.2.1 Linux的获取 2.2.2 了解你的计算机配置 2.2.3 Linux的安装方式 2.2.4 安装Linux的硬盘分区 2.2.5 有关LILO的基础知识 2.3 Linux的安装 2.3.1 首先应该知道的事 2.3.2 开始安装:有关安装启动程序的选择 2.3.3 安装过程 2.3.4 最后的设置工作 2.3.5 安装LILO 2.4 Linux下的硬件设备管理 2.4.1 Linux设备管理概述 2.4.2 SCSI设备 2.4.3 硬盘 2.4.4 CD-ROM驱动器 2.4.5 调制解调器 第3章 配置TCP/IP网络 3.1 开始之前需要的信息 3.1.1 IP地址 3.1.2 网络掩码 3.1.3 网络地址(Network Address) 3.1.4 广播地址(Broadcast Address) 3.1.5 网关地址(Router/Gateway Address) 3.1.6 名字服务器地址(Nameserver Address) 3.2 用netcfg配置网络 3.2.1 操纵名字 3.2.2 操纵主机 3.2.3 增加网络接口设备 3.3 安装网卡 3.3.1 设置网卡模式 3.3.2 配置网卡 3.3.3 有关Intel Etherexpress系列卡的配置 3.3.4 网卡配置中的一些疑问 3.4 路由、网关和IPChains 3.4.1 路由和网关的概念 3.4.2 使用IPChains实现数据包过滤和转发 第4章 Linux文件及系统管理 4.1 文件和目录 4.1.1 文件和目录概述 4.1.2 文件类型 4.2 文件权限 4.2.1 文件权限的概念 4.2.2 文件权限的构成 4.2.3 文件权限的依赖性 4.2.4 改变权限 4.3 文件链接 4.3.1 硬链接 4.3.2 符号链接 4.4 文件系统和标准文件系统布局 4.4.1 文件系统 4.4.2 标准文件系统布局 4.5 基本目录介绍 4.5.1 根文件系统 4.5.2 /etc文件系统 4.5.3 /dev文件系统 4.5.4 /usr文件系统 4.5.5 /var文件系统 4.5.6 /proc文件系统 4.6 启动和关机 4.6.1 启动和关机概述 4.6.2 近观启动过程 4.6.3 重新启动系统 4.6.4 紧急启动(软)盘 4.6.5 有关关机的更多信息 4.7 登录和注销 4.7.1 通过终端登录 4.7.2 通过网络登录 4.7.3 login干了些什么 4.7.4 存取控制 4.7.5 Shell启动 4.8 管理用户 4.8.1 系统管理员 4.8.2 管理职责 4.8.3 用户管理 4.8.4 用户组管理 4.8.5 使用LinuxConf管理用户 4.9 内存管理 4.9.1 什么是虚拟内存 4.9.2 产生对换空间 4.9.3 使用对换空间 4.9.4 与其他操作系统共享对换空间 4.9.5 分配对换空间 4.9.6 高速缓存 4.10 X Window 4.10.1 如果没有安装X 4.10.2 如果已经安装了X 第5章 Linux网络设置 5.1 配置NFC服务器 5.1.1 NFS简介 5.1.2 设置NFS服务器 5.1.3 设置NFS客户机 5.1.4 NFS的工作原理 5.1.5 NFS守护程序的启动过程 5.1.6 各服务进程的作用 5.2 建立PPP连接和配置PPP服务器 5.2.1 有关PPP的基础知识 5.2.2 使用PPP拨号上网 5.2.3 配置PPP服务器 5.3 配置DNS服务器 5.3.1 DNS(Domain Name System)简介 5.3.2 域名服务系统 5.3.3 域名服务器和解析器 5.3.4 配置暂存专用名字服务器 5.3.5 建立一个简单的领域名字服务器 5.3.6 配置实例 5.3.7 维护工作 5.3.8 拨号网络连线的自动设置 第6章 建立Internet站点 6.1 E-mail服务器的建立 6.1.1 sendmail服务器的设置 6.1.2 在Linux机器上设置pop3代理 6.2 FTP服务器的建立 6.3 WWW服务器的建立 6.4 建立Samba服务器 6.4.1 Samba是什么 6.4.2 安装Samba 6.4.3 设置Samba的配置文件 6.4.4 启动Samba 6.4.5 Samba常用的重要指令 第7章 超文本标记语言(HTML) 7.1 HTML概述 7.2 HTML文件描述 7.3 段落、格式、版面分割标记 7.4 文字效果标记 7.5 超级链接标记 7.6 文字列表标记 7.7 表格标记 7.8 插入图像标记 第8章 PHP主页设计 8.1 内嵌式脚本语言PHP概述 8.1.1 PHP发展历史 8.1.2 PHP的主要技术特点 8.2 PHP语句 8.2.1 初识PHP 8.2.2 PHP语句和HTML分离 8.3 PHP中的变量 8.3.1 变量名和变量类型 8.3.2 深入了解变量类型转化 8.3.3 数组类型 8.3.4 动态变量 8.3.5 类和对象 8.3.6 变量作用域 8.4 外界变量和交互式网页 8.4.1 PHP从客户端获取信息的方法:外界变量 8.4.2 使用HTTP Form获取信息 8.4.3 HTTP Cookies与客户端信息 8.4.4 使用环境变量获取客户端信息 8.5 基本控制流程:分支和循环 8.5.1 条件语句和分支结构 8.5.2 循环语句 8.6 表达式基础 8.6.1 算术运算符 8.6.2 字符串运算符 8.6.3 赋值运算符 8.6.4 位运算符 8.6.5 逻辑运算符 8.6.6 比较运算符 8.7 PHP常用函数和MySQL数据库访问函数 8.7.1 PHP内置数学函数 8.7.2 日期时间围数 8.7.3 PHP的数据库功能及对MySQL数据库访问 第9章 建立BBS服务器 9.1 BBS服务器概述 9.2 Firebird BBS系统建站准备 9.2.1 最初的准备工作 9.2.2 BBS相关帐号的设置 9.3 Firebird BBS服务器系统安装 9.4 测试BBS并建立系统帐号 9.5 BBS相关配置 9.5.1 BBS配置文件sysconf.ini 9.5.2 sysconf.ini中定义的主要权限说明 9.5.3 版面的设置 9.5.4 Firebird BBS主要文件说明 9.6 BBS转信功能 9.6.1 主动式和被动式收信 9.6.2 BBS送信工作原理 9.6.3 安装转信程序innbbsd 第10章 服务器的安全性概述 10.1 服务器安全管理 10.1.1 安全防护的主要内容 10.1.2 Linux系统的文件安全 10.1.3 用户访问安全 10.1.4 日常安全注意事项 10.1.5 服务器被侵入后的处理 10.2 防火墙、IP伪装和代理服务器 10.2.1 什么是防火墙 10.2.2 防火墙分类 10.2.3 Linux防火墙实现策略 第11章 网站建设实例 11.1 Apache、PHP、MySQL简介 11.2 Apache、PHP、MySQL的安装 11.2.1 安装和启动MySQL 11.2.2 安装PHP+Apache 11.2.3 启动Apache并测试 11.2.4 测试MySQL数据库 11.3 网站设计和主页面制作 11.3.1 网站总体设计 11.3.2 网站风格设计 11.3.3 需要注意的问题 11.3.4 “Linux网站建设者”首页 11.4 网站设计和主页面制作 11.4.1 Web-BBS的结构分析 11.4.2 数据库的建立和测试 11.4.3 Web-BBS主页面制作 11.4.4 “发表文章”功能块制作 11.4.5 几点探讨和功能扩充
1 基于Linux 的防火墙技术研究 宋文功1 唐 琎2 (1.中南大学网络中心,湖南长沙510630;2.中南大学信息科学与工程学院,湖南长沙410075) 摘 要:介绍了防火墙的基本概念及其主要功能,分析了Linux 内核防火墙Netfilter 的架构、构建防火墙的工作原 理及其与内核的交互.最后给出了Netfilter 构建防火墙的一个实例。 关键词:防火墙 Linux Netfilter 包过滤 中图分类号:TN393 文献标识码:A Study of the technology of firewall based on Linux SONG Wen-gong1 Tang Jin2 (1.Central South University, Changsha 510630,China; 2. Central South University, Changsha 410075,China) Abstract:The basic concept and most functions of firewall were introduced here.It analysed the frame of netfilter,explained how to interact between kernel.Finally,a case study of using netfilter as a firewall was given. Key words:firewall;Linux; Netfilter;packet filtering 因特网的个人用户和集体用户正在快速增长,因特网在全世界范围内可共享的信息也越来越丰 富,同时随之而来的是信息系统的安全性显得越来越重要。特别是近来,黑客入侵和网络病毒大爆 发时有发生,各国政府都在加强在网络安全技术方面的研究。为了有效隔离来自Internet 的外部入 侵,防火墙(firewall)技术正在普及中。除了信息加密技术外,防火墙是当前最重要的一种网络安全 技术。 防火墙实际上是一种访问控制技术,主要作用是通过限制网络或某一特定区域的通信,阻止对信 息资源的非法访问和防止保密信息从受保护网络上非法输出。它是提供信息安全服务,实现网络和 信息安全的基础设施。 1 Linux 防火墙的功能 目前市场上有许多商用防火墙软件出售,但它们大多价格高昂,使许多个人及小企业用户难以承 受。Linux 的出现给了我们一个新的选择。它提供了一套完全免费的解决方案,其内置防火墙功能非 常强大,甚至超过了许多昂贵的商用软件。 1.1 包过滤功能 根据数据包的包头中某些标志性的字段,对数据包进行过滤。当数据包到达防火墙时,防火墙 根据包头中的某些字段中的一些或全部进行判断,决定接受还是丢弃数据包。包过滤可能发生在以 下几个时刻:接收到数据包时,发送数据包时以及转发数据包时。Linux 中过滤包的方法如下: (1)将包头和过滤规则逐一进行匹配。 (2)第一条与包匹配的规则将决定以下采取的行动:首先,此规则指定的策略将被应用到该包 上。应用在一个包的策略包括以下几种:接受(Accept),即允许包通过该过滤器;抛弃(Reject),即丢掉该 包并发一个“主机不可到达”的ICMP 报文回发送者;拒绝(Deny),即丢掉该包且不发任何返回信息。 其次,修改此规则对应的包和字节计数器的值;再次,一些关于包的信息会有选择性地被写入日志 中。有的规则中可能含有参数来定义如何改写包头的服务类型(TOS)字段,用于确定不同包的优先级。 (3)如果没有与包相匹配的过滤规则,则将对该包采取缺省的过滤规则。Linux 的包过滤规则可 包含如下一些信息: ·源地址和目的地址以及子网掩码,其中子网掩码中的0 表示可以匹配任何地址; ·包的类型,可以是TCP,UDP,ICMP 或“any”; ·源和目的端口号,一条规则中可以指定10 个以上的端口,也允许指定端口范围; ·ICMP 报文类型; 基金项目:国家自然科学基金资助项目(60234030) 2 ·包中的ACK 和SYN 标志,这是为了防止在某个特定方向上建立新的链接; ·某块网卡的名字或IP 地址,这样可以指定在特定的网卡上进出包; ·指定是否修改包头的TOS 字段; ·用一个标志来确定包的一些基本信息是否要被写入日志中。 1.2 代理服务功能 一个完整的防火墙解决方案不仅包括包过滤器,而且应该包括某种类型的应用层代理服务器。所 谓代理服务,是指在防火墙上运行某种软件(称为代理程序),如果内部网需要与外部网通信,首先 要建立与防火墙上代理程序的连接,把请求发送到代理程序;代理程序接收该请求,建立与外部网 相应主机的连接,然后把内部网的请求通过新连接发送到外部网相应主机。反之亦然。概括的说, 就是内部网和外部网的主机之间不能建立直接的连接,而是要通过代理服务进行转发。代理服务器 具有用户级的身份验证,完备的日志记录和帐号管理等较包过滤器更加安全的功能。然而,许多代理机 制需要客户端修改软件或修改用户接口,使用户意识到正在使用代理服务器。而Linux 内核支持透明 代理服务功能,透明代理用一种完全透明的方式,将一个经过本防火墙的连接重定向到本地代理服务 器.客户端(用户和软件)完全不知道他们的连接被一个代理进程处理,他们认为自已在直接和指定的 服务器对话。 1.3 包伪装功能 Linux 核心提供了一个用于防火墙解决方案的附加功能:IP 包伪装。IP 包伪装是Linux 中的一 种网络功能,它只能用于TCP/UDP 包,它能使没有Internet 地址的主机通过有Internet 地址的主机访问 Internet。如果一台Linux 服务器用IP包伪装功能连接到Internet 上,那私接上它的电脑即使没有获 得正式指定的IP 地址也可以接入Internet.这些电脑可以隐藏在Linux 服务器后面存取Internet 上的信 息而不被发现,看起来就好象是服务器在使用Internet。Linux 服务器实现代理功能的方法如下:当一 个内部主机向外发包时, Linux 服务器在转发此 IP 包之前,用自已IP 地址替换此包的源IP 地址, 并临时产生一个本机端口号来替换此包的 TCP/UDP 头中的源端口号;同时,内核会记录下 此替换.当外部的返回包到来时(送往防火墙主机 的临时端口),服务器能自动识别它,将此返回包 的IP 地址和端口号替换成内部主机的地址和端 口号,发给内部主机。分组过滤方式如下图1 所示。 通过这种IP 包伪装方式, Linux 方便地实现 了“代理”功能。从外部看来,所有包的收发都 是针对此Linux 主机的,所以具有很好的安全性。 2 Linux 数据包过滤系统—Netfilter/Iptables Linux 在其2.4 内核中内置了一个基于网络层解决方案的防火墙系统—Netfilter/Iptables,它使得 用户能够很方便地在网络边界定制对数据包的各种控制,如有状态或无状态的包过滤、各种类型的网 络地址转换、流量控制及高级的包处理等。Netfilter/Iptables 系统采用模块化的架构方式,其主要模块 有:通用框架Netfilter、数据包选择系统、连接跟踪系统及NAT系统等等。 2.1 Netfilter/Iptables 系统工作原理 Netfilter/Iptables 系统所提供的数据包控制能力(包过滤、网络地址转换、包处理等)都是由内核 模块通过注册回调函数和“IP 表”来实现的。例如,iptable_filter.o 模块通过注册filter 表及3 个回调 函数(NF_IP_LOCAL_IN;NF_IP_FORWARD;NF_IP_LOCAL_OUT)来实现IPv4 包的过滤功 能。下面以iptable_filter.o 模块的工作流程为例简单介绍一下Netfilter/Iptables 系统是如何工作的。 当数据包进入系统时,系统首先根据路由表决定数据包的流向(即将数据包发往那个关键点),则可能 有三种情况: 图1 分组过滤示意图 3 如果数据包的目的地址是其它主机或网络,则系统将该包发往forward 关键点。此时,回调函数NF _IP_FORWARD 根据FORWARD 链(在filter 表中)中的规则对数据包进行检查,如果规则匹配,则回 调函数按规则所指定的动作来处理该包,否则丢弃该包。2)如果数据包的目的地址是本机,则系统将数 据包发往input 关键点。此时,回调函数NF_IP_LOCAL_IN 根据INPUT 链(在filter 表中)中的规则 对数据包进行检查,如果规则匹配,则回调函数就按规则所指定的动作来处理该包,否则丢弃该包。3) 如果该数据包的源地址是本机,则系统将该包发往output 关键点。此时,回调函数NF_IP_LOCAL_ OUT 根据OUTPUT 链(在filter 表中)中的规则对数据包进行检查,如果规则匹配,则回调函数按规则所 指定的动作来处理该包,否则丢弃该包。 2.2 Netfilter 内核框架 Netfilter 是Linux2.4.x 内核中用于包处理的抽象、通用化的框架,它为每种网络协议(IPv4、IPv6 等)定义一套钩子函数(hook),其中IPv4 定义了5 个钩子函数.内核的模块可以对每种协议注册多个钩 子,这样当某个数据包通过Netfilter 框架时,Netfilter 检测是否有任何模块对该协议和钩子函数进行了 注册.若有,则将该数据包传给这些模块处理.Netfilter 提供了数据包过滤(filter 表),网络地址转换(NAT 表)及数据包处理(mangle 表)三种数据包处理能力.下面以Filter 表为例加以简单介绍. Filter 表为系统 缺省,其结构如下图.该表中包含了输入(INPUT)、输出(OUTPUT)和转发(FORWARD)3 条链.所有目标 地址指向本机的数据包会遍历INPUT 链,本地发出的数据包将遍历OUTPUT 链,而被转发的数据包将 遍历FORWARD 链。每一条链中都可设 定一条或数条规则,每一条规则都是这 样定义的“如果数据包头符合这样的条 件,就这样处理这个数据包”.当一个数据 包到达一个链时,系统就会从第一条规 则开始检查,看是否符合该规则所定义 的条件.如果满足,系统将根据该条规则 所定义的方法处理数据包;如果不满 足则继续检查下一条规则。最后,如果 该数据包不符合该链中任何一条规则的 话,系统就会根据该链预先定义的策略 (Policy)来处理数据包。 Netfilter 提供了传递数据包到用户空间的Hook 函数,对数据包进行处理的代码不必运行在内核 空间,大大简化了编程.Netfilter 的框架结构,可方便地插入各种模块,易于扩展。 2.3 内核与用户的交互 防火墙除了内核里的机制外,还需要在应用层有相应的配置工具iptables,它是从三个默认的表 Filter、Nat、Mangle 而得名,每个表有几条链。一条链就是发生在包L 的一系列动作,例如Filter 表就有INPUT、FORWARD、OUTPUT 三个不同的默认链。如果包过滤需要检查IP 包,则netfilter 框架在网络层截获IP 包,这就需要与用户定义的规则做比较。而这些规则的添加修改是通过内核和 用户交互实现的,这就涉及一个如何与内核通信的问题。内核模块有三种办法与进程打交道:首先 是系统调用;第二种办法是通过设备文件;第三个办法便是使用proc 文件系统。netfilter 采用了第 一种修改系统调用的办法。ipables 在应用层调用setsockopt 进入内核,然后调用netfilter. c 又件中 nbetsockopt()实现交互,这样通过配置防火墙就可以按需要处理网络数据包。只有熟悉了iptables 提供的众多命令、选项等,在明白其工作原理的前提下,用户才能利用它未放心地创建大量的规则 记录和策略去控制内核数据包,才能正确有效地使用防火墙。这样即使在图形界而下使用防火墙, 通过点击你也明明白白内核里发生了什么。 3 防火墙配置实例 图2 filter 表结构 4 假设有一个局域网要连接到Internet 上,公共网络地址为202.101.2.25。内部网的私有地址采用C 类地址192.168.0.0~192.168.255.0 具体操作步骤如下:第一,一台Linux 主机上安装2 块网卡ech0 和ech1,给ech0 网卡分配一个 内部网的私有地址191.168.100.0,用来与Internet 相连;给ech1 网卡分配一个公共网络地址 202.101.2.25,用来与Internet 相连;第二, Linux 主机上设置进入、转发、外出和用户自定义链。本文 采用先允许所有信息可流入和流出,还允许转发包,但禁止一些危险包,如IP 欺骗包、广播包和ICMP 服务类型攻击包等的设置策略。具体设置如下: (1) 清除所有规则/sbin/ipchains-Fforward/sbin/ipchain s-Finput/sbin/ipchains-Foutput (2) 设置初始规则/sbin/ipchains-Ainput-jACCEPT/sbin/ip chains-Aoutput-jACCEPT/sbin/ipchains-AforwardjACCEPT (3) 设置本地环路规则/sbin/ipchains-Ainput-jACCEPT-ilo/s bin/ipchains-Aoutput-jACCEPT-ilo (4) 禁止IP欺骗/sbin/ipchains-Ainput-jDENY-iech1-s 192.168.100.0/24/ s b in/ i p c h a i n s-A i n p u t-j D E N Y-i e c h1- d 192.168.100.0/24/sbin/ipchains-Aoutput-jDENY-iech1-s 192.168.100.0/24/sbin/ipchains-Aoutput-jDENY-iech1-d 192.168.100.0/24/ s b in/ i p c h a i n s-A i n p u t-j D E N Y-i e c h1- s 202.101.2.25/32/sbin/ipchains-Aoutput-jDENY-iech1-d 202.101.2.25/32 (5) 禁止广播包/sbin/ipchains-Ainput-jDENY-iech0-s 255.255.255.255/sbin/ipchains-Ainput-jDENY-iech0-d0.0..0.0/s bin/ipchains-Aoutput-jDENY-iech0-s240.0.0.0/3 (6) 设置ech0 转发规则/sbin/ipchains-Aforword-jMASQ-ie ch0-s192.168.100.0/24 (7) 设置ech1 转发规则/sbin/ipchains-Aforword-jACCEPTiech1- s192.168.100.0/24/sbin/ipchains-Aforword-jACCEPTiech1- d192.168.100.0/24 通过以上各步骤的配置,可以建立一个基于Linux 操作系统的包过滤防火墙。它具有配置简单、 安全性高和抵御能力强等优点。 4 结束语 安全总是相对和无止境的,防火墙有其固有的局限性。人们必须时刻保持高度警惕去防止新的 攻击,动态跟踪系统的安全状况,开发新的功能和采取新的策略。本文通过分析netfilter 构建防火 墙的机制与技术,利用实例讲解了利用netfilter 框架编程实现新功能,这种分析有利于研究人员去 开发新的好的功能,用防火墙去努力保障主体的安全。 参考文献: [1] The netfilter framework in linux 2.4[EB/OL]. http://www.gnumonks.org/ [2] Linux 2.4 netfilter hacking HOWTO[EB/OL]. http:/ netfilter.kernelnotes.org/ [3] 徐辉,潘爱民,阳振坤.Linux 防火墙的原理与实现[J].计算机应用,2002,(1). [4] 梁如军.RedHat7.0 安装配置与管理[M].北京:清华大学出版社,2001. [5] RobertZiegler. 余青霞,周钢译.Linux防火墙[M].北京:人民邮电出版社,2000.10 [6] 黄允聪,严望佳,防火墙的选型、配置、安装和维护[M].北京:清华大学出版社,1999.45~108 [7] 原箐,卿斯汉.基于安全数据结构的防火墙[J]计算机科学,2001(8):56~60 5 作者简介(Author’s brief introduction): 1、宋文功(1966-),男,汉族,硕士(Male. Master.)。中南大学网络中心,工程师。 毕业院校:北京邮电学院。 研究方向:计算机通信(Researching for computer communications)。 通信地址:长沙市韶山南路22 号中南大学网络中心 邮编:510630 2、唐琎(1966-),男,汉族,博士(Male. Doctor.)。中南大学信息科学与工程学院,副教授。 研究方向:计算机应用 (Researching for computer applications)。 毕业院校:北京大学.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值