Linux之Iptables总结及应用

一、防火墙、Iptables简介

   1、防火墙是用于实现Linux下访问控制的功能的,它分为硬件的或者软件的防火墙两种。无论是在哪个网络中,防火墙工作的地方一定是在网络的边缘。而我们的任务就是需要去定义到底防火墙如何工作,这就是防火墙的策略,规则,以达到让它对出入网络的IP、数据进行检测。常见的有三、四层的防火墙,叫网络层的防火墙(这层对源地址和目标地址进行检测),还有7层防火墙,其实是代理层的网关(对源端口或者目标端口,源地址或者目标地址进行检查)。

    2、Iptabels简介:netfilter/iptables(简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。

    iptables的前身叫ipfirewall (内核1.x时代),从freeBSD上移植过来的,能够工作在内核当中的,对数据包进行检测的一款简易访问控制工具。当内核发展到2.x系列的时候,软件更名为ipchains,它可以定义多条规则,将他们串起来,共同发挥作用,而现在,它叫做iptables,可以将规则组成一个列表,实现绝对详细的访问控制功能。

    工作在用户空间,定义规则的工具,本身并不算是防火墙。定义的规则,可以让在内核空间当中的netfilter来读取,并且实现让防火墙工作。而放入内核的地方必须要是特定的位置,必须是tcp/ip的协议栈经过的地方。而这个tcp/ip协议栈必须经过的地方,可以实现读取规则的地方就叫做 netfilter(网络过滤器)。因此真正实现防火墙功能的是netfilter,它是Linux内核中实现包过滤的内部结构。

       在内核空间中选择了5个位置:

           1)内核空间中:从一个网络接口进来,到另一个网络接口去的

           2)数据包从内核流入用户空间的

           3)数据包从用户空间流出的

           4)进入/离开本机的外网接口

           5)进入/离开本机的内网接口

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

  1)PREROUTING (路由前)  ##对数据包作路由选择前应用此链中的规则,注意:记住!所有的数据包进来的时侯都先由这个链处理

  2)INPUT (数据包流入口) ##进来的数据包应用此规则链中的策略

  3)FORWARD (转发管卡)   ##转发数据包时应用此规则链中的策略

  4)OUTPUT(数据包出口)   ##外出的数据包应用此规则链中的策略

  5)POSTROUTING(路由后)##对数据包作路由选择后应用此链中的规则,注意:所有的数据包出来的时侯都先由这个链处理

        这是NetFilter规定的五个规则链,任何一个数据包,只要经过本机,必将经过这五个链中的其中一个链

    3、规则链之间的优先顺序有三种情况:

         1)入站数据流向:从外界到达防火墙的数据包,先被PREROUTING规则链处理(是否修改数据包地址等),之后会进行路由选择(判断该数据包应该发往何处),如果数据包的目标主机是防火墙本机(比如说Internet用户访问防火墙主机中的web服务器的数据包),那么内核将其传给INPUT链进行处理(决定是否允许通过等),通过以后再交给系统上层的应用程序(比如Apache服务器)进行响应。

         2)转发数据流向:来自外界的数据包到达防火墙后,首先被PREROUTING规则链处理,之后会进行路由选择,如果数据包的目标地址是其它外部地址(比如局域网用户通过网关访问QQ站点的数据包),则内核将其传递给FORWARD链进行处理(是否转发或拦截),然后再交给POSTROUTING规则链(是否修改数据包的地址等)进行处理。

         3)出站数据流向:防火墙本机向外部地址发送的数据包(比如在防火墙主机中测试公网DNS服务器时),首先被OUTPUT规则链处理,之后进行路由选择,然后传递给POSTROUTING规则链(是否修改数据包的地址等)进行处理。


二、Iptables工作机制

    1、iptables数据包传输过程如下图:

wKiom1ZJ0DWiL_-CAAGzFuFb8QU167.jpg

    说明

    1)当一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去。 

    2)如果数据包就是进入本机的,它就会沿着图向下移动,到达INPUT链。数据包到了INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经过OUTPUT链,然后到达POSTROUTING链输出。 

    3)如果数据包是要转发出去的,且内核允许转发,数据包就会如上图所示向右移动,经过FORWARD链,然后到达POSTROUTING链输出

    2、iptables规则表和链关系

    iptables内置了4个表,即filter表、nat表、mangle表和raw表,分别用于实现包过滤,网络地址转换、包重构(修改)和数据跟踪处理。

    链(chains)是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定义的默认策略来处理数据包。

    注意一定要明白这些表和链的关系及作用,详见下图:

