linux iptables理论学习

  近来回顾系统知识,想写个基于iptables安全防护的脚本,实现系统自动防御。html

  参考文档:http://blog.chinaunix.net/uid-26495963-id-3279216.html安全

  iptables的历史网络

    iptables的前身叫ipfirewall (内核1.x时代),这是一个做者从freeBSD上移植过来的,可以工做在内核当中的,对数据包进行检测的一款简易访问控制工具。可是ipfirewall工做功能极其有限(它须要将全部的规则都放进内核当中,这样规则才可以运行起来,而放进内核,这个作法通常是极其困难的)。当内核发展到2.x系列的时候,软件改名为ipchains,它能够定义多条规则,将他们串起来,共同发挥做用,而如今,它叫作iptables,能够将规则组成一个列表,实现绝对详细的访问控制功能。 架构

   他们都是工做在用户空间中,定义规则的工具,自己并不算是防火墙。它们定义的规则,可让在内核空间当中的netfilter来读取,而且实现让防火墙工做。而放入内核的地方必需要是特定的位置,必须是tcp/ip的协议栈通过的地方。而这个tcp/ip协议栈必须通过的地方,能够实现读取规则的地方就叫作 netfilter.(网络过滤器) tcp

 

    做者一共在内核空间中选择了5个位置, 函数

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

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

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

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

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

  iptables的工做机制

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

     1.PREROUTING (路由前)

     2.INPUT (数据包流入口)

     3.FORWARD (转发管卡)

     4.OUTPUT(数据包出口)

     5.POSTROUTING(路由后)

   iptables的动做和策略

     防火墙的动做总共就两种,ACCEPT和DROP,不是经过就是丢弃。而针对不一样位置有不一样的策略表,每一个表在不一样的位置上有不一样的链(chain)。

      image

       image

       如图所示,咱们如今用的比较多链的功能有3个:

        1.filter 定义容许或者不容许的

        2.nat 定义地址转换的 

        3.mangle功能:修改报文原数据

       iptables规则的写法

       iptables定义规则的方式比较复杂:

       格式:iptables [-t table] COMMAND chain CRETIRIA -j ACTION

                -t table :3个filter nat mangle

                COMMAND:定义如何对规则进行管理

                chain:指定你接下来的规则究竟是在哪一个链上操做的,当定义策略的时候,是能够省略的

                CRETIRIA:指定匹配标准

                -j ACTION :指定如何进行处理

                好比:不容许172.16.0.0/24的进行访问。

                iptables -t filter -A INPUT -s 172.16.0.0/16 -p udp --dport 53 -j DROP

                固然你若是想拒绝的更完全:

                iptables -t filter -R INPUT 1 -s 172.16.0.0/16 -p udp --dport 53 -j REJECT

                iptables -L -n -v #查看定义规则的详细信息

        iptables COMMAND详解

           1.链管理命令

              -P :设置默认策略的  (accept|drop)

                   iptables –P INPUT (ACCEPT|DROP)

               -F:清空规则链

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

               -X: 删除一个用户自定义链

               -E: 用于重命名用户自定义链的名称

               -Z: 清空链及链中的计数器

            2.规则管理命令

                -A :追加

                -I chain num: 插入

                -R chain num:替换

                -D chain num:删除

            3.查看管理命令 “-L”

                 -n :以数字方式显示ip

                 -v :显示详细信息

                 -vv -vvv越多越详细

                 -x :在计数器上显示精确值,不作单位换算

                 --line-numbers :显示规则行号

                 -t nat:显示全部的关卡的信息

          详解匹配标准

                  1.通用匹配:源地址目标地址的匹配

                               -s: 指定做为源地址匹配,这里不能指定主机名称,必须是IP

                                     IP  |  IP/MASK | 0.0.0.0/0.0.0.0

                               -d: 表示匹配目标地址

                               -p: 用于匹配协议的

                               -i eth#:从这块网卡流入的数据

                               -o eth#:从这块网卡流出的数据

                   2.扩展匹配:对协议的扩展

                              -p tcp :TCP协议的扩展

                                         --dport ##-##:  xx制定目的端口

                                         --tcp-flags: TCP的标志位

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

                            -p udp : UDP协议的扩展

                                         --dport

                                         --sport

                            -p icmp : icmp数据报文的扩展

                                         --icmp-type icmp的类型

                     3.显示扩展

                             -m,表示启用多端口扩展

                             以后咱们就能够启用好比 –dports 21,23,80

                 详解-j ACTION

                         经常使用的ACTION

                             DROP:悄悄丢弃

                             REJECT:明示拒绝

                             ACCEPT:接受

                详解状态检测

     什么是状态检测?对于整个TCP协议来说,它是一个有链接的协议,三次握手中,第一次握手,咱们就叫NEW链接,而从第二次握手之后的,ack都为1,这是正常的数据传输,和tcp的第二次第三次握手,叫作已创建的链接(ESTABLISHED),还有一种状态,比较诡异的,好比:SYN=1 ACK=1 RST=1,对于这种咱们没法识别的,咱们都称之为INVALID没法识别的。还有第四种,FTP这种古老的拥有的特征,每一个端口都是独立的,21号和20号端口都是一去一回,他们之间是有关系的,这种关系咱们称之为RELATED。

                因此咱们的状态一共有四种:

                         NEW

                         ESTABLISHED

                         RELATED

                         INVALID

 

             具体这个状态检测能够用来作什么呢?

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -j REJECT

        这句命令的意思是在INPUT的位置只容许第二次握手后的数据包和有依赖关系的数据包经过,这样就能让外部用户都没法发起对本机tcp链接,对于处于公网上,非C/S架构的业务会比较有效。

       可是这句话有个问题,你连第一次发起的连接都拒绝了,那我root用户不是想管都管不上了?

       因而就须要在这句话前放行你本身所在的IP网段的tcp state new,让本地网络能够访

iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

  

          limit,limit-burst详解

       从iptables指南上看出limit和limit-burst最初不是拿来限速的。是拿来限制日志记录的次数的(iptables的logging功能),好比一秒1w个包,经过iptables的匹配了logging规则,都记录下来,log信息会无比庞大。在logging的规则中加上limit以后,能够有每秒/分/小时记录多少次的效果。

iptables -A INPUT -i wlan0 -m limit --limit 1000/s -j ACCEPT
iptables -A INPUT -i wlan0 -j DROP

       这两条规则一块儿,能够有限制没秒经过无线网卡上传包的数目为1000,由于INPUT 进来的包,进行ACCEPT的次数被限制为1000次每秒,OUTPUT也是如此。

       另外须要注意的是第二条规则iptables -A INPUT -i wlan0 -j DROP  若是没有它,限速不成功。

       由于在iptables里,一个包不符合某条规则,就会由后面的规则来处理,若是都不符合,就由缺省的策略处理。因此若是limit后面没规则了,默认规则就是全量ACCEPT,也就是每秒ACCEPT规则匹配超过1000次以后,那些包,都由默认规则(ACCEPT)来处理,因此没法限速。

         关于limit-burst

         我的理解limit-burst是个初始值..匹配次数过了这个初始值,以后的就由limit xxx/s来控制了 

相关文章
相关标签/搜索