linux 内核 netfilter 网络过滤模块 (1)-框架

走进Linux内核之Netfilter框架 而 okfn 设置为 ip_rcv_finish,也就是说,当 NF_IP_PRE_ROUTING 链上的所有钩子函数都成功对数据包进行处理后,将会调用 ip_rcv_finish 函数来继续对数据包进行处理。在用户态层面,根据不同的协议类型,为上层用户提供了不同的系统调用工具,比如我们常用的针对IPv4协议iptables,IPv6 协议的ip6tables,针对ARP协议的arptables,针对网桥控制的ebtables,针对网络连接追踪的conntrack等。 阅读详情

1. netfilter框架

Netfilter 是Linux内核中进行数据包过滤、连接跟踪、地址转换等的主要实现框架。当我们希望过滤特定的数据包或者需要修改数据包的内容再发送出去,这些动作主要都在netfilter中完成。

iptables工具就是用户空间和内核的Netfilter模块通信的手段,iptables命令提供很多选项来实现过滤数据包的各种操作,所以,我们在定义数据包过滤规则时,并不需要去直接修改内核中的netfilter模块,后面会讲到iptables命令如何作用于内核中的netfilter。

Netfilter的实质就是定义一系列的hook点(挂钩),每个hook点上可以挂载多个hook函数,hook函数中就实现了我们要对数据包的内容做怎样的修改、以及要将数据包放行还是过滤掉。数据包进入netfilter框架后,实际上就是依次经过所有hook函数的处理,数据包的命运就掌握在这些hook函数的手里。

本文基于内核版本2.6.31。

所有的hook点都放在一个全局的二维数组,每个hook点上的hook函数按照优先级顺序注册到一个链表中,注册的接口为nf_register_hook()。这个二维数组的定义如下:

struct list_head nf_hooks[NFPROTO_NUMPROTO][NF_MAX_HOOKS]__read_mostly;

其中NFPROTO_NUMPROTO 为netfilter支持的协议类型:

enum {
   NFPROTO_UNSPEC=  0,
   NFPROTO_IPV4   =  2,
   NFPROTO_ARP    =  3,
   NFPROTO_BRIDGE=  7,
   NFPROTO_IPV6   = 10,
   NFPROTO_DECNET= 12,
   NFPROTO_NUMPROTO,
};

我们看到枚举值并不连续,这是为了和协议族定义的值保持一致,因为注册hook函数的时候是根据协议族来注册的,如PF_INET=2,则对应的NFPROTO_IPV4=2。

NF_MAX_HOOKS是每种协议最多可挂的hook点的个数,它的值是8。如IPv4挂了5个,分别为:

enum nf_inet_hooks {
   NF_INET_PRE_ROUTING,
   NF_INET_LOCAL_IN,
   NF_INET_FORWARD,
   NF_INET_LOCAL_OUT,
   NF_INET_POST_ROUTING,
   NF_INET_NUMHOOKS
};

也就是说,对于IPv4协议来讲,一共有5个hook点,这5个hook点上注册的hook函数放在下列链表中:

Hook点

该hook点上注册的hook函数链表的表头

NF_INET_PRE_ROUTING

nf_hooks[NFPROTO_IPV4][ NF_INET_PRE_ROUTING]

NF_INET_LOCAL_IN

nf_hooks[NFPROTO_IPV4][ NF_INET_LOCAL_IN]

NF_INET_FORWARD

nf_hooks[NFPROTO_IPV4][ NF_INET_FORWARD]

NF_INET_LOCAL_OUT

nf_hooks[NFPROTO_IPV4][ NF_INET_LOCAL_OUT]

NF_INET_POST_ROUTING

nf_hooks[NFPROTO_IPV4][ NF_INET_POST_ROUTING]

对于发往本地的数据包,会依次经过NF_INET_PRE_ROUTING和NF_INET_LOCAL_IN两个hook点的处理。

对于本地向外发出去的数据包,会依次经过NF_INET_LOCAL_OUT和NF_INET_POST_ROUTING两个hook点的处理。

对于经过本机转发的数据包,会依次经过F_INET_PRE_ROUTING、NF_INET_FORWARD和NF_INET_POST_ROUTING三个hook点的处理。

 

2. netfilter中的表

为了便于和用户态的iptables命令交互,引入了表的概念,iptables命令定义了各种规则,这些规则的目的就是对数据包进行过滤和处理。为了将规则分类,在内核中,用户设置的规则被放到了不同的表中。同时也方便管理和查找规则。

