目录

文章目录

  • 目录
  • netfilter 框架
  • netfilter 的组成模块
  • netfilter 的 Hook 机制实现
  • netfilter 的工作原理
    • 规则(Rules)
    • 链(Chains)
    • 表(Tables)
  • 总结链、表和规则的关系
  • netfilter 的数据包处理

netfilter 框架

Netfilter is a framework provided by the Linux kernel that allows various networking-related operations to be implemented in the form of customized handlers. Netfilter offers various functions and operations for packet filtering, network address translation, and port translation, which provide the functionality required for directing packets through a network and prohibiting packets from reaching sensitive locations within a network.

netfilter 是 Linux Kernel 中的一个对数据包进行控制、修改和过滤(Manipulation and Filtering)的框架。netfilter 是最古老的内核框架之一,自 1998 年开始开发,2000 年合并到 2.4.x 内核主线版本中。

netfilter 在 Kernel TCP/IP Stack L3 Layer 实现中设置了若干 Hook(钩子)点,以此对数据包进行拦截、过滤或其他处理。

简而言之,netfilter 的 Hooks 在 IP packets 的必经之路上设置若干个检测点,所有到达这些检测点的 Packets 都必须接受检测,根据检测的结果决定:

  • 放行:不对包进行任何修改,退出检测逻辑,继续后面正常的包处理。
  • 修改:例如修改 IP 地址进行 NAT,然后将包放回正常的包处理逻辑。
  • 丢弃:安全策略或防火墙功能。

netfilter 具有以下功能:

  • 无状态数据包过滤(IPv4、IPv6)。
  • 有状态的数据包过滤(IPv4、IPv6)。
  • 基于协议类型的连接跟踪。
  • NAT、NAPT(IPv4、IPv6)。
  • 灵活可扩展的基础架构。
  • 第三方扩展的 API,例如:被 iptables 调用。

netfilter 的组成模块

netfilter 的 Hook 机制实现

实际上,netfilter 的实现关键就是 Hook 机制。只要具备了 Hook 能力,就能对进出 Kernel 的数据报文进行 Manipulation and Filtering。例如:完全可以使用 BPF Program 来实现一套 netfilter-like 框架。

netfilter 框架具有 5 个 HOOK 点,每个 HOOK 点都会注册一些不同的 Handler 函数,当有数据包经过 Hook 点时, 就会调用相应的 Handlers。

#define NF_IP_PRE_ROUTING    0 /* After promisc drops, checksum checks. */
#define NF_IP_LOCAL_IN       1 /* If the packet is destined for this box. */
#define NF_IP_FORWARD        2 /* If the packet is destined for another interface. */
#define NF_IP_LOCAL_OUT      3 /* Packets coming from a local process. */
#define NF_IP_POST_ROUTING   4 /* Packets about to hit the wire. */
#define NF_IP_NUMHOOKS       5

分别对应下述 5 条链:

  1. PREROUTING:数据包进入路由表之前。
  2. INPUT:通过路由表后目的地为本机。
  3. FORWARD:通过路由表后,目的地不为本机。
  4. OUTPUT:由本机产生,向外发送。
  5. POSTROUTIONG:发送到网卡接口之前。

Hook Handler 对 IP packets 进行判断或处理之后,需要返回一个判断结果,指导接下来要对这个包做什 么。可能的结果有:

// include/uapi/linux/netfilter.h#define NF_DROP   0  // 已丢弃这个包。
#define NF_ACCEPT 1  // 接受这个包,继续下一步处理。
#define NF_STOLEN 2  // 当前处理函数已经消费了这个包,后面的处理函数不用处理了。
#define NF_QUEUE  3  // 应当将包放到队列。
#define NF_REPEAT 4  // 当前处理函数应当被再次调用。

netfilter 的工作原理

netfilter 工作在内核协议栈的 L3 网络层,处理的是 IP 数据包(IP Packet)。