wKioL1ZJ0KfCtaenAALXBNWIZTw430.jpg

    规则表说明:

        1)filter表(过滤数据包  内核模块:iptables_filter)——三个链:INPUT、FORWARD、OUTPUT

        2)Nat表(用于网络地址转换(IP、端口) 内核模块:iptable_nat)——三个链:PREROUTING、POSTROUTING、OUTPUT

        3)Mangle表(修改数据包的服务类型、TTL、并且可以配置路由实现QOS内核模块:iptable_mangle)——五个链:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD

        4)Raw表(决定数据包是否被状态跟踪机制处理  内核模块:iptable_raw)——两个链:OUTPUT、PREROUTING

    规则表之间的优先顺序:

    Raw——mangle——nat——filter


三、iptables基本用法

    启动动脚本:/etc/init.d/iptables {start|stop|restart|save}

    save是将写好的规则保存到/etc/sysconfig/iptables,下次启动时会去读取此文件中的规则。也可使用iptables-save重定向到某个文件中,下次可以使用iptables-restore命令来导入规则。

    1)基本语法:

      iptables [-t TABLE] COMMAND CHAIN  [RULE] [-j TARGET]

    常见参数选项

    -t:指明处理的表名,默认是filter

    -A|-D|-I|R:增加、删除、插入、替换匹配的规则,后面是对应要处理的链名

    -F:刷新规则库

    -Z:清空计数器

    -N|-X|-E:自己创建、删除、重命名一个链

    -P:设置默认策略,经常用来设置黑名单、白名单

    -L:列出对应表的防火墙规则,可以使用以下子选项          

    -n:以数字形式显示ip地址和端口号           

    -v -vv -vvv:显示信息的详细程度           

    -x:精确显示匹配到的包数和包的字节数           

    --line-numbers:列出每个规则的序列号           

    --modprobe=command:可以通过这个加载必要的模块

    2)匹配条件的说明:

      通用的匹配条件

      -s:指明报文的源地址

      -d:指明报文的目的地址

      -p:指明报文的协议

      -i:指明报文的进入的网卡,与INPUT链一起使用

      -o:指明报文出去的网卡,与OUTPUT一起使用

      注:每个选项前面都可以加 !来取反

      扩展匹配

      扩展匹配:隐式扩展、显式扩展,隐式扩展是 -p 指定协议的补充说明,显式扩展是用 -m 来指定特定的其他扩展选项。

     常见隐式扩展:

         tcp协议的扩展选项:

         --sport:指定源端口,udp协议也同样适用

         --dport:指定目标端口,udp协议也同样适用

         --tcp-flags:指明tcp报文中的状态时,格式:--tcp-flags mask(要检查的状态值) comp(为1的状态值),可以设置的状态值有SYN ACK FIN RST URG PSH ,ALL表示所有的状态,NONE表示所有没有设定           

         如:--tcp-flags ALL ALL 检查所有状态都为1           

             --tcp-flags ALL NONE 检查所有状态都为0

             --syn只检查SYN状态标志位为1

         icmp协议常见扩展:

         icmp-type:icmp报文的类型,常见的有0和8,0代表响应报文,8代表请求报文。

     常见显式扩展:

         iprange:指明ip范围的

         --src-range:指明源地址的范围          

         用法:--src-range from[-to] 例如:--src-range 192.168.1.1-192.168.1.24

         --dst-range:指明目标地址的范围,用法同--src-range相同

         multiport:指明多端口,只能用于tcp和udp协议

         --sports:指明多个源端口          

         例如:--sports 21,22,80,53

         --dports:指明多个目标端口

         --ports:指明多个端口,这些端口包括源端口和目标端口

         connlimit:限定连接的并发数

         --connlimit-above:同一客户端的连接并发数

         --connlimit-msak:指明客户端的有掩码位数(prefix length)

         limit:限制传输速率的

         --limit-rate:限制传输速率的的          

        用法:--limit rate[/second|/minute|/hour|/day]

        --limit-brust:brust是令牌桶,里面存放的是令牌的个数。简单的来说,客户端只用得带令牌才可以传输数据,此令牌数会累加

        string:过滤字符串的

        --algo:指明匹配字符串的加密类型 kmp和bm(根据人名命名的)

        --string:指明匹配的字符串

        --hex-string:匹配的字符串使用十六进制形式给出

        --from:指明匹配字符串的开始处,默认是0

        --to:指明匹配字符串的结束处,默认是65535

        time:限定时间和日期

        --datestart:起始日期,格式:YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

        --datestop:截止日期,格式同上

        --timestart:起始时间,格式是:hh:mm[:ss]

        --timestop:截止时间,格式同上

        --weekdays:指定星期数:Mon, Tue, Wed, Thu, Fri, Sat,Sun 也可以使用1-7

        --monthdays day:指明一个月中的特定天数,1-31都可以使用

        state:指明连接的状态

        --state:指明连接状态,状态有:          

        NEW:新建立的连接           

        ESTABLISHED: 已建立的连接           

        RELATED: 关联的连接           

        INVILID:表示无效的状态

        recent: 阻挡大量的请求,例如可以防止DOS的***

    3)在内核里面维护了地址列表,这个列表可以通过--set, --rcheck, --update and --remove四种方法来修改列表。--set, --rcheck, --update and --remove 是相互排斥的,不可同时使用。recent模块个规则有返回值(布尔值),为真会执行 -j 指定的动作。

       --set:将地址添加到地址列表中,包含地址的时间戳

       --name:指定地址列表的名字,默认是DEFAULT

       --rsource --rdest:指明当前的规则是应用到数据包的源地址还是目标地址,默认是源地址

       --rcheck:检查地址是否在地址列表中

       --remove:删除地址列表中的

       --update:和rcheck作用一样,但他会刷新时间戳

       --hitcount:指定时间内的命中数(在地址列表中匹配的次数),必须与-rcheck和--update同时使用

       --seconds:用法:--seconds n (限制数据包里的地址记录到地址列表里的时间要小于n) ,必须与-rcheck和--update同时使用

     4)目标:

       一般有-j选项指定,常见的有:DROP,ACCEPT,REJECT,DNAT,SNAT,MASQUERADE,RETRUN,MARK,LOG

       DROP,ACCEPT,REJECT常用与过滤数据包

       DNAT,SNAT,MASQUERADE用在地址转换的模块

       DNAT常与--to-destination一起使用,指明目标地址转换的地址

       SNAT常与--to-source一起使用,指明目标地址转换的地址,但有时这个地址是动态获取的,所以就要借助于MASQUERADE来动态指明要转换的地址

       RETRUN:是跳转,通常用在自定义的链上,在自义链中无法匹配报文时,将其返回主链

       LOG:是定义日志功能的,常见的选项有 --log-prefix (用于在日志信息中标注信息)、 --log-level(用于指明日志的级别)

