码迷,mamicode.com
首页 > 系统相关 > 详细

Linux防火墙

时间:2016-07-29 19:19:35      阅读:335      评论:0      收藏:0      [点我收藏+]

标签:防火墙

一、Linux系统防火墙

Linux系统防火墙由iptables/netfilter组成,iptables工作在用户空间,制定一些规则,发送到内核空间,结合netfilter中的函数及处理方法对数据包进行处理。

netfilter: 防火墙框架(framework),位于内核中的tcp/ip协议栈的报文处理框架;定义5个卡点位置,hook function:钩子函数INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING

iptables:用户空间的命令行程序,按用途和功能对其分类成四个表,这四个表又由五个链组成

    表(table)由多个链组合,四个表:filter,nat,mangle,raw

        filter:一般过滤的功能

        nat:network address translation网络地址转换,用于修改报文的源地址或目标地址,或者端口

        mangle:拆解报文,做出修改,并重新封装起来

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

    五个基本内置链chain

        PREROUTING:流入数据包进入路由表之前

        INPUT:通过路由表判断后目的地是本机,然后进入本机的用户空间

        FORWARD:通过路由表判断后,目的地不是本机,然后通过路由转发到其他地方

        OUTPUT:由本机的用户空间进程产生数据,向外部转发

        POSTROUTING:传出的数据包到达网卡出口前

         注:同一链上的不同的表的规则的应用优先级次序(由高而低)

                   raw --> mangle --> nat--> filter

二、iptables制定规则

    1.规则

    规则由匹配条件和处理动作组成;根据规则的匹配条件尝试匹配报文,对匹配成功的报文根据规则定义的处理动作做出处理

    匹配条件:会检查网络层首部属性值、传输层首部属性值、附加的条件等

    2.添加规则时,要考量的问题

         (1)报文的流经路径,判断添加规则至哪个链上;

         (2)确定要实现的功能,判断添加规则至哪个表上;

         (3)要指定的匹配条件,以用于匹配目标报文

三、iptables命令

     规则的基本编写格式:

     iptables[-t table] COMMAND CHAIN CRETERIA -j target

         table:表名 target:处理动作matchname:匹配模块的名称

-t table:指定对哪个表操作

       table总共有四个filter, raw,mangle, nat;省略不写,默认修改的是filter

COMMAND:

       对于链操作的COMMAND

             -P:policy,规则策略,定义默认规则

             -N:new,新建一条自定义的规则链;自定义链被内建链上的规则调用才能生效;

             -X:drop(delete),删除自定义的引用计数为0的空链;

             -F:flush,清空指定的链;也可以删除规则

             -E:rename重命名自定义的引用计数和为0的链;

         对于规则操作的COMMAND        

             -A:append,追加,在指定链的尾部追加一条规则;

             -I:insert,插入,在指定的位置(省略位置时表示链首)插入一条规则;

             -D:delelte,删除,删除指定的规则;

                            (1)rule specification

                            (2)rule number 可以直接指定数字(iptables–vnL –line-numbers)

             -R:replace,替换,将指定的规则替换为新规则;不能仅修改规则中的部分,而是整条规则完全替换

        重置规则计数器

             -Z:zero,置0;

             iptables的每条规则都有两个计数器:

                  (1)由本规则匹配到的所有的数据包的个数(packets);

                  (2)由本规则匹配到的所有的数据包的总字节数(bytes);

         查看命令:

              -L:list,列出表中的链上的规则;

              -n:numeric,以数值格式显示;

              -v:verbose,显示详细格式信息; -vv,-vvv

              -x:exactly,计数器的精确结果;

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

                   常常使用iptables-vnL来查看

 

CHAIN:

    分为内建链(PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING)和自定义链

 