netfilter中的表存放在&init_net->xt.tables[NFPROTO_NUMPROTO]链表数组中,tables是一个list_head类型的链表,NFPROTO_NUMPROTO是一个枚举类型,包括各协议族,上面已经提到过。

可以看出每个协议有单独的链表来存放自己所有的netfilter的表,例如IPv4一共有5张表:

filter表:对数据包进行过滤。

NAT表:对数据包进行地址转换。

mangle表:主要用来修改数据包。

security表:用于实现强制访问控制安全模型。

raw表:其他各种用途。

常用的两个表就是filter表(用来进行数据包过滤)和NAT表(NAT转换规则以及作用于连接跟踪)。

而hook函数就是去遍历这些表中的规则,并根据这些规则去处理数据包。

这些表都是struct xt_table类型的。例如ipv4的netfilter表称为iptables,可以在&init_net ->ipv4中找到,如下:

struct xt_table	*iptable_filter;
struct xt_table	*iptable_mangle;
struct xt_table	*iptable_raw;
struct xt_table	*arptable_filter;
struct xt_table	*iptable_security;
struct xt_table	*nat_table;

表结构的注册通过xt_register_table()函数完成,注册的表都放在&init_net ->xt.tables[]链表数组中。

而查找和执行表的规则是通过xxt_do_table()完成的,如ipt_do_table()、ip6t_do_table()、arpt_do_table()。

我们暂时只关心ipv4,通过ipt_do_table()函数的调用者我们可以看到哪些hook点会去查找哪些表:

caller

module

hook点

priority

table

ipt_local_in_hook

iptable filter

NF_INET_LOCAL_IN

NF_IP_PRI_FILTER

filter

ipt_hook

iptable filter

NF_INET_FORWARD

NF_IP_PRI_FILTER

filter

ipt_local_out_hook

iptable filter

NF_INET_LOCAL_OUT

NF_IP_PRI_FILTER

filter

ipt_pre_routing_hook

iptables mangle

NF_INET_PRE_ROUTING

NF_IP_PRI_MANGLE

mangle

ipt_local_in_hook

iptables mangle

NF_INET_LOCAL_IN

NF_IP_PRI_MANGLE

mangle

ipt_forward_hook

iptables mangle

NF_INET_FORWARD

NF_IP_PRI_MANGLE

mangle

ipt_local_hook

iptables mangle

NF_INET_LOCAL_OUT

NF_IP_PRI_MANGLE

mangle

ipt_post_routing_hook

iptables mangle

NF_INET_POST_ROUTING

NF_IP_PRI_MANGLE

mangle

ipt_local_in_hook

iptables security

NF_INET_LOCAL_IN

NF_IP_PRI_SECURITY

security

ipt_forward_hook

iptables security

NF_INET_FORWARD

NF_IP_PRI_SECURITY

security

ipt_local_out_hook

iptables security

NF_INET_LOCAL_OUT

NF_IP_PRI_SECURITY

security

ipt_hook

iptables raw

NF_INET_PRE_ROUTING

NF_IP_PRI_RAW

raw

ipt_local_hook

iptables raw

NF_INET_LOCAL_OUT

NF_IP_PRI_RAW

raw

nf_nat_rule_find

nat

NAT的4个hook点

NF_IP_PRI_NAT_DST/

NF_IP_PRI_NAT_SRC

nat

可以看到iptable有5张表:filter、mangle、security、raw和nat表。这些表中的规则可以通过用户态的iptables程序来配置,netfilter中的hook函数会去根据用户配置的iptables规则来处理数据包。

上图是IPv4协议中每个hook点上注册的hook函数(虚线框中的函数,按照箭头方向的优先级顺序被调用),注意,图中假设security/mangle/raw这三个表中没有规则,所以没有相应的hook函数。netfilter的入口点为ip_rcv()函数。图中有四种hook函数:

1. 紫色的两个函数用来对分片包进行重组。

2. 蓝色的四个函数用来实现数据包的连接跟踪(conntrack)模块。

3. 绿色的三个函数用来用来进行数据包的过滤(查找filter表中的规则)。

4. 粉色的四个函数用来实现NAT地址转换(查找NAT表中的规则)。

 

3. 遍历hook函数

上一节我们看到了每个hook点上都注册了哪些hook函数,每当数据包经过某个hook点时,netfilter就遍历这个hook上的所有hook函数来处理数据包。遍历的宏为:

NF_HOOK(pf, hook, skb, indev, outdev, okfn)

参数解释:

pf:协议族,如PF_INET对应IPv4。

hook:指明要遍历那个hook点,如NF_INET_PRE_ROUTING。

skb:待处理的数据包的sk_buff结构指针。

indev:数据包的来源设备。