四、练习巩固

    注意:以下练习iptables防火墙INPUT和OUTPUT默认策略为DROP;

    1、限制本地主机的web服务器在周一不允许访问;新请求的速率不能超过100个每秒;web服务器包含了admin字符串的页面不允许访问;web服务器仅允许响应报文离开本机;

    # iptables -t filter -A INPUT -d 192.168.2.5 -p tcp --dport 80 -m state --state NEW -m limit --limit 100/second -m time ! --weekdays Mon  -j ACCEPT

    # iptables -t filter -A INPUT -d 192.168.2.5 -p tcp --dport 80 -m state --state ESTABLISHED -j ACCEPT

    # iptables -t filter -A OUTPUT-s 192.168.2.5 -p tcp --sport 80 -m state --state ESTABLISHED -m string --algo kmp ! --string "admin" -j ACCEPT

    

    2、在工作时间,即周一到周五的8:30-18:00,开放本机的ftp服务给192.168.2.0网络中的主机访问;数据下载请求的次数每分钟不得超过5个

    # iptables -t filter -R INPUT 2 -d 192.168.2.5 -s 192.168.2.0/24 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -m time --weekdays Mon,Tus,Wed,Thu,Fri --timestart 08:00:00 --timestop 18:00:00 -j ACCEPT

    # iptables -t filter -R INPUT 3 -d 192.168.2.5  -s 192.168.2.0/24 -p tcp -m state --state RELATED  -m limit --limit 5/min  -j ACCEPT

    # iptables -t filter -A INPUT -d 192.168.2.5  -s 192.168.2.0/24 -p tcp -m state --state ESTABLISHED  -j ACCEPT

    # iptables -t filter -A OUTPUT -d 192.168.2.0/24 -s 192.168.2.5 -p tcp -m state --state ESTABLISHED -j ACCEPT 

    

    3、开放本机的ssh服务给192.168.2.10-192.168.2.20中的主机,新请求建立的速率一分钟不得超过2个;仅允许响应报文通过其服务端口离开本机;

    # iptables -t filter -A INPUT -d 192.168.2.5 -p tcp --dport 22 -m state --state NEW -m iprange --src-range 192.168.2.10-192.168.2.20 -m limit --limit 2/min -j ACCEPT 

    # iptables -t filter -A INPUT -d 192.168.2.5 -p tcp --dport 22 -m state --state ESTABLISHED -m iprange --src-range 192.168.2.10-192.168.2.20  -j ACCEPT

    # iptables -t filter -A OUTPUT -s 192.168.2.5 -p tcp --sport 22 -m iprange --dst-range 192.168.2.10-192.168.2.20 -m state --state ESTABLISHED -j ACCEPT

    

    4、拒绝TCP标志位全部为1及全部为0的报文访问本机;

    # iptables -t filter -A INPUT -d 192.168.2.5 -p --tcp-flags ALL ALL -j DROP


    5、允许本机ping别的主机;但不开放别的主机ping本机;

    # iptables -A INPUT -p icmp --icmp-type 8 -d 192.168.2.5 -j DROP

    # iptables -A OUTPUT -p icmp --icmp-type 0 -s 192.168.2.5 -j ACCEPT