netfilter 存在 3 个层面的概念:

  1. 表(tables):指不同类型的数据包处理流程,为了便于管理,是处理流程类型的逻辑抽象概念。例如:

    • filter table 表示进行数据包过滤;
    • nat table 则针对连接进行网络地址转换(NAT)操作。
  2. 链(chain):每个表中又可以存在多个链,系统按照预订的规则将数据包通过某个内建链,例如:将从本机发出的数据通过 OUTPUT 链。
  3. 规则(rules):在链中可以存在若干规则,这些规则会被逐一进行匹配,如果匹配,则会执行相应的动作。如:修改数据包,或者跳转。跳转可以直接接受该数据包或拒绝该数据包,也可以跳转到其他链继续进行匹配,或者从当前链返回调用者链。当链中所有规则都执行完仍然没有跳转时,将根据该链的默认策略执行对应动作;如果也没有默认动作,则是返回调用者链。

规则(Rules)

规则(Rules)是用户预定义的,例如:我们常说的防火墙规则。配置防火墙的主要工作就是添加、修改和删除这些规则。

数据包的过滤基于 Rule。Rule 主要由一下两个对象组成:

  1. 一个目标/动作(target/action):数据包匹配所有条件后的动作。
  2. 若干个匹配条件(Xmatch):导致该规则可以应用的数据包所满足的条件。

netfilter 根据 Rule 的匹配条件来尝试匹配每个流经此 Rule 的数据包,一旦匹配成功,则启用 Rule 对应的 Action 来对数据包进行处理。

匹配

  • interface(e.g. eth0 或者 eth1)
  • 协议类型(e.g. ICMP、TCP 或者 UDP)
  • Source IP/Destination IP
  • Source Port/Destination Port

目标:可以是用户自定义的链、一个内置的特定目标或者是一个目标扩展。

  • ACCEPT:运行通过。
  • DEOP:直接丢弃。
  • REJECT:拒绝通过。
  • SNAT:源地址转换。
  • DNAT:目标地址转换。
  • MASQUERADE:特殊的 SNAT,适用于动态变更的 IP。
  • LOG:记录日志信息。
  • QUEUE:将数据包移交到用户空间。
  • RETURN:防火墙停止执行当前链中的后续规则,并返回到调用链。
  • REDIRECT:端口重定向。
  • MARK:做防火墙标记。

链(Chains)

链(Chains)是由若干个顺序排列的 Rules 组成的列表。Chain 是一个高层逻辑抽象概念,本质是一种顺序执行的 Rules 的编排方式。在复杂的网络环境中,管理员需求这种可控的、有序执行的 Ruls 编排方式。用户也可以创建自己定义的链,从而使规则集更有效并且易于修改。

默认的,Chain 中不存在任何 Rules,用户可以向 Chain 中添加自己预期的 Rules。Chain 中的 Rules 的 Default Action 通常设置为 ACCEPT,如果想确保任何包都不能通过规则集,则可以重置为 DROP。

注意,Chain 中 Rules 的次序非常关键,检查 Rules 的时候,是按照从上往下的顺序进行的。所以那条 Rule 越严格,就越应该放在靠前。Default Rule 总是在一条 Chain 的最后生效。

iptables 内建了以下 5 条链

  1. INPUT(输入链):发往本机的数据报文通过此链,并执行此链上关于 INPUT 的 Rules,例如:DDoS 攻击防御规则。
  2. OUTPUT(输出链):从本机发出的数据报文通过此链,并执行此链上关于 OUTPUT 的 Rules。
  3. PORWARD(转发链):由本机转发的数据报文通过此链,并执行此链上关于 PORWARD 的 Rules。例如:作为 IP 路由器。
  4. PREROUTING(路由前链):在处理 IP 路由规则前(Pre-Routing)通过此链,并执行此链上关于 Pre-Routing 的 Rules。例如:DNAT。
  5. POSTOUTING(路由后链):在处理 IP 路由规则后(Post-Routing)通过此链,并执行此链上关于 Post-Routing 的 Rules。例如:SNAT。

表(Tables)

链(Chains)是一种高级抽象,为了编排管理多条复杂的 Rules。而表(Table)是面向应用场景的、更高级的抽象,为了管理更多的 Rules。每张表被赋予了不同的应用场景,所以也就内含了不同的 Chains。例如:用户在实际使用 iptables 的过程中,往往是通过 Table 作为操作入口,然后对 Rules 进行定义。