outdev:数据包的目的去向设备。

okfn:函数指针。如果数据包成功走完hook点上的所有hook函数,接下来执行okfn函数,函数名一般名为xxx_finish。

NF_HOOK()调用nf_hook_slow()来执行遍历动作,其实现就是去遍历注册到nf_hooks[pf][hook]链表中的hook函数并执行,根据返回结果来决定数据包的去向。

hook函数返回值的说明:

  • NF_ACCEPT: 接受分组,使之穿过网络实现中剩余的协议层(或该hook点上后续的hook函数)。
  • NF_STOLEN: 挂钩函数窃取了一个分组,并处理了该分组,此时,该分组已与内核无关,不必再调用其他挂钩,还必须取消其他协议层的处理。
  • NF_DROP: 丢弃分组,其中的数据可以释放了。
  • NF_QUEUE: 将分组置于一个等待队列上,以便其数据可以由用户空间代码处理。不会执行其他hook函数。
  • NF_REPEAT: 再次调用该hook函数。

 

4. netfilter的一些补充

※.  每个hook代码都分为两部分,即hook函数和xx_finish()函数,这样做,是因为编译内核时可以选择不编译netfilter模块,xx_finish函数的内容是即使没有netfilter模块,内核也要必须对数据包做的事情。

※.  netfilter可以指定一个优先级,低于这个优先级的hook函数不被执行,nf_hook_thresh(..., int thresh, int cond)函数的thresh参数就是优先级。同时还可以通过cond参数(取0或1)更干脆的取消整个链的遍历。

※.  我们发现遍历hook的代码都放在函数的最后,如下面代码中的ip_forward_finish函数,

NF_HOOK(PF_INET, NF_INET_FORWARD, skb, skb->dev,rt->u.dst.dev, ip_forward_finish);

这样的话,ip_forward_finish函数即使不被声明为inline,其执行效率也挺高,因为GNU C有一个尾部过程调用的优化,省去了函数返回的开销。

※.  hook点NF_INET_PRE_ROUTING在协议收包时进入。而NF_INET_LOCAL_OUT在上层发包的时候进入,在ip_push_pending_frames(),ip_queue_xmit()和raw_send_hdrine()等函数会去走该hook点。

后面几篇文章会依次介绍netfilter中的连接跟踪和NAT模块,并分析用户态的iptables工具是如何作用于netfilter的,为了方便和netfilter交互,iptables工具中也有表(table)的概念,并将hook点称为链(chain)。

 

 

 

Linux协议栈-netfilter(1)-框架 1. netfilter框架 Netfilter 是内核中进行数据包过滤,连接跟踪,地址转换等的主要实现框架。当我们希望过滤特定的数据包或者需要修改特定数据包的某些内容再发送出去,这些动作主要都在netfilter中完成。 iptables工具就是用户空间和内核的Netfilter模块通信的手段,iptables命令提供很多选项来实现过滤数据包的各种操作,后面会讲到iptables命令如何 阅读详情

相关推荐

linux Netfilter在网络层的实现详细分析(iptables)

本文来详细分析linux netfilter在网络层的实现细节,本文代码分析是基于Linux内核版本4.18.0-80(也即centos8.0系统上)。我画了一张linux内核协议栈网络层netfilter(iptables)的全景图,里面涉及内容比较多,本文会详细讲解。

weixin_42915431的博客 1万+

【博客587】ipvs hook点在netfilter中的位置以及优先级

根据定义,ipvs挂载在LOCAL_IN、FORWORD和LOCAL_OUT的hook点上了,根据优先级,我们得到以下结论:1、INPUT:ipvs的hook会在Filter TABLE 后执行,然后转到NAT TABLE2、OUTPUT:ipvs的hook会在NAT TABLE ,然后转到Filter TABLE3、FORWARD:ipvs的hookFilter TABLE后执行,然后结束整个FORWARD,包往POSTROUTING走。

qq_43684922的博客 2914

Linux 网络层收发包流程及 Netfilter 框架浅析

本文作者:sivenzhang,腾讯 IEG 测试开发工程师1. 前言本文主要对 Linux 系统内核协议栈中网络层接收,发送以及转发数据包的流程进行简要介绍,同时对 N...

腾讯技术工程 2222

Netfilter实验

利用netfilter过滤http报文,获取POST请求中的name和password。

Zzxy 1232

netfilter按IP过滤报文

2.6版内核的网络协议栈较2.4版有所改变,比如sk_buff结构中去掉了nh联合体的定义。在2.6内核中我们如果要得到ip数据包的源节点地址, 需要使用const struct iphdr *iph = ip_hdr(skb); ip_hdr 的定义在linux/ip.h中定义。下面通过一个简单的例子介绍在2.6内核中如何在netfilter上挂载hook函数实现数据包的过滤。

