Linux内核之Netfilter
- 格式:pdf
- 大小:202.01 KB
- 文档页数:6
一、概述netfilter是Linux内核提供的一个功能强大的网络数据包过滤框架,它可以让用户对网络数据包进行分析和过滤。
netfilter queue是netfilter框架中的一个重要组件,可以让用户将数据包放入队列中,进行进一步处理。
本文将通过介绍netfilter queue的基本概念、工作原理和实际例子,帮助读者更好地理解和应用netfilter queue。
二、netfilter queue的基本概念netfilter queue是一个允许用户空间程序对数据包进行处理的接口。
当数据包经过netfilter时,可以选择将数据包放入netfilter queue中,然后用户空间程序可以从队列中取出数据包进行处理。
这种机制使得用户可以编写自定义的程序来处理数据包,实现更加灵活和个性化的数据包过滤和处理。
三、netfilter queue的工作原理1. 数据包经过netfilter当数据包经过netfilter时,netfilter会根据预先定义的规则对数据包进行处理,包括检查、修改以及丢弃等操作。
2. 数据包放入netfilter queue如果数据包符合某些条件,用户可以选择将数据包放入netfilterqueue中,而不是直接进行后续的处理。
3. 用户空间程序处理数据包用户空间程序可以通过netlink接口来监听netfilter queue,一旦有数据包进入队列,用户空间程序即可获取数据包并进行处理,可以根据自身需求来对数据包进行分析、修改以及决定是否将数据包继续投递给网络协议栈。
四、netfilter queue的实际例子为了更好地理解netfilter queue的使用,接下来通过一个实际例子来说明。
假设我们需要在Linux系统上对传入的数据包进行监控,并统计其中包含特定关键词的数据包数量,可以通过netfilter queue来实现此需求。
1. 编写用户空间程序我们需要编写一个用户空间程序,用来监听netfilter queue,并对接收到的数据包进行分析。
Linux 2.6.19.x内核编译配置选项简介(2)Security Marking对网络包进行安全标记,类似于nfmark,但主要是为安全目的而设计,如果你不明白的话就别选Network packet filtering (replaces ipchains)Netfilter可以对数据包进行过滤和修改,可以作为防火墙("packet filter"或"proxy-based")或网关(NAT)或代理(proxy)或网桥使用.选中此选项后必须将"Fast switching"关闭,否则将前功尽弃Network packet filtering debugging仅供开发者调试Netfilter使用Bridged IP/ARP packets filtering如果你希望使用一个针对桥接的防火墙就打开它Core Netfilter Configuration核心Netfilter配置(当包流过Chain时如果match某个规则那么将由该规则的target来处理,否则将由同一个Chain中的下一个规则进行匹配,若不match所有规则那么最终将由该Chain的policy进行处理)Netfilter netlink interface允许Netfilter在与用户空间通信时使用新的netlink接口.netlink Socket是Linux用户态与内核态交流的主要方法之一,且越来越被重视Netfilter NFQUEUE over NFNETLINK interface通过NFNETLINK接口对包进行排队Netfilter LOG over NFNETLINK interface通过NFNETLINK接口对包记录.该选项废弃了ipt_ULOG和ebg_ulog机制,并打算在将来废弃基于syslog 的ipt_LOG和ip6t_LOG模块Layer 3 Independent Connection tracking独立于第三层的链接跟踪,通过广义化的ip_conntrack支持其它非IP协议的第三层协议Netfilter Xtables support如果你打算使用ip_tables,ip6_tables,arp_tables之一就必须选上"CLASSIFY" target support允许为包设置优先级,一些排队规则(atm,cbq,dsmark,pfifo_fast,htb,prio)需要使用它"CONNMARK" target support类似于"MARK",但影响的是连接标记的值"DSCP" target support允许对ip包头部的DSCP(Differentiated Services Codepoint)字段进行修改,该字段常用于Qos "MARK" target support允许对包进行标记(通常配合ip命令使用),这样就可以改变路由策略或者被其它子系统用来改变其行为"NFQUEUE" target Support用于替代老旧的QUEUE(iptables内建的target之一),因为NFQUEUE能支持最多65535个队列,而QUEUE 只能支持一个"NOTRACK" target support允许规则指定哪些包不进入链接跟踪/NA T子系统"SECMARK" target support允许对包进行安全标记,用于安全子系统"CONNSECMARK" target support针对链接进行安全标记,同时还会将连接上的标记还原到包上(如果链接中的包尚未进行安全标记),通常与SECMARK target联合使用"comment" match support允许你在iptables规则集中加入注释"connbytes" per-connection counter match support允许针对单个连接内部每个方向(进/出)匹配已经传送的字节数/包数"connmark" connection mark match support允许针对每个会话匹配先前由"CONNMARK"设置的标记值"conntrack" connection tracking match support连接跟踪匹配,是"state"的超集,它允许额外的链接跟踪信息,在需要设置一些复杂的规则(比如网关)时很有用"DCCP" protocol match supportDCCP是打算取代UDP的新传输协议,它在UDP的基础上增加了流控和拥塞控制机制,面向实时业务"DSCP" match support允许对IP包头的DSCP字段进行匹配"ESP" match support允许对IPSec包中的ESP头进行匹配,使用IPsec的话就选上吧"helper" match support加载特定协议的连接跟踪辅助模块,由该模块过滤所跟踪的连接类型的包,比如ip_conntrack_ftp模块"length" match support允许对包的长度进行匹配"limit" match support允许根据包的进出速率进行规则匹配,常和"LOG target"配合使用以抵抗某些Dos攻击"mac" address match support允许根据以太网的MAC进行匹配,常用于无线网络环境"mark" match support允许对先前由"MARK"标记的特定标记值进行匹配IPsec "policy" match support使用IPsec就选上吧Multiple port match support允许对TCP或UDP包同时匹配多个端口(通常情况下只能匹配一个端口)"physdev" match support允许对到达的或将要离开的物理桥端口进行匹配"pkttype" packet type match support允许对封包目的地址类别(广播/群播/直播)进行匹配"quota" match support允许对总字节数的限额值进行匹配"realm" match support允许对iptables中的路由子系统中的realm值进行匹配"sctp" protocol match support流控制传输协议(SCTP),十年以后也许能够普及的东西"state" match support这是对包进行分类的有力工具,它允许利用连接跟踪信息对连接中处于特定状态的包进行匹配"statistic" match support允许根据一个给定的百分率对包进行周期性的或随机性的匹配"string" match support允许根据包所承载的数据中包含的特定字符串进行匹配"tcpmss" match support允许根据TCP SYN包头中的MSS(最大分段长度)选项的值进行匹配IP: Netfilter Configuration针对IPv4的Netfilter配置Connection tracking (required for masq/NAT)链接跟踪.可用于报文伪装或地址转换,也可用于增强包过滤能力Connection tracking flow accounting允许针对每个连接记录已经传送的字节/包数,常用于connbytes matchConnection mark tracking support允许对连接进行标记,与针对单独的包进行标记的不同之处在于它是针对连接流的.CONNMARK target和connmark match需要它的支持Connection tracking security mark support允许对连接进行安全标记,通常这些标记包(SECMARK)复制到其所属连接(CONNSECMARK),再从连接复制到其关联的包(SECMARK)Connection tracking events连接跟踪事件支持.如果启用这个选项,连接跟踪代码将提供一个notifier链,它可以被其它内核代码用来获知连接跟踪状态的改变Connection tracking netlink interface支持基于netlink的用户空间接口SCTP protocol connection tracking supportSCTP是IP网面向多媒体通信的新一代的流控制传输协议FTP protocol supportFTP协议IRC protocol supportIRC协议是一种用来实时聊天协议,用过mIRC的人应当不陌生NetBIOS name service protocol supportNetBIOS名字服务协议TFTP protocol supportTFTP是基于UDP的比FTP简单的文件传输协议Amanda backup protocol supportAmanda备份协议PPTP protocol support点对点隧道协议(PPTP)是一种支持多协议虚拟专用网络的网络技术,ADSL用户对它应该很熟悉H.323 protocol supportITU-T提出的用于IP电话的协议SIP protocol supportIETE提出的用于IP电话的协议IP Userspace queueing via NETLINK已废弃IP tables support (required for filtering/masq/NAT)要用iptables就肯定要选上IP range match support允许对ip地址的范围进行匹配TOS match support允许对ip包头的TOS(Type Of Service)字段进行匹配recent match support可以创建一个或多个刚刚使用过的ip地址列表,然后根据这些列表进行匹配ECN match support允许对TCP/IP包头的ECN(Explicit Congestion Notification)字段进行匹配.ECN是一种显式拥塞通知技术,它不但要求路由器支持而且要求端到端主机的支持,其基本思想是当路由器发生早期拥塞时不是丢弃包而是尽量对包进行标记,接收方接到带有ECN提示的包时,通知发送方网络即将发生拥塞,也就是它通过对包的标记提示TCP源即将发生拥塞,从而引发拥塞避免算法AH match support允许对IPSec包头的AH字段进行匹配TTL match support允许对ip包头的TTL(生存期)字段进行匹配Owner match support允许对本地生成的包按照其宿主(user,group,process,session)进行匹配address type match support允许对地址类型(单播,本地,广播)进行匹配hashlimit match support是limit的升级,它基于你选择的ip地址与/或端口动态的创建以limit为桶(bucket)的哈希表.它可以创建诸如"为每个特定的目标IP分配10kpps"或"允许每个特定的源IP分配500pps"之类的规则Packet filtering定义filter表以允许对包进行过滤REJECT target support允许返回一个ICMP错误而不是简单的丢弃包LOG target support允许将符合条件的包头信息通过syslog进行记录ULOG target support透过netlink socket将符合条件的封包交给用户空间的ulogd守护进程.反对使用该选项,因为它已经被NETFILTER_NETLINK_LOG代替TCPMSS target support允许修改TCP包头中的MSS(最大分段长度)选项值Full NAT允许进行伪装/端口转发以及其它的NA T功能,仅在你需要使用iptables中的nat表时才需要选择Packet mangling在iptables中启用mangle表以便对包进行各种修改,常用于改变包的路由raw table support (required for NOTRACK/TRACE)在iptables中添加一个'raw'表,该表在netfilter框架中非常靠前,并在PREROUTING和OUTPUT链上有钩子,从而可以对收到的数据包在连接跟踪前进行处理ARP tables supportARP表支持.只有在局域网中才有ARP欺骗问题,另外路由器也会遭到ARP欺骗ARP packet filteringARP包过滤.对于进入和离开本地的ARP包定义一个filter表,在桥接的情况下还可以应用于被转发ARP包ARP payload mangling允许对ARP包的荷载部分进行修改,比如修改源和目标物理地址IPv6: Netfilter Configuration针对IPv6的Netfilter配置,需要的话可以参考前面IPv4的Netfilter配置进行选择DECnet: Netfilter Configuration针对DECnet的Netfilter配置Bridge: Netfilter Configuration针对桥接的Netfilter配置DCCP Configuration数据报拥塞控制协议在UDP的基础上增加了流控和拥塞控制机制,使数据报协议能够更好地用于流媒体业务的传输SCTP Configuration流控制传输协议是一种新兴的传输层协议.TCP协议一次只能连接一个IP地址而在SCTP协议一次可以连接多个IP地址且可以自动平衡网络负载,一旦某一个IP地址失效会自动将网络负载转移到其他IP地址上TIPC Configuration透明内部进程间通信协议,以共享内存为基础实现任务和资源的调度,专门用于内部集群通信Asynchronous Transfer Mode (ATM)异步传输模式(ATM)支持802.1d Ethernet Bridging802.1d以太网桥802.1Q VLAN Support802.1Q虚拟局域网DECnet SupportDECnet是一种很生僻的协议ANSI/IEEE 802.2 LLC type 2 Support看不懂可以不选The IPX protocolIPX协议Appletalk protocol support与Mac机器通信的协议CCITT X.25 Packet Layer大约没人需要这东西LAPB Data Link Driver大约没人需要这东西Acorn Econet/AUN protocols一种被Acorn计算机使用的又老又慢的协议WAN router广域网路由QoS and/or fair queueing如果你需要Qos或公平队列就选吧Network testing网络测试,仅供调试使用Amateur Radio support业余无线电支持IrDA (infrared) subsystem support红外线支持,比如无线鼠标或无线键盘Bluetooth subsystem support蓝牙支持Generic IEEE 802.11 Networking Stack通用无线局域网(IEEE 802.11系列协议)支持Device Drivers设备驱动程序Generic Driver Options驱动程序通用选项Select only drivers that don't need compile-time external firmware只显示那些不需要内核对外部设备的固件作map支持的驱动程序,除非你有某些怪异硬件,否则请选上Prevent firmware from being built不编译固件.固件一般是随硬件的驱动程序提供的,仅在更新固件的时候才需要重新编译.建议选上Userspace firmware loading support提供某些内核之外的模块需要的用户空间固件加载支持,在内核树之外编译的模块可能需要它Driver Core verbose debug messages让驱动程序核心在系统日志中产生冗长的调试信息,仅供调试Connector - unified userspace <-> kernelspace linker统一的用户空间和内核空间连接器,工作在netlink socket协议的顶层.不确定可以不选Report process events to userspace向用户空间报告进程事件(fork,exec,id变化(uid,gid,suid)Memory Technology Devices (MTD)特殊的存储技术装置,如常用于数码相机或嵌入式系统的闪存卡Parallel port support并口支持(传统的打印机接口)Plug and Play support即插即用支持,若未选则应当在BIOS中关闭"PnP OS".这里的选项与PCI设备无关PnP Debug Messages该选项仅供调试使用ISA Plug and Play supportISA设备即插即用支持Plug and Play BIOS supportLinux 使用"Plug and Play BIOS"规范v1.0A(1994年)中定义的PNPBIOS自动检测主板上的资源和设备,但是其中的某些特性目前尚未实现,比如:事件通知/扩展坞(Docking Station)信息/ISAPNP服务.如果你希望由内核检测主板上的设备并为其分配资源(此时BIOS中的"PnP OS"必须开启)可以选上,此外,PNPBIOS还有助于防止主板上的设备与其他总线设备冲突.不过需要注意的是ACPI将会逐渐取代PNPBIOS(虽然目前两者可以共存),所以如果你的系统不使用ISA设备并且支持ACPI,建议你不要选中该选项并将BIOS中的"PnP OS"关闭Plug and Play BIOS /proc interface该选项仅供调试使用Plug and Play ACPI support让Linux使用PNPACPI自动检测主板上内建的设备并为其分配资源(即使这些设备已被BIOS禁用),它有助于避免设备之间的资源(如中断)冲突Block devices块设备Normal floppy disk support通用软驱支持XT hard disk support古董级产品Parallel port IDE device support通过并口与计算机连接的IDE设备,比如某些老旧的外接光驱或硬盘之类Compaq SMART2 support基于Compaq SMART2控制器的磁盘阵列卡Compaq Smart Array 5xxx support基于Compaq SMART控制器的磁盘阵列卡Mylex DAC960/DAC1100 PCI RAID Controller support古董级产品Micro Memory MM5415 Battery Backed RAM support一种使用电池做后备电源的内存Loopback device supportLoopback是指拿文件来模拟块设备,比如可以将一个iso9660镜像文件挂成一个文件系统Cryptoloop Support使用系统提供的加密API对Loopback设备加密,但不能用于日志型文件系统Network block device support让你的电脑成为网络块设备的客户端Promise SATA SX8 support基于Promise公司的SATA SX8控制器的RAID卡Low Performance USB Block driver它不是用来支持U盘的,不懂的就别选RAM disk support内存中的虚拟磁盘,大小固定(由下面的选项决定,也可给内核传递"ramdisk_size=参数"来决定),它的功能和代码都比shmem简单许多Default number of RAM disks默认RAM disk的数量Default RAM disk size (kbytes)仅在你真正知道它的含义时才允许修改Default RAM disk block size (bytes)每一个RAM disk的默认块大小,设为PAGE_SIZE的值时效率最高Initial RAM filesystem and RAM disk (initramfs/initrd) support如果启动计算机所必须的模块都在内核里的话可以不选此项Packet writing on CD/DVD mediaCD/DVD刻录支持Free buffers for data gathering用于收集写入数据的缓冲区个数(每个占用64Kb内存),缓冲区越多性能越好Enable write caching为CD-R/W设备启用写入缓冲,目前这是一个比较危险的选项ATA over Ethernet support以太网ATA设备支持Misc devices杂项设备ATA/ATAPI/MFM/RLL support通常是IDE硬盘和ATAPI光驱.纯SCSI系统且不使用这些接口可以不选Max IDE interfaces最大IDE接口数,两个IDE插槽一般相当于4个接口Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy supportEIDE支持是当然要选的,否则540MB以上的硬盘都不认识而且不支持主从设备Support for SATA (deprecated; conflicts with libata SATA driver)反对使用,该选项与libata SATA驱动有冲突Use old disk-only driver on primary interface没人用这些古董了Include IDE/ATA-2 DISK supportATA-2支持,除非你的硬盘是古董,否则必选Use multi-mode by default如果不确定就别选,除非出现帮助中指出的错误PCMCIA IDE support通过PCMCIA卡与计算机连接的IDE设备,比如某些外置硬盘或光驱Include IDE/ATAPI CDROM support有IDE光驱的就选Include IDE/ATAPI TAPE support有IDE磁带的就选Include IDE/ATAPI FLOPPY support有IDE软驱的就选SCSI emulation supportSCSI仿真,以前刻录光碟时需要,现在不需要了IDE Taskfile Access对介质进行直接的原始访问,它是一个复杂且有效的测试和校验硬件的方案,可以在驱动层之下执行数据恢复工作generic/default IDE chipset support通用IDE芯片组支持CMD640 chipset bugfix/support586以前的主板上常用,毛病多多PNP EIDE support外接的即插即用EIDE卡支持PCI IDE chipset support基于PCI总线的IDE芯片组支持,帮助IDE驱动自动检测和配置所有基于PCI的IDE接口Sharing PCI IDE interrupts support与其他PCI设备共享中断,一来可能冲突,二来降低性能,不选为妙Boot off-board chipsets first support不使用外接IDE控制器的就别选,使用外接IDE控制器的注意看帮助Generic PCI IDE Chipset Support通用的PCI IDE芯片组支持,如果你的芯片组在下面能找到就别选OPTi 82C621 chipset enhanced supportOPTi 82C621 EIDE控制器RZ1000 chipset bugfix/support486/586年代的玩艺Generic PCI bus-master DMA support通用的PCI总线控制器DMA支持,586以上的系统都支持Force enable legacy 2.0.X HOSTS to use DMA历史遗留问题,别管它,不选Use PCI DMA by default when available默认启用DMA,586以上的系统都支持,建议选择Enable DMA only for disks只对硬盘启用DMA,若你的光驱不支持DMA就选上{此处省略的部分按照自己主板上实际使用的芯片组进行选择}Other IDE chipset support其它IDE芯片组支持(多数需要在引导时指定特定的内核参数),如果你使用这样的芯片组就按实际情况选择子项吧IGNORE word93 Validation BITSATA-4和A TA-5规范中对于如何在80针的数据线上探测解释的不明确,导致了两种不同标准的产品同时出现,这可能导致ATA-66/100降低为A TA-33,若出现这个问题,可以打开这个选项忽略这种不同,但是又有可能导致另外的问题Old hard disk (MFM/RLL/IDE) driver旧版本的MFM/RLL/IDE驱动,不建议使用SCSI device supportSCSI设备RAID Transport Class用于SCSI设备的软件RAID支持,需要配合外部工具SCSI device support有任何SCSI/SATA/USB/光纤/FireWire/IDE-SCSI仿真设备之一就必须选上legacy /proc/scsi/ support一些老的刻录程序可能需要它SCSI disk supportSCSI硬盘或U盘SCSI tape supportSCSI磁带SCSI OnStream SC-x0 tape support另一种SCSI磁带SCSI CDROM supportSCSI CDROMEnable vendor-specific extensions仅在古董级的SCSI CDROM设备上才需要SCSI generic support若有SCSI硬盘/CD-ROM/tape之外的SCSI设备才需要选择SCSI media changer support一种SCSI备份设备Probe all LUNs on each SCSI device在每个SCSI设备上探测逻辑设备数.只在一个SCSI设备上有多个逻辑设备(模拟多个SCSI设备,比如多口读卡器)时才需要选它,一般的SCSI设备不需要Verbose SCSI error reporting以易读的方式报告SCSI错误,内核将会增大12KSCSI logging facility启用SCSI日志(默认并不开启,需要在挂载/proc后执行echo "scsi log token [level]" > /proc/scsi/scsi命令才能打开日志),可用于跟踪和捕获SCSI设备的错误SCSI TransportsSCSI接口类型,下面的子项可以全不选,内核中若有其他部分依赖它,会自动选上Parallel SCSI (SPI) Transport Attributes传统且常见的并行SCSI(Ultra320/160之类)FiberChannel Transport Attributes光纤通道iSCSI Transport AttributesiSCSI是利用TCP/IP网络传送SCSI命令和数据的I/O技术SAS Transport Attributes串行SCSI传输属性支持(SAS对于的关系SPI犹如SATA对于ATA)SAS Domain Transport Attributes为使用了SAS Domain的驱动程序提供帮助Compile the SAS Domain Transport Attributes in debug mode仅供调试使用SCSI low-level drivers底层SCSI驱动程序,按你实际使用的产品选择iSCSI Initiator over TCP/IP用于iSCSI在TCP/IP网络上传播的起动程序{此处省略的部分按照自己实际使用的控制器进行选择,仅用一个例子解说子项}Adaptec AIC79xx U320 support以基于PCI-X的Adaptec Ultra 320 SCSI控制器为例解说子项Maximum number of TCQ commands per device每个SCSI设备的标记指令队列的最大长度(上限253).上限越高性能越好,但是对于SCSI设备较多的系统来说可能造成内存分配失败.此值还可以通过tag_info内核引导参数指定Initial bus reset delay in milli-seconds初始总线reset之后的延时微秒数(默认5000)Enable Read Streaming for All Targets对所有的标记队列启用Read Streaming(可以增强效能,但是在一些Adaptec早期的U320产品上有缺陷),此特性还可以通过rd_strm内核引导参数指定Compile in Debugging Code仅用于调试Debug code enable mask (16383 for all debugging)出错代码的掩码,0表示禁止所有,16383表示打开所有Decode registers during diagnostics将出错代码的解释内容编译进去,这样就不需要查看aic7xxx.reg中的出错代码表以确定出错代码的含意了PCMCIA SCSI adapter support通过PCMCIA卡与计算机连接的SCSI设备Serial ATA and Parallel ATA driversSATA与PATA设备ATA device supportSATA或PATA接口的硬盘或光驱等设备AHCI SATA supportSATA高级主机控制器接口.要使用NCQ功能就必须选中它,另外BIOS中的SATA工作模式亦要选AHCI 模式Generic ATA support基于新的ATA层的通用A TA控制器驱动,仅在你的芯片组在列表中找不到时才需要{此处省略的部分按照自己主板上实际使用的芯片组进行选择}Old CD-ROM drivers (not SCSI, not IDE)老旧的CD-ROM驱动,这种CD-ROM既不使用SCSI接口,也不使用IDE接口Multi-device support (RAID and LVM)多设备支持(RAID和LVM).RAID和LVM的功能是使多个物理设备组建成一个单独的逻辑磁盘RAID support软件RAID(需要使用外部工具),若你有硬件RAID控制器,可以不选Linear (append) mode追加模式(简单的将一个分区追加在另一个分区之后)RAID-0 (striping) modeRAID-0(等量分割)模式RAID-1 (mirroring) modeRAID-1(镜像)模式RAID-10 (mirrored striping) modeRAID 0+1模式RAID-4/RAID-5/RAID-6 mode这些模式比较复杂,一般不用Support adding drives to a raid-5 arrayRAID-5阵列可以通过添加额外的驱动器进行扩展(restriping),这个选项允许在线进行这样的操作,同时要求mdadm的版本大于2.4.1Multipath I/O support多路IO支持是指在服务器和存储设备之间使用冗余的物理路径组件创建"逻辑路径",如果这些组件发生故障并造成路径失败,多路径逻辑将为I/O使用备用路径以使应用程序仍然可以访问其数据Faulty test module for MD用于MD(Multi-device)的缺陷测试模块Device mapper supportDevice-mapper是一个底层的卷管理器,不用LVM就别选了Fusion MPT device supportFusion MPT设备支持IEEE 1394 (FireWire) supportIEEE 1394(火线)I2O device supportI2O(智能IO)设备使用专门的I/O处理器负责中断处理/缓冲存取/数据传输等烦琐任务以减少CPU占用,一般的主板上没这种东西Network device support网络设备Network device support网络设备支持,当然要选啦Intermediate Functional Block support这是一个中间层驱动,可以用来灵活的配置资源共享,看不懂的可以不选Dummy net driver support哑接口网络,使用SLIP或PPP传输协议(如ADSL用户)的需要它。
netfilter 连接追踪原理Netfilter是Linux内核的一个关键组件,主要用于网络数据包的过滤与处理。
它可以在内核层面对数据包进行处理,从而提供网络安全,网络流量控制,网络地址转换等多种服务。
其中netfilter连接跟踪是一个极为重要的组件,本文将深入探讨其原理。
一、什么是netfilter连接跟踪Netfilter连接跟踪是netfilter的一个模块,主要目的是在内核层面跟踪网络连接,记录连接状态,保存连接信息。
当网络数据包通过网卡接口进入内核时,netfilter连接跟踪模块会首先检查数据包,然后将其与已存在的连接进行匹配,最终决策是否要转发或丢弃数据包。
Netfilter连接跟踪模块是实现状态ful firewall的关键组件,与stateless firewall相比,它可以更为精确地识别数据包的状态,实现更为复杂的防火墙策略与NAT 转换等。
二、netfilter连接跟踪的原理1. 连接跟踪状态表netfilter连接跟踪通过状态表记录已有的连接信息。
状态表是一个内存结构,保存了所有已建立的连接信息,其中包括源地址,目标地址,源端口,目标端口等元数据信息。
当一个新的数据包到达时,它必须与状态表中的连接信息进行匹配,从而确定它是否属于已经存在的连接。
状态表是由多个hash桶组成的,每个桶都维护了一个连接列表。
在新接收到一个数据包时,netfilter连接跟踪首先使用四元组(源IP,源端口,目标IP,目标端口)查询状态表中已有的连接,并将数据包分配给匹配到的连接。
2. 数据包流转当一个数据包通过网卡接口进入内核时,内核会先将其送到协议栈的网络层。
在网络层中,数据包会进行路由选择并将目标地址与本地地址进行比较,从而决定是否将数据包直接传递到目标主机内。
在进行路由选择时,可能会进行NAT转换。
如果数据包的目标地址不是本地地址,那么它将被发送到下一跳路由器。
在这个过程中,数据包可能会通过多个路由器进行传递,每个路由器会再次检查数据包的目标地址并进行路由选择。
Netfilter框架Netfilter是linux2.4内核实现数据包过滤/数据包处理/NAT等的功能框架。
该文讨论了linux 2.4内核的netfilter功能框架,还对基于netfilter 框架上的包过滤,NAT和数据包处理(packet mangling)进行了讨论。
阅读本文需要了解2.2内核中ipchains的原理和使用方法作为预备知识,若你没有这方面的知识,请阅读IPCHAINS-HOWTO。
第一部分:Netfilter基础和概念一、什么是NetfilterNetfilter比以前任何一版Linux内核的防火墙子系统都要完善强大。
Netfilter提供了一个抽象、通用化的框架,该框架定义的一个子功能的实现就是包过滤子系统。
因此不要在2.4中期望讨论诸如"如何在2.4中架设一个防火墙或者伪装网关"这样的话题,这些只是Netfilter功能的一部分。
Netfilter框架包含以下三部分:1 为每种网络协议(IPv4、IPv6等)定义一套钩子函数(IPv4定义了5个钩子函数),这些钩子函数在数据报流过协议栈的几个关键点被调用。
在这几个点中,协议栈将把数据报及钩子函数标号作为参数调用netfilter框架。
2 内核的任何模块可以对每种协议的一个或多个钩子进行注册,实现挂接,这样当某个数据包被传递给netfilter框架时,内核能检测是否有任何模块对该协议和钩子函数进行了注册。
若注册了,则调用该模块的注册时使用的回调函数,这样这些模块就有机会检查(可能还会修改)该数据包、丢弃该数据包及指示netfilter将该数据包传入用户空间的队列。
3 那些排队的数据包是被传递给用户空间的异步地进行处理。
一个用户进程能检查数据包,修改数据包,甚至可以重新将该数据包通过离开内核的同一个钩子函数中注入到内核中。
所有的包过滤/NAT等等都基于该框架。
内核网络代码中不再有到处都是的、混乱的修改数据包的代码了。
netfilter编程Netfilter 是Linux 内核中的一个框架,用于实现包过滤和网络地址转换(NAT)等功能。
Netfilter 提供了一种在内核空间中拦截、修改和处理网络数据包的机制。
你可以通过使用Netfilter 提供的API 进行编程,实现自定义的网络包处理逻辑。
以下是一个简单的基于Netfilter 的例子,使用C 语言编写:1. 编写Netfilter 模块:```c#include <linux/kernel.h>#include <linux/module.h>#include <linux/netfilter.h>#include <linux/netfilter_ipv4.h>#include <linux/ip.h>static struct nf_hook_ops nfho;// Netfilter 处理函数static unsigned int my_hook_function(void *priv, struct sk_buff *skb, const struct nf_hook_state *state) {struct iphdr *ip_header;// 获取IP 头ip_header = ip_hdr(skb);// 在此处添加你的自定义逻辑,例如修改IP 地址、丢弃包等// 打印原始IP 地址pr_info("Original Source IP: %pI4\n", &ip_header->saddr);return NF_ACCEPT; // 允许数据包通过}// 模块初始化函数static int __init my_netfilter_init(void) {pr_info("My Netfilter Module Loaded\n");// 初始化Netfilter 钩子nfho.hook = my_hook_function;nfho.pf = PF_INET;nfho.hooknum = NF_INET_PRE_ROUTING;nfho.priority = NF_IP_PRI_FIRST;nf_register_hook(&nfho);return 0;}// 模块退出函数static void __exit my_netfilter_exit(void) {pr_info("My Netfilter Module Unloaded\n");// 注销Netfilter 钩子nf_unregister_hook(&nfho);}module_init(my_netfilter_init);module_exit(my_netfilter_exit);MODULE_LICENSE("GPL");MODULE_AUTHOR("Your Name");MODULE_DESCRIPTION("Netfilter Module");```在这个例子中,我们创建了一个简单的Netfilter 模块,它注册了一个钩子函数`my_hook_function`,用于处理IPv4 数据包。
ja-netfilter 原理
ja-netfilter是一款在Linux系统下使用的网络过滤器。
其原理基于Netfilter框架,采用iptables的规则来过滤网络数据包,从而实现对网络流量的控制和管理。
Netfilter框架是Linux内核中的一个关键组件,它允许对网络数据包进行处理和转发。
在Netfilter框架中,数据包是按照一定的流程进行处理的,这个流程被称为Netfilter Hook。
当数据包经过网络协议栈中某一层时,就会触发相应的
Netfilter Hook点。
ja-netfilter在这些Hook点上插入了相应的钩子,用于检查和修改数据包,同时根据iptables规则决定是否丢弃、转发或者修改数据包。
ja-netfilter的核心是一个内核模块,它通过Netlink接口与用户态的命令行工具进行交互,完成规则的添加、删除和修改等操作。
在用户态中,可以使用iptables等工具来操作ja-netfilter内核模块,实现对网络流量的管理和控制。
总的来说,ja-netfilter利用了Linux内核的Netfilter框架和iptables规则来实现网络过滤和管理,具有良好的可定制性和可扩展性。
netfilter 机制netfilter 是Linux 操作系统中用于实现网络数据包过滤和修改的核心机制。
本文将介绍netfilter 机制的基本原理和功能,以及它在网络安全和网络管理中的应用。
netfilter 是Linux 内核中的一个网络数据包处理框架,它允许用户空间程序通过注册钩子函数来拦截、过滤和修改网络数据包。
netfilter 的核心组件是iptables,它是一个用户空间的命令行工具,用于配置netfilter 规则。
iptables 可以根据网络数据包的源IP地址、目标IP地址、协议类型、端口等信息来过滤和处理数据包。
netfilter 的工作原理是将网络数据包交给注册的钩子函数进行处理。
钩子函数根据预先设定的规则来判断数据包的命运,可以选择将数据包丢弃、修改数据包的目标地址或端口,或者将数据包传递给下一个钩子函数。
钩子函数的执行顺序由netfilter 链决定,每个链都包含多个钩子函数,钩子函数按照预定的顺序执行。
netfilter 提供了多个预定义的链,包括INPUT、FORWARD 和OUTPUT 等链。
INPUT 链用于处理目标地址是本机的数据包,FORWARD 链用于处理转发的数据包,OUTPUT 链用于处理源地址是本机的数据包。
用户可以在这些链上注册自定义的钩子函数,实现特定的数据包处理逻辑。
netfilter 还支持使用扩展模块来增加更多的功能。
扩展模块可以提供额外的匹配条件和动作,使用户能够更灵活地配置netfilter 规则。
常用的扩展模块包括 conntrack、nat 和 mangle 等。
netfilter 在网络安全中扮演着重要的角色。
通过配置适当的规则,可以实现防火墙功能,对不符合规则的数据包进行过滤,从而保护网络安全。
例如,可以配置规则来禁止特定的IP地址访问某个端口,或者限制某个服务的连接数。
netfilter 还可以用于网络管理。
通过配置规则,可以实现网络地址转换(NAT)功能,将内部网络的私有IP地址映射为公共IP地址,从而实现内网和外网的通信。
Linux netfilter源码分析内容基本上来自两篇文章:《Netfilter源码分析》—(独孤九贱/index.php)《Linux Netfilter实现机制和扩展技术》——(杨沙洲国防科技大学计算机学院)一、IP报文的接收到hook函数的调用1.1 ip_input.c ip_rcv()函数以接收到的报文为例,类似的还有ip_forward(ip_forward.c)和ip_output(ip_output.c) int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev){struct iphdr *iph; //定义一个ip报文的数据报头u32 len;if (skb->pkt_type == PACKET_OTHERHOST)goto drop; //数据包不是发给我们的IP_INC_STATS_BH(IPSTATS_MIB_INRECEIVES); //收到数据包统计量加1if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL){/* 如果数据报是共享的,则复制一个出来,此时复制而出的已经和socket脱离了关系 */ IP_INC_STATS_BH(IPSTATS_MIB_INDISCARDS);goto out;}if (!pskb_may_pull(skb, sizeof(struct iphdr)))goto inhdr_error; //对数据报的头长度进行检查,iph = skb->nh.iph; //取得数据报的头部位置if (iph->ihl < 5 || iph->version != 4) //版本号或者头长度不对, goto inhdr_error; //头长度是以4字节为单位的,所以5表示的是20字节if (!pskb_may_pull(skb, iph->ihl*4))goto inhdr_error;if (unlikely(ip_fast_csum((u8 *)iph, iph->ihl)))goto inhdr_error; //检查报文的检验和字段len = ntohs(iph->tot_len);if (skb->len < len || len < (iph->ihl*4))goto inhdr_error; //整个报文长度不可能比报头长度小if (pskb_trim_rcsum(skb, len)){ //对数据报进行裁减,这样可以分片发送过来的数据报不会有重复数据IP_INC_STATS_BH(IPSTATS_MIB_INDISCARDS);goto drop;}return NF_HOOK(PF_INET, NF_IP_PRE_ROUTING, skb, dev, NULL,ip_rcv_finish); //通过回调函数调用ip_rcv_finishinhdr_error:IP_INC_STATS_BH(IPSTATS_MIB_INHDRERRORS);drop:kfree_skb(skb); //丢掉数据报out:return NET_RX_DROP;}1.2 include/linux/netfilter.h NF_HOOK宏#ifdef CONFIG_NETFILTER_DEBUG#define NF_HOOK(pf, hook, skb, indev, outdev, okfn) \nf_hook_slow((pf), (hook), (skb), (indev), (outdev), (okfn), INT_MIN)#define NF_HOOK_THRESH nf_hook_slow#else#define NF_HOOK(pf, hook, skb, indev, outdev, okfn) \(list_empty(&nf_hooks[(pf)][(hook)]) \(okfn)(skb) \: nf_hook_slow((pf), (hook), (skb), (indev), (outdev), (okfn), INT_MIN))#define NF_HOOK_THRESH(pf, hook, skb, indev, outdev, okfn, thresh) \(list_empty(&nf_hooks[(pf)][(hook)]) \(okfn)(skb) \: nf_hook_slow((pf), (hook), (skb), (indev), (outdev), (okfn), (thresh)))#endif/* 如果nf_hooks[PF_INET][NF_IP_FORWARD]所指向的链表为空(即该钩子上没有挂处理函数),则直接调用okfn;否则,则调用net/core/netfilter.c::nf_hook_slow()转入Netfilter的处理。
Linux内核之Netfilternetfilter框架Linux内核包含了一个强大的网络子系统,名为netfilter,它可以为iptables内核防火墙模块提供有状态或无状态的包过滤服务,如NAT、IP伪装等,也可以因高级路由或连接状态管理的需要而修改IP头信息。
netfilter位于Linux网络层和防火墙内核模块之间,如图9-1所示。
虽然防火墙模块构建在Linux内核,并且要对流经IP层的数据包进行处理,但它并没有改变IP协议栈的代码,而是通过netfilter模块将防火墙的功能引入IP层,从而实现防火墙代码和IP协议栈代码的完全分离。
netfilter模块的结构如图9-2所示。
对IPv4协议来说,netfilter在IP数据包处理流程的5个关键位置定义了5个钩子(hook)函数。
当数据包流经这些关键位置时,相应的钩子函数就被调用。
从图9-2中可以看到,数据包从左边进入IP协议栈,进行IP校验以后,数据包被第一个钩子函数PRE_ROUTING 处理,然后就进入路由模块,由其决定该数据包是转发出去还是送给本机。
若该数据包是送给本机的,则要经过钩子函数LOCAL_IN处理后传递给本机的上层协议;若该数据包应该被转发,则它将被钩子函数FORWARD处理,然后还要经钩子函数POST_ROUTING处理后才能传输到网络。
本机进程产生的数据包要先经过钩子函数LOCAL_OUT处理后,再进行路由选择处理,然后经过钩子函数POST_ROUTING处理后再发送到网络。
说明:内核模块可以将自己的函数注册到钩子函数中,每当有数据包经过该钩子点时,钩子函数就会按照优先级依次调用这些注册的函数,从而可以使其他内核模块参与对数据包的处理。
这些处理可以是包过滤、NAT以及用户自定义的一些功能.iptables防火墙内核模块netfilter框架为内核模块参与IP层数据包处理提供了很大的方便,内核的防火墙模块正是通过把自己的函数注册到netfilter的钩子函数这种方式介入了对数据包的处理。
这些函数的功能非常强大,按照功能来分的话主要有4种,包括连接跟踪、数据包过滤、网络地址转换(NAT)和对数据包进行修改。
其中,NAT还分为SNAT和DNAT,分别表示源网络地址转换和目的网络地址转换,内核防火墙模块函数的具体分布情况如图9-3所示。
由图9-3可以看出,防火墙模块在netfilter的LOCAL_IN、FORWARD和LOCAL_OUT 3个位置分别注册了数据包过滤函数,数据包经过这些位置时,防火墙模块要对数据包进行过滤。
这三个位置也称为三条链,名称分别为INPUT、FORWARD和OUTPUT,它们共同组成了一张过滤表,每条链可以包含各种规则,每一条规则都包含0个或多个匹配以及一个动作。
当数据包满足所有的匹配时,则过滤函数将执行设定的动作,以便对数据包进行过滤的。
注意:这些规则的次序是很重要的,过滤函数对数据包执行了某一规则动作后,对数据包的处理即告结束,即使这个数据包还满足后面其他规则的所有匹配,也不会执行那些规则所设定的动作。
从图9-3中可以看出,除了过滤表以外,在PRE_ROUTING、LOCAL_OUT和POST_ ROUTING 3个位置各有一条有关NAT的链,名称分别为PREROUTING、OUTPUT和POSTROUTING,它们组成了NAT表。
NAT链里面也可以包含各种规则,它指出了如何对数据包的地址进行转换。
此外,5个钩子函数位置的mangle链还组成了一张mangle表,这个表的主要功能是根据规则修改数据包的一些标志位,例如TTL、TOS等,也可以在内核空间为数据包设置一些标志。
防火墙内的其他规则或程序(如tc等)可以利用这种标志对数据包进行过滤或高级路由。
以上介绍的是iptables防火墙的内部结构,Linux系统还提供了iptables防火墙的用户接口,它可以在上述各张表所包含的链中添加规则,或者修改、删除规则,从而可以根据需要构建自己的防火墙。
具体来说,用户是通过输入iptables命令来实现上述功能的。
Netfilter返回值返回值含义NF_DROP 丢弃该数据包NF_ACCEPT 保留该数据包NF_STOLEN 忘掉该数据包NF_QUEUE 将该数据包插入到用户空间NF_REPEAT 再次调用该hook函数iptables命令格式(1)在RHEL 5中,iptables命令由iptables-1.3.5-1.2.1软件包提供,默认时,系统已经安装了该软件包,因此,用户可以直接输入iptables命令对防火墙中的规则进行管理。
iptables命令相当复杂,具体格式如下所示。
1.iptables [-t 表名] <命令> [链名] [规则号] [规则] [-j 目标]-t 选项用于指定所使用的表,iptables防火墙默认有filter、nat和mangle 3张表,也可以是用户自定义的表。
表中包含了分布在各个位置的链,iptables命令所管理的规则就是存在于各种链中的。
该选项不是必需的,如果未指定一个具体的表,则默认使用的是filter 表。
命令选项是必须要有的,它告诉iptables要做什么事情,是添加规则、修改规则还是删除规则。
有些命令选项后面要指定具体的链名称,而有些可以省略,此时,是对所有的链进行操作。
还有一些命令要指定规则号。
具体的命令选项名称及其与后续选项的搭配形式如下所示。
示例1:1.-A <链名><规则>功能:在指定链的末尾添加一条或多条规则。
示例2:1.-D <链名><规则>2.-D <链名><规则号>功能:从指定的链中删除一条或多条规则。
可以按照规则的序号进行删除,也可以删除满足匹配条件的规则。
示例3:1.-R <链名><规则号><规则>功能:在指定的链中用新的规则置换掉某一规则号的旧规则。
示例4:1.-I <链名> [规则号] <规则>功能:在给出的规则序号前插入一条或多条规则,如果没有指定规则号,则默认是1。
示例5:1.-L [链名]功能:列出指定链中的所有规则,如果没有指定链,则所有链中的规则都将被列出。
示例6:1.-F [链名]功能:删除指定链中的所有规则,如果没有指定链,则所有链中的规则都将被删除。
示例7:1.-N <链名>功能:建立一个新的用户自定义链。
示例8:1.-X [链名]功能:删除指定的用户自定义链,这个链必须没有被引用,而且里面也不包含任何规则。
如果没有给出链名,这条命令将试着删除每个非内建的链。
示例9:1.-P <链名><目标>功能:为指定的链设置规则的默认目标,当一个数据包与所有的规则都不匹配时,将采用这个默认的目标动作。
示例10:-E <旧链名> <新链名>iptables命令格式(2)功能:重新命名链名,对链的功能没有影响。
以上是有关iptables命令格式中有关命令选项部分的解释。
iptables命令格式中的规则部分由很多选项构成,主要指定一些IP数据包的特征。
例如,上一层的协议名称、源IP地址、目的IP地址、进出的网络接口名称等,下面列出构成规则的常见选项。
-p<协议类型>:指定上一层协议,可以是icmp、tcp、udp和all。
-s<IP地址/掩码>:指定源IP地址或子网。
-d<IP地址/掩码>:指定目的IP地址或子网。
-i<网络接口>:指定数据包进入的网络接口名称。
-o<网络接口>:指定数据包出去的网络接口名称。
注意:上述选项可以进行组合,每一种选项后面的参数前可以加"!",表示取反。
对于-p选项来说,确定了协议名称后,还可以有进一步的子选项,以指定更细的数据包特征。
常见的子选项如下所示。
-p tcp --sport <port>:指定TCP数据包的源端口。
-p tcp --dport <port>:指定TCP数据包的目的端口。
-p tcp --syn:具有SYN标志的TCP数据包,该数据包要发起一个新的TCP连接。
-p udp --sport <port>:指定UDP数据包的源端口。
-p udp --dport <port>:指定UDP数据包的目的端口。
-p icmp --icmp-type <type>:指定icmp数据包的类型,可以是echo-reply、echo-request等。
上述选项中,port可以是单个端口号,也可以是以port1:port2表示的端口范围。
每一选项后的参数可以加"!",表示取反。
上面介绍的这些规则选项都是iptables内置的,iptables软件包还提供了一套扩展的规则选项。
使用时需要通过-m选项指定模块的名称,再使用该模块提供的选项。
下面列出几个模块名称和其中的选项,大部分的选项也可以通过"!"取反。
1.-m multiport --sports <port, port, …>功能:指定数据包的多个源端口,也可以以port1:port2的形式指定一个端口范围。
1.-m multiport --dports <port, port, …>功能:指定数据包的多个目的端口,也可以以port1:port2的形式指定一个端口范围。
1.-m multiport --ports <port, port, …>功能:指定数据包的多个端口,包括源端口和目的端口,也可以以port1:port2的形式指定一个端口范围。
1.-m state --state <state>功能:指定满足某一种状态的数据包,state可以是INVALID、ESTABLISHED、NEW和RELATED等,也可以是它们的组合,用","分隔。
1.-m connlimit --connlimit-above <n>功能:用于限制客户端到一台主机的TCP并发连接总数,n是一个数值。
1.-m mac --mac-source <address>功能:指定数据包的源MAC地址,address是xx:xx:xx:xx:xx:xx形式的48位数。
-m选项可以提供的模块名和子选项内容非常多,为iptables提供了非常强大、细致的功能,所有的模块名和子选项可以通过"man iptables"命令查看iptables命令的手册页获得。