> CentOS > CentOS入门 >

Centos 6.6上netfilter/iptables防火墙的基本用法

1 事前必知:

    1)什么是防火墙?

      防火墙:工作于主机或网络边缘,对于进出的报文根据事先定义的规则做检查,被匹配到的报文作出相应处理的组件。

      所以:

           (1)防火墙不是杀毒软件。

           (2)既然是根据规则检查报文,存在2个问题:规则定义严格了,使用者觉着别扭;定义松散了形同虚设,还占用内核资源。

 

    2)centos6.6上防火墙的组件:

       netfilter:过滤器,内核中工作在tcp/ip网络协议栈上的框架
       iptables:过滤规则的编写工具,定义的规则通过内核接口直接送至内核,因此,会立即生效,但不会永久有效;iptables可以自动实现规则语法检查。

       所以:

            (1)非专业叫法中的iptables防火墙,全名是 netfilter/iptables 防火墙,是个软件防火墙,所以性能嘛,你懂的。

            (2)只要内核中编译有netfilter它就在内核中存在,我们所说的停止防火墙服务,其实是清除被加载到内存中的iptables定义的规则。没有了过滤规则,netfilter就像没有牙齿的老虎。将来在定制服务器OS内核时就不要选netfileter模块,还有selinux通通去掉,让服务器在外围硬件防火墙,IPS,IDS保护下“裸奔”。

 

    3)网络协议栈和硬件驱动管理都是OS内核的工作。

        所以:

              (1)网卡上报文的接受和发出都受OS内核的管理

              (2)报文的路由处理和报文的合法合理性检查也在内核的TCP/IP协议栈上进行

              (3)主机提供的资源服务如httpd 是在用户空间的事务,而跟该资源服务相关的报文的接收和投递是内核空间的事务。接收的资源请求报文在内核空间,对报文的合法合理性检查后,根据报文中定义的传输层端口号找到用户空间中的进程来进行后续的处理。

 

2 netfilter/iptables是检查报文的卡点和功能表

    netfilter框架可以对进出的报文实施3种功能:过滤,修改,追踪。为了完成这3项功能,准备了5个卡点对报文进行影响。卡点,专业叫法为钩子函数,为了好理解,这里称为卡点。

    1)检查报文的卡点:

 

 

网卡进--->prerouting------>路由判断----->forward------->postrouting---->网卡出
                                             |                                                  |
                                             |                                             output
                                             |                                                   |
                                           input                                      (路由判断)
                                             |---->-------本地进程资源--->-----|
  

prerouting:路由判断之前
input:路由判断后要进入本机内部获取本地服务资源
output:路由判断后要送出本机
forward:路由判断后要途径本机转发
postrouting:路由判断后,即将要发出本机

 

根据报文的分类,要经过的卡点如下:

到本机内部:prerouting,input
由本机发出:output,postrouting
由本机转发:prerouting,forward,postrouting

 

这些卡点下文称为链,我们使用iptables工具定义的过滤规则在逻辑上附着在链上,对进出的数据包进行处理。

  

     2)功能表:

      上面已经提到 netfilter框架可以对进出的报文实施3种功能:过滤,修改,追踪。这3项功能在netfilter框架中通过4个功能表来代表:

        过滤功能:filter表

                              使用的卡点(下文称为链):input ,forward,output

        修改功能:net表:修改报文的源地址和目标地址。

                              使用的卡点(下文称为链):prerouting,output,postrouting

                        mangle表:修改报文IP,TCP报文首部的某些信息。

                              使用的卡点(下文称为链):prerouting,postrouting,input,output,forward

        追踪功能:raw表

                             使用的卡点(下文称为链):prerouting,output

    

     3)功能表的优先级:

         可以看到在同一个卡点上存在多个功能表的现象,谁先谁后检查呢?它们存在一个优先级的问题:
         高--->低:raw--->mangle--->nat--->filter 

    所以内核调用netfilter框架中表,表要调用相应的链,链使用规则来处理报文,这就是netfilter/iptables防火墙的工作逻辑。

 

3 iptables规则的书写

    iptables书写规则的格式:

                  #iptables [-t TABLE] SUBCOMMAND CHAIN CRETERIA -j TARGET

                    -t TABLE: -t 指定表,TABLE为表名称,当省略该选项时,默认后面定义的规则 指施加在filter表的规则链上。

                    [ ]中为可选内容,下同。

 

    3.1)查看规则:

                  #iptables [-t TABLE] -L [ -n -v  -x  --line-numbers]

                       -t TABLE: -t 指定表,TABLE为表名称,当省略该选项时,默认后面定义的规则 指施加在filter表的规则链上。

                        -L:list,列出指定链上所有规则
                       -n:numeric,以数字格式显示地址和端口,而不反解为域名和端口服务名。
                       -v:verbose,详细格式
                       --line-numbers:显示规则编号
                       -x:exactly,显示计数器的精确值,不做单位换算。每个链上有2个计数器:1个记录当前规则所匹配到的报文个数,2记录当前规则匹配到的报文大小之和

  

举例:

 1查看net表现有的规则:

wKioL1VJtDfina1CAAFpoqCHjMg519.jpg

 2查看filter表的现有规则:

wKioL1VJtGSTjhL9AAJcFCvgh6c390.jpg

    3.2)清除表已定义的规则

             #iptables [-t TABLE]  -F  [chain [rulenum]]

           #iptables [-t TABLE]  -X  [chain]

             #iptables [-t TABLE]  -Z  [chain [rulenum]]

           *当省略 -t TABLE时,默认为filter表。

       -F:flush,清空指定链上的规则,当没有指定链名时,为该表中所有链上的说有规则
       -X:drop,删除用户自定义的空链,非空自定义链,系统内置链无法删除。当没有指定链名时,为该表中所有自定义的链。      

       -Z:zero,置0,每个链上有2个计数器:1个记录当前规则所匹配到的报文个数,2记录当前规则匹配到的报文大小之和。当没有指定链名时,为该表中所有链。