Walter的专栏 1615

netfilter之nat

netfilter nat实现分析

fengcai_ke的博客 899

内核子系统 nf_tables 深度解析

nf_tables 作为 Linux 内核网络过滤的未来方向,已经成为主流发行版的默认选择(如 RHEL 8+、Ubuntu 20.04+)。它通过统一框架、高性能匹配、原子更新等特性,解决了传统 iptables 的诸多痛点,同时保持对 Netfilter 钩子机制的完全兼容,为用户提供了更强大、更灵活的网络安全管理能力。随着内核版本的不断更新,nf_tables 持续引入新功能(如 flowtable 加速、更复杂的表达式支持),进一步巩固其在 Linux 防火墙领域的主导地位。

JiaWen的博客 444

STM32----SPI+DMA高效读写外部Flash的配置与实战

本文详细介绍了STM32通过SPI+DMA高效读写外部Flash的配置与实战方法。针对大量数据传输场景,使用DMA技术可显著提升系统效率,释放CPU资源。文章包含完整的代码实现、常见问题调试技巧以及性能优化建议,帮助开发者快速掌握这一关键技术。

pea55的博客 1031

Netfilter技术深度解析:Linux内核网络过滤的核心框架

Netfilter是Linux内核中用于网络数据包处理的框架,自2.4.x内核版本起成为核心组件。它通过在内核协议栈中预定义的钩子点(Hook Points)插入自定义处理逻辑,实现对数据包的过滤、修改和重定向。作为Linux防火墙的基础,Netfilter支持数据包过滤网络地址转换(NAT)连接跟踪等核心功能,广泛应用于网络安全、负载均衡和网络调试等领域。Netfilter作为Linux网络栈的核心,提供了强大的灵活性和控制能力。

心若微尘的博客 1625

代码实现 —— 基于 STM32 的可见光通信系统课程设计

基于STM32F103ZET6,源码如需移植,需要修改定时器捕获通道引脚,及定时器,如果你也有这个课设任务,希望对你有所帮助。

不善挽留 1万+

Windows下用Anaconda安装d2l库避坑指南(附PermissionError解决方案)

本文详细介绍了在Windows系统下使用Anaconda安装d2l库的完整指南,特别针对常见的PermissionError问题提供了多种解决方案。从环境准备到库安装,再到VSCode配置和数据路径处理,帮助读者顺利搭建深度学习环境并运行《动手学深度学习》的代码示例。

3a9bq4r8t2y的博客 225

Linux内核Netfilter框架分析

入站数据包先经过,路由选择后:若发往本地,进入,交付本地应用;若需转发,进入,再经发送。本地生成的出站数据包先经过,再通过发送。这些挂接点为 Netfilter 实现数据包过滤、NAT、流量控制等功能提供了核心支撑。NF_HOOK数据包在内核网络栈中传输时,会在某些地方调用NF_HOOK宏使用挂接函数。pf:协议簇,对于 IPv4 用;对于 IPv6 用。hook:表示 5 个 Netfilter 挂接点之一,如。skb。

m0_74186706的博客 1599

Rclone替代RaiDrive?零广告免费挂载Alist WebDAV到Windows资源管理器(含自启脚本)

本文详细介绍了如何使用开源工具Rclone替代RaiDrive,实现零广告、全免费的Alist WebDAV挂载方案。通过深入解析配置参数、提供完整的自启动解决方案和解决常见问题,帮助用户在Windows资源管理器中高效管理云存储,提升使用体验。

weixin_33709364的博客 640

linux-内核:netfilter框架

Netfilter/IPTables 是 Linux2.4.x 之后新一代的 Linux 防火墙机制,是linux内核的一个子系统。Netfilter 采用模块化设计,具有良好的可扩充性。其重要工具模块 IPTables 从用户态的 iptables 连接 到内核态的 Netfilter 的架构中 , Netfilter 与 IP 协议栈是无缝契合的, 并允许使用者对数据报进行过滤、地址转换、处理等操作。主要源代码文件。

赵凯月的博客 2429

SAP Fiori Launchpad 上看不到任何 tile 应该怎么办?

中心UI组件是一个框架,为所有SAPFiori应用程序提供公共基础设施SAPFiorilaunchpad是所有SAPFioriUI的基础,并为SAPFiori应用程序提供基本功能,如登录,界面大小,应用程序之间的导航,和基于角色的应用程序目录。ABAP前端服务器包含所有基础设施组件,用于为客户端生成SAPFiori应用程序特定的UI,并与SAPBusinessSuite后端系统通信。SAPFiori应用程序的处理过程如下首先,客户端加载SAPFiori应用程序的界面。...

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 946

