首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Netfileter & iptables 实现(一)— Netfilter实现

Netfilter挂载点) 在 图1 中,蓝色部分就是 Netfilter 挂载钩子函数的位置,所以 Netfilter 定义了 5 个常量来表示这 5 个位置,如下代码: // 文件:include/linux...要触发调用某个挂载点上(链)的所有钩子函数,需要使用 NF_HOOK 宏来实现,其定义如下: // 文件:include/linux/netfilter.h #define NF_HOOK(pf, hook...既然 Netfilter 是通过调用 NF_HOOK 宏来调用钩子函数链表上的钩子函数,那么内核在什么地方调用这个宏呢?...return NF_HOOK(PF_INET, NF_IP_PRE_ROUTING, skb, dev, NULL, ip_rcv_finish); } 如上代码所示,在 ip_rcv 函数中调用了 NF_HOOK...六、总结 本文主要介绍了 Netfilter 的实现,因为 Netfilter 是 Linux 网络数据包过滤的框架,而 iptables 就是建立在 Netfilter 之上的。

1.3K20
您找到你想要的搜索结果了吗?
是的
没有找到

(一)洞悉linux下的Netfilter&iptables:什么是Netfilter?

Netfilter是Linux 2.4.x引入的一个子系统,它作为一个通用的、抽象的框架,提供一整套的hook函数的管理机制,使得诸如数据包过滤、网络地址转换(NAT)和基于协议类型的连接跟踪成为了可能...Netfilter使用NF_HOOK(include/linux/netfilter.h)宏在协议栈内部切入到Netfilter框架中。...相比于2.4版本,2.6版内核在该宏的定义上显得更加灵活一些,定义如下: #define NF_HOOK(pf, hook, skb, indev, outdev, okfn) \...在include/linux/socket.h中IP协议AF_INET(PF_INET)的序号为2,因此我们就可以得到TCP/IP协议族的钩子函数挂载点为: PRE_ROUTING: nf_hooks...小节:整个Linux内核中Netfilter框架的HOOK机制可以概括如下: 在数据包流经内核协议栈的整个过程中,在一些已预定义的关键点上PRE_ROUTING、LOCAL_IN、FORWARD、LOCAL_OUT

1.8K20

深入理解 netfilter 和 iptables!

Netfilter 的设计与实现 netfilter 的定义是一个工作在 Linux 内核的网络数据包处理框架,为了彻底理解 netfilter 的工作方式,我们首先需要对数据包在 Linux 内核中的处理路径建立基本认识...hook 触发点 对于不同的协议(IPv4、IPv6 或 ARP 等),Linux 内核网络栈会在该协议栈数据包处理路径上的预设位置触发对应的 hook。...所有接收数据包到达的第一个 hook 触发点(实际上新版本 Linux 增加了 INGRESS hook 作为最早触发点),在进行路由判断之前执行。...NF_HOOK 宏和 netfilter 向量 所有的触发点位置统一调用 NF_HOOK 这个宏来触发 hook: static inline int NF_HOOK(uint8_t pf, unsigned...回归到源码,IPv4 内核网络栈会在以下代码模块中调用 NF_HOOK(): NF_HOOK 实际调用方式以 `net/ipv4/ip_forward.c`[1] 对数据包进行转发的源码为例,在 ip_forward

87920

深入理解 netfilter 和 iptables

Netfilter 的设计与实现 netfilter 的定义是一个工作在 Linux 内核的网络数据包处理框架,为了彻底理解 netfilter 的工作方式,我们首先需要对数据包在 Linux 内核中的处理路径建立基本认识...hook 触发点 对于不同的协议(IPv4、IPv6 或 ARP 等),Linux 内核网络栈会在该协议栈数据包处理路径上的预设位置触发对应的 hook。...所有接收数据包到达的第一个 hook 触发点(实际上新版本 Linux 增加了 INGRESS hook 作为最早触发点),在进行路由判断之前执行。...NF_HOOK 宏和 netfilter 向量 所有的触发点位置统一调用 NF_HOOK 这个宏来触发 hook: static inline int NF_HOOK(uint8_t pf, unsigned...回归到源码,IPv4 内核网络栈会在以下代码模块中调用 NF_HOOK(): NF_HOOK 实际调用方式以 net/ipv4/ip_forward.c[1] 对数据包进行转发的源码为例,在 ip_forward

53020

OVS BUG撸码回忆录 •上篇

linux内核为了高性能,很喜欢用rwlock的改进版rcu,这种思想是值得借鉴的。         ...switch (rx_handler(&skb)) // 交给rx_handler处理,例如ovs, linux bridge等 此类接口处理报文在协议栈之前,因此netfilter对此类接口不起作用,...所以在云环境(openstack)中,需要在虚拟机tap口与虚拟交换机之间增加Linux bridge设备来使报文经过协议栈(netfilter起作用)来实现security group。...         } }->deliver_skb{          pt_prev->func // 如ip,则对应的就是ip_rcv ---- 进入第三层 } ip_rcv {     return NF_HOOK...ip_defrag(skb, IP_DEFRAG_LOCAL_DELIVER))                            return 0;          }          return NF_HOOK

1.3K70

网络数据包的接收过程

Linux 网络架构 Linux 网络初始化 网络设备子系统初始化 网卡驱动初始化 协议栈初始化 数据包的接收过程 硬中断处理 ksoftirqd 软中断处理 协议栈处理 应用层处理 总结 这里深度理解一下在...Linux 网络架构 在Linux内核实现中,链路层协议靠网卡驱动来实现,内核协议栈来实现网络层和传输层。内核对更上层的应用层提供socket接口来供用户进程访问。...Linux 网络初始化 网络设备子系统初始化 linux内核通过调用subsys_initcall来初始化各个子系统,其中网络子系统的初始化会执行到net_dev_init函数: //net/core/...net = dev_net(dev); skb = ip_rcv_core(skb, net); if (skb == NULL) return NET_RX_DROP; return NF_HOOK...NFPROTO_IPV4, NF_INET_PRE_ROUTING, net, NULL, skb, dev, NULL, ip_rcv_finish); } 这里NF_HOOK

18710

网络数据包的接收过程

Linux 网络架构 Linux 网络初始化 网络设备子系统初始化 网卡驱动初始化 协议栈初始化 数据包的接收过程 硬中断处理 ksoftirqd 软中断处理 协议栈处理 应用层处理 总结 这里深度理解一下在...Linux 网络架构 在Linux内核实现中,链路层协议靠网卡驱动来实现,内核协议栈来实现网络层和传输层。内核对更上层的应用层提供socket接口来供用户进程访问。...Linux 网络初始化 网络设备子系统初始化 linux内核通过调用subsys_initcall来初始化各个子系统,其中网络子系统的初始化会执行到net_dev_init函数: //net/core/...net = dev_net(dev); skb = ip_rcv_core(skb, net); if (skb == NULL) return NET_RX_DROP; return NF_HOOK...NFPROTO_IPV4, NF_INET_PRE_ROUTING, net, NULL, skb, dev, NULL, ip_rcv_finish); } 这里NF_HOOK

24010
领券