CRETERIA(匹配条件):分基本匹配条件和扩展匹配条件

    基本匹配条件:

         [!]-s, --source address[/mask][,...]

               检查报文中的源IP地址是否符合此处指定的地址或范围;

                    例如:地址:172.16.28.70 范围:172.16.0.0/16

         [!]-d, --destination address[/mask][,...]

               检查报文中的目标IP地址是否符合此处指定的地址或范围;

                     例如:地址:172.16.28.70 范围:172.16.0.0/16

         [!]-p, --protocol protocol:

                  匹配的协议类型{tcp|udp|icmp}

         [!]-i, --in-interface name:数据报文的流入接口;INPUT, FORWARD和PREROUTING

                例如:-i eno16777736

         [!]-o, --out-interface name:数据报文的流出接口; FORWARD, OUTPUT和POSTROUTING

                例如:-o eno16777736

            注:如果不指定地址或接口,默认匹配所有的地址和接口

   

    扩展匹配条件:需要加载扩展模块;分为:显式扩展、隐式扩展

         (1)隐式扩展:不用-m选项指出matchname即可使用此match的专用选项进行匹配;

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

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

         -p tcp:隐含了-m tcp;

             tcp:TransmissionControl Protocol 传输控制协议

             [!]--source-port,--sport port[:port]:匹配报文中传输层的源端口;

             [!]--destination-port,--dport port[:port]:匹配报文中传输层的目标端口;

             [!]--tcp-flags mask comp:匹配报文中的标志位

                   flags标志位有:SYN,ACK,FIN,RST,URG,PSH;               

                   mask:要检查的标志位列表,以逗号分隔;

                   comp:必须为1的标志位,余下的出现在mask列表中的标志位则必须为0;

                  比如:                                                                     

                  --tcp-flags SYN,ACK,FIN,RST  SYN

                  表示TCP三次握手第一次,SYN标志位为1,其余标志位为0

             [!]--syn:相当于--tcp-flags  SYN,ACK,FIN,RST  SYN

         -p udp:隐含了-m udp:没有标志位

              udp:User Datagram Protocol 用户数据报协议

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

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

         -p icmp:隐含了-m icmp:

            icmp:Internet Control Messages Protocol互联网控制报文协议,经常用来检查链路通不通,ping命令就是发送的icmp报文

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

                   8:echo-request 回显请求

                   0:echo-reply 回显应答

                                    

        (2)显式扩展:必须使用-m选项指出matchname,有的match可能存在专用的选项;

        1.multiport扩展 –mmultiport

         以离散或连续的方式定义多端口匹配条件;","离散":"连续

         [!] --source-ports,--sportsport[,port|,port:port]...:指定多个源端口;

         [!] --destination-ports,--dportsport[,port|,port:port]...:指定多个目标端口;

         [!] --ports port[,port|,port:port]...:指定多个端口;

                            port:port比如:21:23即表示21,22,23号连续短路

        2.iprange扩展 –m iprange

         以连续的ip地址范围指明连续的多地址匹配条件;

         [!] --src-range from[-to]:源IP地址;

         [!] --dst-range from[-to]:目标IP地址;

        3.string扩展 –m string

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

         [!] --string pattern:要检测字符串模式;

         [!] --hex-string pattern:要检测的字符串模式,16进制编码;

                  编码格式为16进制的字符串

         --algo {bm|kmp}

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

                  两种算法,性能差不多,必须指定的选项

        4.time扩展 –m time

         根据报文到达的时间与指定的时间范围进行匹配度检测;

         --datestartYYYY[-MM[-DD[Thh[:mm[:ss]]]]]:起始日期时间;

         --datestopYYYY[-MM[-DD[Thh[:mm[:ss]]]]]:结束日期时间;

         --timestart hh:mm[:ss]

         --timestop  hh:mm[:ss]

         [!] --monthdays day[,day...]

         [!] --weekdays day[,day...]

       5.connlimit扩展(connectlimit连接扩展) –m connlimit

         根据每客户端IP做并发连接数匹配;注:是每个客户端

         --connlimit-upto n:连接数数量小于等于n,此时应该允许;

                   也可以理解成,默认是拒绝的,加一条放行的条件

         --connlimit-above n:连接数数量大于n,此时应该拒绝;

                   也可以理解成,默认是允许的,加一条拒绝的条件

       6.limit扩展 –m limit

         基于收发报文的速率进行匹配;

         --limit rate[/second|/minute|/hour|/day]:平均速率

         --limit-burst number:峰值速率

        7.state扩展(iptables是状态监测防火墙,就是靠state扩展实现的) -m state

        [!] --state STATE

            STATE有五种状态机制:INVALID,ESTABLISHED,NEW,RELATED,UNTRACKED

                  INVALID:无法识别的状态;

                  ESTABLISHED:已建立的连接;这里与ss -tnl中显示的tcp的ESTABLISHED区分开

                  NEW:新连接;

                  RELATED:相关联的连接;如:ftp协议的命令连接与数据连接即为相关联的连接

                  UNTRACKED:未追踪的连接

