码迷,mamicode.com
首页 > 其他好文 > 详细

防火墙之 iptables详解

时间:2016-05-11 20:16:01      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:linux   防火墙   检测   流量   发展史   


 一、防火墙介绍


        防火墙,其实说白了讲,就是用于实现Linux下访问控制的功能的,它分为硬件的或者软件的防火墙两种。无论是在哪个网络中,防火墙工作的地方一定是在网络的边缘。而我们的任务就是需要去定义到底防火墙如何工作,这就是防火墙的策略,规则,以达到让它对出入网络的IP、数据进行检测。

        目前市面上比较常见的有3、4层的防火墙,叫网络防火墙,还有7层的防火墙,其实是代理层的网关。

对于TCP/IP的七层模型来讲,我们知道第三层是网络层,三层的防火墙会在这层对源地址和目标地址进行检测。但是对于七层的防火墙,不管你源端口或者目标端口,源地址或者目标地址是什么,都将对你的所有东西进行检查。所以,对于设计原理来讲,七层防火墙更加安全,但是这却带来了效率更低。所以市面上通常的防火墙方案,都是两者结合的。而又由于我们都需要从防火墙所控制的这个口来访问,所以防火墙的工作效率就成了用户能够访问数据多少的一个最重要的控制,配置的不好甚至有可能成为流量的瓶颈。


 二、iptables发展史


      iptables 是与最新的 3.5 版本 Linux内核集成的 IP 信息包过滤系统。如果 Linux 系统连接到因特网或 LAN、服务器或连接 LAN 和因特网的代理服务器, 则该系统有利于在 Linux 系统上更好地控制 IP 信息包过滤和防火墙配置。

       防火墙在做信息包过滤决定时,有一套遵循和组成的规则,这些规则存储在专用的信 息包过滤表中,而这些表集成在 Linux 内核中。在信息包过滤表中,规则被分组放在我们所谓的链(chain)中。而netfilter/iptables IP 信息包过滤系统是一款功能强大的工具,可用于添加、编辑和移除规则。

        虽然 netfilter/iptables IP 信息包过滤系统被称为单个实体,但它实际上由两个组件netfilter 和 iptables 组成。netfilter 组件也称为内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。

iptables 组件是一种工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。除非您正在使用 Red Hat Linux 7.1 或更高版本,否则需要下载该工具并安装使用它


  

        与Linux内核各版本集成的防火墙历史版本:

            2.0.X内核:ipfwadm

            2.2.X内核:ipchains

            2.4.X内核:iptables


 二、iptables的四表五链


    功能:表(table)


              filter:过滤,防火墙;

              mangle:拆解报文 ,按需修改;

              nat: network address translation(ip层地址,传输层地址);

              raw:关闭在nat表启用的连接追踪机制;


        netfilter内置的五个钩子


            prerouting:路由前,数据报文刚到达本机还哦没有路由的;

            input:路由完之后,要到达本机内部来的;

           forward:不到本机内部的,经由本机转发的;

           output:由本机内部向外发出的;

           postrouting:即将发出去,马上要离开本机网卡的报文;


        报文流向:

            流入本机:prerouting-->input==>用户空间进程;

           流出本机:用户空间进程==>output-->postrouting;

           转发:prerouing-->forward-->postrouting

 

技术分享

    



   用户自定义链:用于内置链进行补充扩展。可实现更灵活的规则组织管理机制;


  表和链的对应关系,及优先级(由高到底:raw-->mangle-->nat-->filter);



  表和链对应关系:

            raw:PREROUTING , OUTPUT 

            mangle:  PREROUTING  ,  INPUT  ,   FORWARD ,  OUTPUT,   POSTROUTING

            nat: PREROUTING ,   INPUT ,OUTPUT ,POSTROUTING

            filter: INPUT , FORWARD , OUTPUT

            

  添加规则时的考量点:

            (1)要实现何种功能:判断添加规则至哪个表上;

            (2)报文流经的位置:判断添加规则至哪个链上;

  

       技术分享



