Netfilter/Iptables

 

linux iptables是由两个组件组成:NetfilterIptables组成:

Netfilter组件称之为内核空间,是linux内核的一部分,是在Linux内核中为拦截额操作数据包提供的一套框架。其框架包含以下三部分:

1:为每种网络协议(IPV4IPv6等)定义一套HOOK函数,这些HOOK函数在数据包流过IP协议栈的几个关键点被调用。在这几个点钟,协议栈将把数据包及HOOK函数标号作为参考调用Netfilter框架。

2:内核的任何模块可以对每种协议的一个或多个HOOK函数进行注册以实现挂接,这样当某个数据包被传递给Netfilter框架时,内核能检测是否有哪个模块对该协议和HOOK函数进行了注册。若注册了,则调用该模块,这样这些模块就有机会检查该数据包丢弃/修改/传入用户空间的队列。

3:那些在用户控件队列中排队的数据包是被传递给用户空间异步的处理。

IPV4中定义了5HOOK,如图  

Iptables——了解Netfilter/Iptables_服务器

Netfilter根据网络报文的流向,分为三部分:流入,流经,流出。

在以下几个点插入处理过程:

NF_IP_PRE_ROUTING,在报文作路由以前执行;

NF_IP_FORWARD,在报文转向另一个NIC以前执行;

NF_IP_POST_ROUTING,在报文流出以前执行;

NF_IP_LOCAL_IN,在流入本地的报文作路由以后执行;

NF_IP_LOCAL_OUT,在本地报文做流出路由前执行。

分析:当网络上的数据包从左边进入系统,数据包经过第一个点调用HOOK函数NF_IP_PRE_ROUTING进行处理;然后就进入本地路由表,查看该数据包是需要转发还是发给本地;若该数据包时发往本地的,则该数据包经过HOOK函数NF_IP_LOCAL_IN处理以后传递给上层协议;若该数据包是需要转发,则会被NF_IP_FORWARD处理;经过转发的数据包最后由NF_IP_POST_ROUTING处理后发送到网络上;本地产生的数据经过路由选择后,调用NF_IP_LOCAL_OUT进行处理,然后经过NF_IP_POST_ROUTING处理后发送到网络上。

当这些HOOK函数被经过的数据包调用时将返回下列值之一,告知Netfilter如果对数据包采取相应动作。

NF_ACCEPT    继续正常的报文处理

NF_DROP      丢弃报文

NF_STOLEN    HOOK函数处理了该报文,不要再继续传送

NF_QUEUE     将报文入列,通常交由用户程序处理

NF_REPEAT    再次调用该HOOK函数

 

Iptables用户空间工具

iptables 组件是一种工具,也称为用户空间。它使插入、修改和除去信息包过滤表中的规则变得容易。这些规则存储在表的对象中。

Table

1 filter

该表的作用主要用于包过滤。它在LOCAL_INFORWARDLOCAL_OUT三处HOOK函数进行了注册。

2Nat

该表的作用主要用于地址转换。它在PRE_ROUTINGPOST_ROUTING两处HOOK函数进行了注册。

3Mangle

该表的作用是进行数据包内容的修改。它在Netfilter的所有5HOOK函数进行了注册。

Chain

 在每张表中,内核使用链管理数据包,每个链中包含了一组规则表。

表与链的关系:

Table

Chain

Filter

INPUT

Filter

FORWARD

Filter

OUTPUT

Nat

PREROUTING

Nat

OUTPUT

Nat

POSTOUTING

Mangle

PREROUTING

Mangle

INPUT

Mangle

OUTPUT

Mangle

FORWARD

Mangle

POSTROUTING

 INPUT=HOOK函数 LOCALIN

 OUTPUT=HOOK函数 LOCALOUT

 PREROUTING=HOOK函数 PREROUTING

 POSTROUTING=HOOK函数 POSTROUTING

  FORWARD=HOOK函数 FORWARD

 链的名字与HOOK函数名相似,链的作用和位置也与HOOK函数相吻合,可以说链就是实现HOOK函数调用的方式。

Target 目标

链的每个规则都会有一个目标,目标决定了该规则对数据包如何处理。

常用目标:

ACCEPT:允许

DROP:拒绝

REJECT:同DROP一样,不过它会向发送方返回个错误信息