什么是防火墙?

防火墙,顾名思义就起到阻隔危险的一道墙。在linux中体现为实现访问控制的功能的一种工具,按工作的位置分为主机防火墙和网络防火墙,工作于网络或主机的边缘(通信报文的进出口),对于进出本网络或主机的报文根据事先定义的检查规则作匹配检测,对于能够被规则匹配到的报文作出相应处理。按在实现方式又分为硬件的和软件的防火墙。
iptables的前身叫ipfirewall (内核1.x时代),是从freeBSD上移植过来的,能够工作在内核当中的,对数据包进行检测的一款简易访问控制工具。但是ipfirewall工作功能极其有限,当内核发展到2.x系列的时候,软件更名为ipchains,它可以定义多条规则,将他们串起来,共同发挥作用,而现在,它叫做iptables,可以将规则组成一个列表,实现绝对详细的访问控制功能。
iptables工作在用户空间中,定义规则的工具,本身并不算是防火墙。它们定义的规则,可以让在内核空间当中的netfilter来读取,并且实现让防火墙工作。而放入内核的地方必须要是特定的位置,必须是tcp/ip的协议栈经过的地方。而这个tcp/ip协议栈必须经过的地方,可以实现读取规则的地方就叫做 netfilter.(网络过滤器)

iptables 一共有5个这样的位置

1

1.进入本机的网络接口
2.数据包从内核流入用户空间的
3.内核空间中:从一个网络接口进来,到另一个网络接口去的
4.数据包从用户空间流出到内核空间的
5.离开本机的网络接口

这五个位置也被称为五个钩子函数(hook functions),也叫五个规则链。

    1.PREROUTING (路由前)
    2.INPUT (数据包流入口)
    3.FORWARD (转发关卡)
    4.OUTPUT(数据包出口)
    5.POSTROUTING(路由后)

这是NetFilter规定的五个内置规则链,任何一个数据包,只要经过本机,必将经过这五个链中的其中一个链。另外还有自定义链,自定义链是起到对内置链拓展和补充的功能,实现规则片段化管理的目的,自定义链必须被这五个链调用才能生效。

数据报文流向:

        流入本机:prerouting --> input ==> 用户空间进程;
        流出本机:用户空间进程==> output --> postrouting; 
        转发:prerouting --> forward --> postrouting;

防火墙策略

当我们定义策略的时候,要分别定义多条功能,其中:定义数据包中允许或者不允许的策略,是filter过滤的功能,而定义地址转换的功能的则是nat选项。为了让这些功能交替工作,我们制定出了“表”这个定义,来定义、区分各种不同的工作功能和处理方式。

iptables一共有4表

分别是:filter:过滤,mangle;拆解报文,按需修改,nat:IP层地址和传输层地址转换,raw:关闭中nat表上启用的连接追踪机制.

按表能使用在那些链上面的对应关系。
filter:INPUT,FORWARD,OUTPUT
mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
nat:PREROUTING,INPUT,OUTPUT,POSTROUTING;
raw:PREROUTING,OUTPUT

同一链上的不同的表的规则的应用优先级(高-->低):
raw
managle
nat
filter
一般定义策略常使用的表就是filter和nat这两个。

iptables策略

组成部分:根据策略的匹配条件尝试匹配报文,对匹配成功的报文根据策略定义的处理动作做出处理
匹配条件:基本匹配,扩展匹配
处理动作(target):基本处理动作,扩展处理动作,自定义处理动作

策略的写法:

iptables定义策略的方式比较复杂:
命令格式:iptables [-t table] SUBCOMMAND chain [matches...] [target]
-t table:raw, mangle, nat, [filter]
SUBCOMMAND:定义如何对规则进行管理
chain:指定你接下来的规则到底是在哪个链上操作的
CRETIRIA:指定匹配标准
-j ACTION :指定如何进行处理

SUBCOMMAND:

链管理:

                -N: new,新增一条自定义链;
                -X:delete,删除自定义的空链;
                -P:policy,设置链的默认策略;
                    可设置的默认策略:
                    ACCEPT:接受
                    DROP:丢弃
                    REJECT:拒绝
                -E:rename,重命名自定义的未被引用(引用计数为0)的链;

规则管理:

                -A:append,追加,默认为最后一个;
                -I:insert,插入,默认为第一个;
                -D:delete,删除
                    (1) rule specification
                    (2) rule number 
                -R:replace,替换
                -F:flush,清洗,不会清洗默认规则
                -Z:zero,置0;
                    iptables的每条规则都有两个计数器:
                        (1) 由本规则匹配到的所有的packets;
                        (2) 由本规则匹配到的所有的bytes;
                S:selected,以iptables-save命令的格式显示链上的规则;

查看:

                -L: list,列出规则
                    可跟的子选项:
                    -n:numeric,以数字格式显示地址和端口;
                    -v:verbose,详细信息;-vv, -vvv
                    -x:exactly,显示计数器的精确值而非单位换算后的结果;
                    --line-numbers:显示链上的规则的编号;

匹配条件:

基本匹配:netfilter自带的匹配机制
                [!] -s, --source address[/mask][,...]:原地址匹配
                [!] -d, --destination address[/mask][,...]:目标地址匹配
                [!] -i, --in-interface name:限制报文流入的接口,只能用于PREROUTING,INPUT及FORWARD;
                [!] -o, --out-interface name:限制报文流出的接口,只能用于OUTPUT,FORWARD及POSTROUTING;
扩展匹配:经由扩展模块引入的匹配机制,-m matchname。分为隐身拓展和显式拓展。
        隐式扩展:可以不用使用-m选项专门加载相应模块;前提是要使用-p选项可匹配何种协议
        显式扩展:必须由-m选项专门加载相应模块

处理动作:

        -j  targetname  [per-target-options]
            ACCEPT, DROP, REJECT
            RETURN:返回调用的链
            REDIRECT:端口重定向
            LOG:日志
            MARK:防火墙标记
            DNAT:目标地址转换
            SNAT:源地址转换
            MASQERADE:地址伪装

定义策略的内容较多,此处不做详细描述,我做了一个思维导图,请下载查看,文件为mmap格式,可使用MindManager程序查看

思维导图下载链接:http://www.luolongji.com/Iptables.netfilter.mmap

实际运用