iptables的关闭和开启:

        CentOS 7:

                ~]# systemctl stop firewalld.service

                ~]# systemctl disable firewalld.service


        CentOS 6:

                ~]#service iptables  stop

                ~]#chkchonfig iptables off



   三、iptables命令(以CentOS 7为例)


   命令格式: iptables [-t table] SUBCOMMAND chain  [matches...]  [-j target]

 

        3.1 -t table:指定表,不指默认是filter表

                raw, mangle, nat, [filter]


        3.2 SUBCOMMAND:


          1)、 链管理:远程连接时,DROP使用要慎重。

                  -N:  new ,新增一条自定义链;

                          技术分享

                                   policy:默认策略; 0 references :引用计数为0。


                   -X:  delete,删除自定义的空链;(有规则的链的先清除规则 -F)


                   -P :   policy,设置链的默认策略;

                                ACCEPT:接受

                                DROP:丢弃,

                                REJECT:拒绝

                        注意:DROP和REJECT设置时,一般设置为DROP。


                      示例,把filter表中的FORWARD链设置为DROP

                                 技术分享


            

                   -E  :  rename,重命名自定义的未被引用(引用计数为0)的链;


                                技术分享

            


     2)、 规则管理:

                        -A:append ,追加,默认为最后一个;


                示例: 允许所有192.168网段的主机ping本主机(192.168.1.107)                                                                                                              技术分享   

    

                      -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命令的格式显示链上的规则;


                                    技术分享

               


                3)、查看:

                        -L: lsit,列出规则

                                -n: numeric ,以数字格式显示地址和端口;

                                -v:verbose ,详细信息;-vv,-vvv

                                -x: exactiy,显示计数器的精确值而非单位换算后的结果;

                                --line-numbers:显示链上的规则的编号;

                         组合:-nvL

技术分享

               

   
技术分享


 3.3 匹配条件


              1)基本匹配:netfilter自带的匹配机制

                        [!] -s, --source address[/mask][,...]              :原地址匹配

                        [!] -d, --destination address[/mask][,...]      :目标地址匹配

技术分享

                    [!] -i, --in-interface name                          :限制报文流入的接口,只能用于PREROUTING,INPUT及FORWARD;

                    [!] -o, --out-interface name                      :限制报文流出的接口,只能用于OUTPUT,FORWARD,POSTROUTING;


             2)扩展匹配:经由扩展模块引入的匹配机制,需要加载扩展模块;-m mathchname


                     隐式扩展:可以不用使用-m选项专门加载相应模块;前提是使用-p选项可匹配何种协议;


         [!] -p,--protocol PROTOCOL PROTOCOL:

                     协议:tcp,udp,icmp,icmpv6,esp,ah,sctp,mh or "all"

                      

                    tcp:隐含指明了“-m tcp,有专用选项:

                        [!] --source-port,--sport port[:port] :匹配报文中tcp首部的源端口;可以是端口范围;

                        [!] --destination-port,--dport port[:port]:匹配报文中的tcp首部的目标端口,可以是端口范围;

                        [!]--tcp-flags mask comp :检查报文中的mask指明的tcp标志位,而要这些标志位comp中必须为1;

                                    --tcp-flags syn,fin,ack,rst syn

                                    --tcp-flags syn,fin,ack,rst ack,fin

                       [!] --syn:

                                     --syn相当于“--tcp-flags syn,fin,ack,rst syn” ;tcp三次握手的第一次

      示例:允许其他任何主机访问本机的80端口

        技术分享


                       udp:隐含指明了“-m udp”,有专用选项:

                            [!] --source-port,--sport port[:port]:匹配报文中的udp首部的源端口;可以是端口范围;

                            [!] --destination-port,--dport port[:port]:匹配报文中的udp首部的目标端口;可以是端口范围;



                        icmp:隐含 指明了“-m icmp”,有专用选项;

                            [!]--icmp-type {type[/code] | yypename}

                                    type/code:

                                        0/0:echo reply

                                        8/0:echo request

            总结:本机为服务器是,其他主机请求本机,入栈为8,出栈为0;本机请求其他服务器时,出栈为8,入栈为0。


示例1:允许本机ping其他主机,不允许其他主机ping本机。


技术分享


示例2:允许其他主机ping本机。


