Netfilter框架

一、 Netfilter简介

Netfilter为Linux内核中的数据包处理软件。其提供数据包过滤、网络地址(端口)转换、数据包内容标记、用户空间数据包排队和其它数据包管理功能,由此我们可以通过Netfilter构建有状态/无状态的防火墙、共享同一个公网IP上网、帮助tc和iproute2系统构建复杂的QoS和策略路由等功能。

Netfilter所需的规则是存放在内存中的,iptables可以对内存中的Netfilter规则执行添加、删除及修改等操作。

二、 数据包的处理流程

三、 四表五链

用于过滤数据包的代码内置于内核中,并被组织成一系列的表,每个表都有特定的用途。这些表由一组预定义的链组成,这些链包含按顺序遍历的规则。每个规则由匹配条件(matches)和相应的操作(target)组成,如果匹配条件为真时,将会执行target的操作。

1. 表(Tables)

iptables包含四个表:

  • raw:仅用于配置数据包,使其不受连接跟踪,加快数据包穿过防火墙的速度,提高性能
  • filter:默认的表,通常与防火墙相关的所有操作都在其中发生
  • nat:用于网络地址装换
  • mangle:用于专门的数据包更改

四个表的优先级:raw -> mangle-> nat -> filter

2. 链(Chains)

表由链组成,链是按顺序遵循的规则列表。默认情况下,链中是没有任何规则的,

规则链名包括(也被称为五个钩子函数(hook functions)):

  • INPUT链 :处理输入数据包

  • OUTPUT链 :处理输出数据包

  • FORWARD链 :处理转发数据包

  • PREROUTING链 :用于目标地址转换(DNAT)

  • POSTOUTING链 :用于源地址转换(SNAT)

3. 规则(rules)

数据包过滤基于规则,规则 由多个匹配条件(数据包必须满足的条件才能应用规则)和一个操作(当数据包匹配所有条件时采取的操作)指定。

匹配条件

  • 基本匹配条件:如源地址、目的地址
  • 扩展匹配条件:这些扩展条件也是netfilter的一部分,这件条件以模块的形式存在,如果想要使用这些条件,则需要依赖对应的扩展模块(/lib/modules/kernel_version/kernel/net/nerfilter

操作

通过-j来跳转到该操作,操作可以是用户自定义的链、目标。

  • 目标

    ACCEPT:允许防火墙接收数据包

    DROP:防火墙丢弃数据包

    RETURN:防火墙停止执行当前链中的后续规则,并返回到调用链中

    REJECT:阻拦数据包,并发送数据包通知对方

    MARK:将数据包打上某个标记

    SNAT/DNAT:改写封包源/目的IP为某特定IP或IP范围

    MASQUERADE: 改写数据包源IP为防火墙的接口IP

    LOG:日志记录

  • 自定义的链

    如果目标是内置目标,则立即决定数据包的命运,并停止当前表中数据包的处理。如果目标是用户定义的链,并且数据包的命运不是由第二条链决定的,则将根据原始链的其余规则进行过滤。

4. 模块

有许多模块可用于扩展 iptables,例如 connlimit、conntrack、limit 和centre。这些模块添加了额外的功能以允许复杂的过滤规则。

四、实际配置

显示表中的所有规则

iptables -t filter -S


Netfilter框架
https://weijinkang.github.io/2023/07/31/netfilter-framework/
作者
Jinkang_Wei
发布于
2023年7月31日
许可协议