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