举例:

   1)清除filter表中input链的规则:

wKioL1VJtLfy6cR9AAGaGa_jiv8632.jpg

  2)清除filter表中所有已定义的规则:

wKiom1VJs5Pj-zRbAAE6ZQqr2vE612.jpg

       3.3)定义新过滤规则:

        既然是过滤规则,那么规则一般用在filter表的链上。

         3.3.1)自定义链和重命名自定义链

自定义链只能作为表中默认链的跳转对象,即在默认链通过引用自定义链,来生效自定义链上的规则。

#iptables [-t TABLE] -N chain-name

#iptables [-t TABLE] -E old-chain-name new-chain-name

  *当省略 -t TABLE时,默认为filter表。

-N:new,新建一个用户自定义的链

-E:rename,重命名自定义的链。自定义链被引用时无法被重命名。

举例:

    1.在net表中定义一个名为webrules的新自定义链:

wKiom1VJtHGDzRiFAAKUJ8IqOqY108.jpg

    2.将net表自定义的链webrules重命名为httpdrules:

wKiom1VJtKOTiRM4AAHDNrtmOpY343.jpg

           3.3.2)定义基本的规则

#iptables [-t TABLE] {-A|-I } CHAIN CRETERIA -j TARGET

  *当省略 -t TABLE时,默认为filter表。

 -A:append,在链尾追加一条规则
  -I:insert,在指定位置插入一条规则,

           -I CHAIN n 为该规则在现有链规则中的位置编号,从1开始,自上而下。当n省略时,默认插入放在该链的第一条。

  CHAIN:链名,要根据TABLE来决定,也可是表中自定义的链

  CRETERIA:匹配条件
    主要是:IP首部,TCP,UDP或ICMP首部中信息。
    匹配条件:(匹配条件可以有多个,要同时都满足。)
         !-s: !表示取反。
         -s,--src,--source:检查报文中的源ip地址
         -d,--dst,--destination:检测报文中的目标IP地址
         -p,--protocol:检查报文中的协议,即IP报文中被protocols标识的协议 { tcp |udp|icmp}   
         -i,--interface:检测报文的流入的接口,通常只用于prerouting,input,forward链
         -o,--out-interface:检测报文的流出接口,通常只用于forward,output,postrouting链

         --sport:指定源端口,必须存在-p 协议

         --dport:指定目标端口,必须存在-p 协议

  TARGET:处理动作

       基本的规则中使用的有3个(需大写):

        DROP:放弃数据包,无任何信息返回

        ACCEPT:接受数据包

        REJECT:拒绝数据包,有返回信息,不推荐使用,除了在内网或做测试时使用。

举例:

    (1)接受来自192.168.100.0/24 网段,到达本地192.168.100.1/24 eth1 网卡的关于80端口的请求包,其它来源的全部拒绝。

wKioL1VJtrzjVsAcAAPuFwXoA2A043.jpg

   (2)只接受icmp的ping返回包,其余的icmp包请求拒绝,这样我可以ping通别人,别人ping不通我。

 wKioL1VJqJ3w5PYeAAN0M_PFb1Q444.jpg   

        3.3.3)规则的删除

            #iptables [-t TABLE] -D CHAIN n

             *当省略 -t TABLE时,默认为filter表。

            -D:删除

            CHAIN:链名

            n:规则在链中位置编号,从1开始,自上而下。

举例:删除filter表中input链上第二条规则

wKiom1VJtauyxKOtAAOtl6298xw860.jpg

           3.3.4)替换现有的规则

             #iptables [-t TABLE] -R CHAIN n NEW-RULE

               *当省略 -t TABLE时,默认为filter表。

              -R:replace,替换指定的规则

              CHAIN:链名

              n:规则在链中位置编号,从1开始,自上而下。

              NEW-RULE:新的规则
 举例:修改现有关于80端口的拒绝规则为,拒绝其它所有到达本机任一网卡的请求。

wKioL1VJt3bQKACiAAMdkPJkOMk063.jpg

           3.3.5)定义默认规则:

    每一个链中都应定义默认规则,用来处理该链中现有规则匹配不到的数据包,但是操作远程主机时,请注意不要因默认规则将自己挡在主机外。

     #iptables [-t TABLE] -P CHAIN TARGET

        *当省略 -t TABLE时,默认为filter表。

        -P :设置默认处理规则

        TARGET:处理动作,只有DROP和ACCEPT可选。

举例:将现有input链的默认规则定义为DROP

wKioL1VJt9ThYgT9AAMj-pfFvsY641.jpg


 

4 iptables规则书写的原则

    1)链中规则从首至尾进行规则匹配,先匹配到的,数据包被处理,链中余下规则不在进行检测。
    2)同类规则,范围小的放上面
    3)不同类的规则,匹配几率大的放上面
    4)应该设置默认规则,处理被规则都不匹配的报文

 

  好吧,这就是Centos 6.6上 netfilter/iptables防火墙的基本用法,下篇博文预计写下面的内容:

   1)使用netfilter/iptables 将Linux主机做成nat服务器,

   2)filter过滤规则的扩展匹配使用

   3)iptables规则的优化

   4)iptables规则的保存

   5)给内核打补丁,使netfilter/iptables可过滤应用层内容。

(责任编辑:IT)