iptables 内建提供了以下五种表

  1. filter 表(默认):提供数据包的过滤功能,例如:用于防火墙规则。
  2. nat 表:提供 NAT 功能,端口映射,地址映射等,例如:用于网关路由器。
  3. mangle 表:提供数据包修改功能,拆解、修改、重新封装数据包。例如:更改 IP Header 的 TOS、DSCP、ECN 位。
  4. raw 表:用来提前标记报文不需要执行一些流程,例如:不需要建会话。
  5. conntrack 表:连接跟踪表,跟踪连接会话,用来实现状态防火墙,NAT 功能的基础,可扩展更多功能。
  6. security 表:用于强制访问控制网络规则。

每张表可挂载的链如下图所示:

总结链、表和规则的关系

简单总结一下三者的关系。

  • Rules 是数据包处理方式的描述
  • Tables 是 Rule 在应用场景的分类组织形式。
  • Chain 是作为 Tables 的挂载点、以及 Table 中 Rules 的有序执行的编排方式。

例如:在 iptables 的应用场景中,5 Chain(链的位置)、5 Table(链与表的挂载关系)实际上是比较固定的。作为用户,我们需要关心的仅仅是如何在特定的 Table 中添加、修改、删除 Rules 来影响数据包在 Linux 操作系统中的流入、流出以及转发即可。

netfilter 的数据包处理


                             ┏╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍┓┌───────────────┐           ┃    Network    ┃│ table: filter │           ┗━━━━━━━┳━━━━━━━┛│ chain: INPUT  │◀────┐             │└───────┬───────┘     │             ▼│             │   ┌───────────────────┐┌      ▼      ┐      │   │ table: nat        ││local process│      │   │ chain: PREROUTING │└             ┘      │   └─────────┬─────────┘│             │             │▼             │             ▼              ┌─────────────────┐
┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅    │     ┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅      │table: nat       │Routing decision      └─────Routing decision ─────▶│chain: PREROUTING│
┅┅┅┅┅┅┅┅┅┳┅┅┅┅┅┅┅┅┅          ┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅      └────────┬────────┘│                                                   │▼                                                   │┌───────────────┐                                           ││ table: nat    │           ┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅               ││ chain: OUTPUT │    ┌─────▶Routing decision ◀──────────────┘└───────┬───────┘    │      ┅┅┅┅┅┅┅┅┳┅┅┅┅┅┅┅┅│            │              │▼            │              ▼┌───────────────┐    │   ┌────────────────────┐│ table: filter │    │   │ chain: POSTROUTING ││ chain: OUTPUT ├────┘   └──────────┬─────────┘└───────────────┘                   │▼┏╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍┓┃    Network    ┃┗━━━━━━━━━━━━━━━┛