技术分享

             



               显示扩展:必须由-m选项专门加载相应模块


        

        multiport:多端口匹配

                    以离散方式定义多端口匹配,最多可以指定15个端口;

                

                    [!]--source-ports,--sports port[,port|,port:port]...

                    [!]--destination-ports,--dports port[,port|,port:port]...

                    [!]--ports port[,port|,port:port]...


               示例:

                   ~]# iptables -I INPUT -s 0/0 -d 172.18.100.6 -p tcp -m multiport --dports 22,80 -j ACCEPT

                   ~]# iptables -I OUTPUT -d 0/0 -s 172.18.100.6 -p tcp -m multiport --sports 22,80 -j ACCEPT


                iprange:指明一段连续的ip地址范围作为源地址或目标地址匹配;

                    [!]--src-range from[-to]:源地址范围

                    [!]--dst-range from[-to]:目标地址范围


              string:对报文中的应用层数据做字符串匹配检测;

                        --algo {bm | kmp}:

                           (bm = Boyer-Moore ,kmp = Knuth-Pratt-Morris)

                   [!]--string pattern:指定要检查的字符串模式;

                   [!]--hex-string pattern:给定要检查的字符串模式;

                 

             示例:

            ~]# iptables -I OUTPUT -s 172.18.100.6 -d 0/0 -p tcp --sport 80 -m string --algo bm --string "old" -j REJECT


        

              time:根据收到报文的时间/日期与指定的时间/日期范围进行匹配;

            

                    --datastart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] :起始日期时间

                    --datastop YYYY[-MM[-DD[Thh[:mm[:ss]]]]] :结束日期时间

                     [!]--monthdays day[,day...]匹配一个月中的哪些天

                    [!]--weekdays day[,day...]匹配一个周中的哪些


        示例:

        ~]# iptables -R INPUT 4 -d 172.18.100.6 -p tcp --dport 23 -m iprange 172.18.100.1-17.18.100.100 -m time --timestart 09:00:00 --timestop 16:00:00 --weekdays 1,2,3,4,5 -j ACCEPT


         connlimit:根据每客户端主机做并发连接数限制,即每客户端最多可同时发起的连接数量;

                  --connlimit-upto n:连接数量小于等于n则匹配;

                  --connlimit-above n:连接数量大于n则匹配;


           示例:

        ~]# iptables -A INPUT -s 0/0 -d 172.18.100.6 -p tcp --dport 23 -m connlimit-upto 2 -j ACCEPT


         limit:基于令牌桶算法对报文的速率做匹配;

            This module mathches at a limited rate using a token bucket filter.

            --limit rate[/second | minute | /hour | /day]

            --limit-burst number


        示例:

         ~]# iptables -R INPUT 3 -d 172.18.100.6 -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 3 -j ACCEPT


          state:是conntrack的子集,用于对报文的状态做连接追踪;


            INVALID:无法识别的连接;

            ESTABLISHED:连接追踪模块当中存在记录的连接;

            NEW:连接追踪模板当中不存在的连接请求;

            RELATED:相关联的连接;

            UNTRACKED:未追踪的连接;


              已经追踪到得记录下来的连接:

                       /proc/net/nf_conntrack


                  连接追踪功能所能够记录的最大连接数量(可调整):

                      /proc/sys/net/nf_conntrack_max

        

                     sysctl -w net.nf_conntrack_max=300000

                    echo 300000 >/proc/sys/net/nf_conntrack_max


                conntrack所能够追踪的连接数量的最大值取决于/proc/sys/net/nf_conntrack_max的设定;已经追踪到的并记录下来的连接位于/proc/net/nf_conntrack文件中,超时的连接将会被删除;当模板满载时,后续的新连接有可能会超时;

                    解决办法:        

                            (1)加大nf_conntrack_max的值

                            (2)降低nf_conntrack条目的超时时长;        

                                        不同协议的连接追踪时长:/proc/sys/net/netfilter/


  如何放行被动模式的ftp服务?

            (1)内核加载 nf_conntrack_ftp模块;

                    modprobe nf_conntrack_ftp

            (2)放行命令连接

               #   iptables -A INPUT -d $sip -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT

               # iptables -A OUTPUT -s $sip -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT

            (3)放行数据连接

               #  iptables -A INPUT -d $sip -p tcp  -m state --state RELATED,ESTABLISHED -j ACCEPT

              #   iptables -A OUTPUT -s $sip -p tcp  -m state --state ESTABLISHED -j ACCEPT


        4、处理动作:

         -j targetname [per-target-options]

                 ACCEP,DROP,REJECT

                 RETURN:返回调用的链 

                 REDIRECT:端口重定向

                 LOG:日志

                 MARK:防火墙标记

                 DNAT:目标地址转换

                 SNAT:源地址转换

                 MASQERADE:地址伪装


 

 

         REDIRECT:

            This  target  is only valid in the nat table, in the PREROUTING and  OUTPUT chains, and user-defined chains which  are only  called  from  those  chains.   It  redirects  the packet to the machine itself by  changing the destination IP to the    primary address of the  incoming  interface

         

                --to-ports port[-port]

      示例:

            ~]# iptables -t nat -A PREROUTING -d 172.18.100.67 -p tcp --dport 80 -j REDIRET --to-ports 8080


        LOG:

      Turn on kernel logging of matching packets.if you want to LOG the  packets  you  refuse, use two separate rules with the same matching criteria, first using target LOG then DROP (or REJECT).

                 --log-level level

                   emerg, alert, crit, error, warning, notice,  info or debug

                 --log-prefix prefix


       示例:

            ~]# iptables -I FORWARD 2 -s 10.0.1.0/24 -p tcp -m multiport --dports 80,21,22,23 -m state NEW -j LOG --log-prefix "(new connctions)"


    NAT:Network Address Translation

        SNAT:source NAT

                修改IP报文中的源IP地址

                

                让本地网络的主机可使用统一地址与外部主机通信,从而实现地址伪装;

                        请求:修改源IP,如果修改则由管理员定义;

                        响应:修改目标IP,由nat自动根据会话表中追踪机制实现相应修改;

        DNAT:destination NAT

                修改IP报文中的目标IP地址;

                让本地网络中的服务器使用统一的地址向外提供服务(发布服务),但隐藏了自己的真实地址;

                        请求:由外网主机发起,修改其目标地址,由管理员定义;

                        响应:修改源地址,但由nat自动根据会话表中的追踪机制实现对应修改;

        PNAT:port NAT

        SNAT发生在PSTROUTING

        DNAT发生在RPEROUTING


        SNAT:

            This target is only valid in the nat table, in the POSTROUTING and INPUT chains, and user-defined chains  which  are  only  called  from those chains. 

            --to-soure [ipaddr[-ipaddr]][:port[-port]]

       

        DNAT

            This target is only valid in the nat table, in the PREROUTING and OUTPUT chains, and user-defined chains which are only called from those chains.

        

            --to-destination [ipaddr[-ipaddr]][:port[-port]]


 MASQUERADE:

        This target is only valid in the nat table, in the POSTROUTING chain.  It  should  only  be  used with  dynamically assigned  IP (dialup) connections: if you have a static IP address, you should use the SNAT target.



        5、规则的检查和保存

            规则的检查的次序:规则在链接上的次序即为其检查时的生效次序;因此,其优化使用有一定法则;

        (1)同类规则(访问同一应用),匹配范围小的放前面;用于特殊处理;

        (2)不同类的规则(访问不同应用),匹配范围大的放前面

        (3)应该将那些可由一条规则描述的多个规则合并为一;

        (4)设置默认策略;


   

            规则的有效期限:

                iptables命令添加的规则,手动删除之前,其生效期限为kernel的生命周期;


       

                 保存规则:

     

                      CentOS 6:
                           ~]# service  iptables  save
                           ~]# iptables-save  > /etc/sysconfig/iptables
                           ~]# iptables-save  >  /PATH/TO/SOME_RULE_FILE
                   ~]#service  iptables  restart

           
               重启后会自动从/etc/sysconfig/iptables文件中重载规则


               CentOS 7:
                           ~]# iptables  -S  > /PATH/TO/SOME_RULE_FILE
                           ~]# iptables-save  >  /PATH/TO/SOME_RULE_FILE

                   重载预存的规则
                           ~]# iptables-restore  <  /PATH/FROM/SOME_RULE_FILE

                   自动生效规则文件中的规则:
                     
 (1) 把iptables命令放在脚本文件中,让脚本文件开机自动运行;
                           /etc/rc.d/rc.local
                               /usr/bin/iptables.sh

                       (2) 用规则文件保存规则,开机自动重载命令;
                           /etc/rc.d/rc.local
                               iptables-restore  <  /PATH/FROM/SOME_RULE_FILE


        

                



        







防火墙之 iptables详解

标签:linux   防火墙   检测   流量   发展史   

原文地址:http://1832924799.blog.51cto.com/11226449/1772171

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!