深度学习实战103-基于KDD Cup 99数据集的搭建神经网络的检测系统(NIDS),通过对网络流量数据进行分析,提供完整代码

接下来,我们定义一个全连接神经网络模型。return x# 创建数据集和数据加载器# 初始化模型通过以上步骤,我们实现了一个基于PyTorch的简单网络入侵检测系统。这个系统使用KDD Cup 99数据集进行训练和评估。实际应用中,您可以根据需求调整模型结构、超参数以及数据预处理方法。希望对大家有所帮助!如果有任何问题或需要进一步的解释,请随时咨询。

微学AI的博客 1582

实现最简单的Netfilter模块(Linux网络数据包过滤模块)

一文实现最简单的Linux Netfilter数据包过滤模块

ych4444的博客 1282

改进YOLOv9的CT图像肺结节检测与分类算法:从原理到实战

本文将详细介绍如何改进YOLOv9算法,使其更好地适应CT图像肺结节检测与分类任务。我们将从数据集准备、模型改进、训练优化到最终部署,完整呈现一个端到端的深度学习项目,并提供完整的代码实现。

YOLO 188

Linux内核中Netfilter架构介绍

Netfilter概述          Netfilter/IPTables是Linux2.4.x之后新一代的Linux防火墙机制,是linux内核的一个子系统。Netfilter采用模块化设计,具有良好的可扩充性。其重要工具模块IPTables从用户态的iptables连接到内核态的Netfilter的架构中,Netfilter与IP协议栈是无缝契合的,并允许使用者对数据报进行过滤、地址转换

瑞风轻拂 2万+

YOLOv11改进 | 添加注意力篇 | 结合2024最新Mamba注意力机制MLLA助力yolov11有效涨点含二次创新C2PSA(全网独家首发改进)

本文给大家带来的改进机制是结合号称超越Transformer架构的Mamba架构的最新注意力机制MLLA,本文将其和我们YOLOv11进行结合,的原理是通过将Mamba模型的一些核心设计融入线性注意力机制,从而提升模型的性能。具体来说,MLLA主要整合了Mamba中的“忘记门”(forget gate)和模块设计(block design)这两个关键因素,同时MLLA通过使用位置编码(RoPE)来替代忘记门,从而在保持并行计算和快速推理速度的同时,提供必要的位置信息。

Snu77的博客 3870

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Linux 内核开发 - NetFilter

Linux 内核开发 - NetFilter

阿呆的隐秘角落 2974

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Linux Netfilter介绍

netfilter 框架由最著名的 Linux 内核开发人员之一 Rusty Russell 于 1998 年创立,作为对 ipchains(Linux 2.2.x)和 ipfwadm(Linux 2.0.x)的旧实现的改进。netfilter 子系统提供了一个框架,你可以在网络堆栈中的数据包遍历过程中的各个点(netfilter hooks)注册回调并对数据包执行各种操作,比如更改地址或端口、丢弃数据包、日志记录等。

weixin_42915431的博客 7826

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Linux 内核源码分析---netfilter 框架

学习记录

学习记录 2158

Netfilter 内核数据包过滤框架

作者:属乌鸦的 原文:http://www.hyuuhit.com/2018/07/15/netfilter/ Netfilter 内核数据包过滤框架 Jul 15, 2018 文章目录 1.协议族 2.hook点 3.裁决值 4.例子 5.实现原理 5.1.注册回调函数 5.2.执行回调函数 Netfilter是linux内核中的数据包过滤框架,2.4版本及其后的内核包含该框架,该框架使数据包过滤、网络地址转换(NAT)和其他数据包修改功能成为可能。Netfilt...

maimang1001的专栏 1157

linux 内核 netfilter 网络过滤模块 (5)-iptables

iptables是用户态的配置工具,用于实现网络层的防火墙,用户可以通过iptables命令设置一系列的过滤规则,来截获特定的数据包并进行过滤或其他处理。 iptables命令通过与内核中的netfilter交互来起作用。我们知道netfilter通过挂在每个hook点上的hook函数来过滤数据包,并且将过滤规则存放在几个表中供hook函数使用。相应的,iptables工具也定义了同样的几张规则...

whatday的专栏 1170
上一篇: linux 内核 调试工具介绍
下一篇: linux 内核 netfilter 网络过滤模块 (2)-conntrack
whatday
博客等级 码龄20年 4460粉丝 96原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值