-j target:处理动作

         ACCEPT:接受;
         DROP:丢弃;
         REJECT:拒绝;
               注:一般禁止某主机访问时,用DROP


四、练习

    本机IP:172.16.28.70

    做练习时,注意以下几点:   

    操作之前,CentOS 7 先禁用firewalld服务

        # systemctl status firewalld.service

        # systemctl stop firewalld.service

        # systemctl disable firewalld.service

    使用iptables -F清空链规则是,保证默认策略为ACCEPT

  1. 允许172.16网络中的主机访问本机的ssh服务

    iptables -A INPUT -s 172.16.0.0/16 -d 172.16.28.70 -p tcp --dport 22 -j ACCEPT

    iptables -A OUTPUT -d 172.16.0.0/16 -s 172.16.28.70 -p tcp --sport 22 -j ACCEPT

  2. 本机设置规则开放22,23,80端口

    iptables -A INPUT -d 172.16.28.70 -p tcp -m multiport --dports 22:23,80 -j ACCEPT

    iptables -A OUTPUT -s 172.16.28.70 -p tcp -m multiport --sports 22:23,80 -j ACCEPT

  3. 禁止172.16.28.72连接本机的ssh服务

    iptables -I INPUT -d 172.16.28.70 -s 172.16.28.72 -p tcp --dports 22 -j DROP

  4. 将本机mysql服务的3306端口开放给172.16.28.71-172.16.28.79

    iptables -I INPUT -d 172.16.28.70 -p tcp --dports 3306 -m iprange --src-range 172.16.28.71-172.16.28.79 -j ACCEPT

    iptables -I OUTPUT -s 172.16.28.70 -p tcp --dports 3306 -m iprange --src-range 172.16.28.71-172.16.28.79 -j ACCEPT

  5. 本机httpd服务响应的目标IP不是172.16.28.71-172.16.28.79这个范围内的,以kmp算法检测出响应的应用层数据中包含字符串admin,就拒绝

  6. iptables -A OUTPUT -s 172.16.28.70 -p tcp --sport 80 -m iprange ! -dst-range 172.16.28.71-172.16.28.79 -m string --string "admin" --algo kmp -j REJECT

  7. 本机的telnet服务,只允许周二四六工作时间访问

    iptables -I INPUT -d 172.16.28.70 -p tcp --dport 23 -m time --timestart 09:00:00 --timestop 18:00:00 --weekdays Tue,Thu,Sat, -j ACCEPT

  8. 限制telnet服务的连接数,最多两个

    iptables -A INPUT -d 172.16.28.70 -p tcp --dport 23 -m connlimit --connlimit-upto 2 -j ACCEPT

  9. 本机允许一开始连续ping5次,然后允许每3秒ping一次

    iptables -I INPUT -d 172.16.28.70 -p icmp --icmp-type 8 -m limit --limit-burst 5 --limit 3/second -j ACCEPT

  10. 追踪连接,实现本机允许被ping

    iptables -A INPUT -d 172.16.28.70 -m state --state ESTABLISHED -j ACCEPT

    iptables -A OUTPUT -s 172.16.28.70 -m state --state ESTABLISHED -j ACCEPT

    iptables -I INPUT -d 172.16.28.70 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT

  11. 对本机80端口的访问请求,转向本机的8088端口

    iptables -t nat -A PREROUTING -d 172.16.28.70 -p tcp --dport 80 -j REDIRECT --to-port 8088




Linux防火墙

标签:防火墙

原文地址:http://11613365.blog.51cto.com/11603365/1831786

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