一 概述
iptables 其实不是真正的防火墙,我们可以把它理解为一个客户端代理,用户通过iptables 这个代理,将用户的安全设置执行到对应的“安全框架”中,这个安全框架才是真正的防火墙。这个框架的名称叫做netfilter 。
二 五链表(hook)
iptables 工作在用户空间中,定义规则的工具,本身并不算是防火墙。它们定义的规则,可以让在内核空间当中的netfilter来读取,并且实现让防火墙工作。而放入内核的地方必须要是特定的位置,必须是tcp/ip的协议栈经过的地方。而这个tcp/ip协议栈必须经过的地方,可以实现读取规则的地方就叫做 netfilter.(网络过滤器)
而内核在tcp/ip协议经过的地方,选取了5个位置,做了5条规则链,也叫做五个钩子(hook),分别对经过规则链的数据包做了对应的过滤,这5位置 如下图所示
- PRE_ROUTING 进入本机网口接口的数据包
- INPUT 数据包从内核流入用户空间的
- FORWARD 直接内核空间中, 从一个网络接口进来,到另一个网络接口去的
- OUTPUT 数据包从用户空间流出的
- POST_ROUTING 离开本机的网口的数据包
在这五条钩子(规则链)上,会注册很多回调函数,也叫钩子函数,对进到该钩子的数据包,会通过钩子函数处理,返回一个状态给netfilter 包括该数据包的死活。 死活的状态如下几种:
- NF_ACCEPT 继续正常传输数据报。这个返回值告诉 Netfilter:到目前为止,该数据包还是被接受的并且该数据包应当被递交到网络协议栈的下一个阶段。
- NF_DROP 丢弃该数据报,不再传输。
- NF_STOLEN 模块接管该数据报,告诉Netfilter“忘掉”该数据报。该回调函数将从此开始对数据包的处理,并且Netfilter应当放弃对该数据包做任何的处理。但是,这并不意味着该数据包的资源已经被释放。这个数据包以及它独自的sk_buff数据结构仍然有效,只是回调函数从Netfilter 获取了该数据包的所有权.
- NF_QUEUE 对该数据报进行排队(通常用于将数据报给用户空间的进程进行处理)
- NF_REPEAT 再次调用该回调函数,应当谨慎使用这个值,以免造成死循环。
三 四表
除了上面提到的5条链,还会有四张表。
netfilter 是liunx 操作系统核心层内部的一个数据包处理模块,它具有以下功能。
- 网络地址转换
- 数据包内容修改
- 以及数据包过滤
- 连接跟踪
而netfilter具备的以下功能,其实就是对应的每张表的功能
- filter表——过滤数据包
- Nat表——用于网络地址转换(IP、端口)
- Mangle表——修改数据包的服务类型、TTL、并且可以配置路由实现QOS
- Raw表——决定数据包是否被状态跟踪机制处理
四张表也是有优先级的 数据包进来的时候,优先级如下 raw 表 -> Mangle 表->Nat 表 ->filter 表
四 四表五链的关系
每张表可以关联多条链,而且每张表管理的链表都是唯一的,例如nat 和 raw 表各自有各自的PRE_ROUTING链表。
对于filter来讲一般只能做在3个链上:INPUT ,FORWARD ,OUTPUT
对于nat来讲一般也只能做在3个链上:PREROUTING ,OUTPUT ,POSTROUTING
而mangle则是5个链都可以做:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
最后下图可直观反应数据进来时,4表,5链间的关系
首先一条数据进来,会先进到PREROUTING 这条链(hook) ,而raw , mangle , nat 表都有自己的管理的PREROUTING 链的规则,(是自己的链,不是共用),然后按照表的优先级,先匹配raw 表中PREROUTING 链的规则,再是mangle,nat 。在PREROUTING 链 中可能会有个多个钩子函数,这些钩子函数也会按照优先级对数据做相应的处理。每个钩子函数会返回一个状态,通知netfliter 这条数据钩子函数处理后是继续往后面的链传,还是DROP等到操作。既之前提到的返回的几种死活状态
四表中我们常用的就只有filter和nat,所以再来一张鸟哥版精简图:
到这里,你其实对netfilter/iptables 防火墙如何工作的有了个大概了解。其实内核数据包处理就是对这四表五链进行操作,比如说你需要过滤进入本机的数据包,其实就是在filter 表 INPUT 添加一条过滤规则。而怎么添加规则,到内核如何将这条规则生效。是我们下面需要深入的。这里说的怎么添加规则,并不是怎么用iptables 命令添加一条规则,而是iptables 命令添加一条规则,内部是生产了一条怎么样的规则,和对这条规则的如何管理的。
五 规则(iptables 命令)
在说明iptables 源码之前,你必须知道iptables 创建的规则,一条规则包含哪些东西
规则:根据指定的匹配条件来尝试匹配每个流经此处的报文,一旦匹配成功,则由规则后面指定的动作处理。
而一条规则 由 通用匹配+扩展匹配+动作。对应iptables 命令如下
1. 通用匹配
源地址目标地址的匹配
-s:指定作为源地址匹配,这里不能指定主机名称,必须是IP
IP | IP/MASK |