Linux Kernel TCP/IP Stack — L3 Layer — netfilter 框架相关推荐

  1. Linux Kernel TCP/IP Stack — L3 Layer — netfilter 框架 — iptables NAPT 网络地址/端口转换

    目录 文章目录 目录 网络地址转换(NAT) SNAT DNAT 端口映射(PAT) 网络地址转换(NAT) IP 网络有公网与私网的区分,通常内网使用私网 IP,Internet 使用公网 IP,而 ...

  2. Linux Kernel TCP/IP Stack — L3 Layer — netfilter 框架 — conntrack(CT,连接跟踪)

    目录 文章目录 目录 CT CT CT(conntrack,connection tracking,连接跟踪),顾名思义,就是跟踪(并记录)连接的状态,是许多网络应用的基础.例如:iptables.L ...

  3. Linux Kernel TCP/IP Stack — L3 Layer — netfilter/iptables 防火墙

    目录 文章目录 目录 iptables/netfilter 框架 iptables-service iptables 指令应用 查看规则 添加规则 删除规则 修改规则 保存和加载规则 常规初始化配置 ...

  4. Linux Kernel TCP/IP Stack — L3 Layer

    目录 文章目录 目录 L3 Layer 框架 IP Handler L3 Layer 框架 IP Handler 实现了以下功能: IP 数据包的分片和重组. IP 协议的字段处理,例如:IP 选项, ...

  5. Linux Kernel TCP/IP Stack — L3 Layer — 路由器子系统

    目录 文章目录 目录 Linux 作为一个路由器 路由表项的类型 route 指令 ip route 指令 添加默认路由 添加静态路由 删除静态路由 操作示例 Linux Kernel 路由子系统 路 ...

  6. Linux Kernel TCP/IP Stack — L3 Layer — 邻居发现子系统

    目录 文章目录 目录 邻居发现子系统 邻居发现子系统 提供以下功能: ARP 协议(IPV4) NDP 协议(IPV6) 邻居表新建,更新,老化机制,状态转化等.

  7. Linux Kernel TCP/IP Stack — L2 Layer — Linux Bridge(虚拟网桥)的基本操作

    目录 文章目录 目录 Linux bridge 的基本操作 创建 Bridge 将 veth pair 连上 Bridge 为 Bridge 配置 IP 地址 将物理网卡接口设备挂靠 Bridge L ...

  8. Linux Kernel TCP/IP Stack — L7 Layer — Application Socket I/O 接口类型

    目录 文章目录 目录 基本概念 同步与异步 阻塞与非阻塞 I/O 操作的执行流程 Socket I/O 接口类型 阻塞 IO 缺点 非阻塞 IO 缺点 阻塞 IO 与非阻塞 IO 的区别 IO 多路复 ...

  9. Linux Kernel TCP/IP Stack — L1 Layer — 多队列网卡

    目录 文章目录 目录 多队列网卡 Intel 82575 的多队列硬件实现 Intel 82575 的多队列软件驱动实现 多队列网卡识别 多队列网卡 多队列网卡,是一种用来解决网络 I/O QoS 问 ...

最新文章

  1. ITCAST视频-Spring学习笔记(使用JDK中的Proxy技术实现AOP功能)
  2. 处理2D图像和纹理——显示文字
  3. linux内核杂记(6)-进程调度(1)
  4. 地表地形对地下温度及地表热流的影响
  5. HDbaseT 高清传输更简单——只需一根网线
  6. Python学习1 基础语法 数据类型 计算机基础
  7. BZOJ1044: [HAOI2008]木棍分割(dp 单调队列)
  8. 切换回Chrome上的上次标签及打开设置快捷键
  9. 操作系统—基本分页存储管理的基本概念
  10. 关于宏定义的一些用法
  11. 深圳市及各区人才补贴
  12. 移动端环境搭建--2
  13. PyTorch-05神经网络与全连接(Logistic Regression、交叉熵、交叉熵来优化一个多分类的问题、全连接层(MLP网络层)、激活函数与GPU加速、测试、Visdom可视化)
  14. 合格硕士学位论文的工作量
  15. DPark安装及相关资料整理
  16. 图说卡尔曼滤波(正在进行时)
  17. Gremlin提交参数过多导致:The max number of supported arguments is 255, but found的错
  18. java 组合优与继承_Java中为什么老鸟要告诉你优先使用组合而不是继承?
  19. eNSP:软件下载链接
  20. [论文解析] NeRDi: Single-View NeRF Synthesis with Language-Guided Diffusion as General Image Priors

热门文章

  1. Android图片缓存框架Glide
  2. iOS 11开发教程(十一)了解iOS11应用视图
  3. Xamarin.Forms支持的地图显示类型
  4. 分享Kali Linux 2016.2第45周VMware虚拟机
  5. Swift2.0语言教程之Swift2.0语言中的标准函数
  6. itstime后面跟什么_一文讲透什么是引流
  7. 6 js 比较两个数组的差异_每天一道算法题(js)(3)——寻找两个有序数组的中位数...
  8. 脑机接口应用于驾驶员的疲劳状态检测综述
  9. java对象头_浅谈java对象结构 对象头 Markword
  10. 无需用眼,大脑直接成像,失明的人也能重新「看见」|Science