Netfilter/Iptables
linux iptables是由两个组件组成:Netfilter和Iptables组成:
Netfilter组件称之为内核空间,是linux内核的一部分,是在Linux内核中为拦截额操作数据包提供的一套框架。其框架包含以下三部分:
1:为每种网络协议(IPV4,IPv6等)定义一套HOOK函数,这些HOOK函数在数据包流过IP协议栈的几个关键点被调用。在这几个点钟,协议栈将把数据包及HOOK函数标号作为参考调用Netfilter框架。
2:内核的任何模块可以对每种协议的一个或多个HOOK函数进行注册以实现挂接,这样当某个数据包被传递给Netfilter框架时,内核能检测是否有哪个模块对该协议和HOOK函数进行了注册。若注册了,则调用该模块,这样这些模块就有机会检查该数据包丢弃/修改/传入用户空间的队列。
3:那些在用户控件队列中排队的数据包是被传递给用户空间异步的处理。
IPV4中定义了5个HOOK,如图
Netfilter根据网络报文的流向,分为三部分:流入,流经,流出。
在以下几个点插入处理过程:
NF_IP_PRE_ROUTING,在报文作路由以前执行;
NF_IP_FORWARD,在报文转向另一个NIC以前执行;
NF_IP_POST_ROUTING,在报文流出以前执行;
NF_IP_LOCAL_IN,在流入本地的报文作路由以后执行;
NF_IP_LOCAL_OUT,在本地报文做流出路由前执行。
当这些HOOK函数被经过的数据包调用时将返回下列值之一,告知Netfilter如果对数据包采取相应动作。
NF_ACCEPT 继续正常的报文处理
NF_STOLEN 由HOOK函数处理了该报文,不要再继续传送
NF_REPEAT 再次调用该HOOK函数
Iptables用户空间工具
iptables 组件是一种工具,也称为用户空间。它使插入、修改和除去信息包过滤表中的规则变得容易。这些规则存储在表的对象中。
Table 表
1. filter表
该表的作用主要用于包过滤。它在LOCAL_IN,FORWARD,LOCAL_OUT三处HOOK函数进行了注册。
2.Nat表
该表的作用主要用于地址转换。它在PRE_ROUTING,POST_ROUTING两处HOOK函数进行了注册。
3.Mangle表
该表的作用是进行数据包内容的修改。它在Netfilter的所有5个HOOK函数进行了注册。
表与链的关系:
Table |
Chain |
Filter |
INPUT |
Filter |
FORWARD |
Filter |
OUTPUT |
Nat |
PREROUTING |
Nat |
OUTPUT |
Nat |
POSTOUTING |
Mangle |
PREROUTING |
Mangle |
INPUT |
Mangle |
OUTPUT |
Mangle |
FORWARD |
Mangle |
POSTROUTING |
Target 目标
链的每个规则都会有一个目标,目标决定了该规则对数据包如何处理。
常用目标:
ACCEPT:允许
DROP:拒绝
REJECT:同DROP一样,不过它会向发送方返回个错误信息