iptables由浅入深(1原理)

Iptables原理

现在防火墙主要分以下三种类型:包过滤、应用代理、状态检测

包过滤防火墙:现在静态包过滤防火墙市面上已经看不到了,取而代之的是动态包过滤技术的防火墙哈~

代理防火墙:因一些特殊的报文攻击可以轻松突破包过滤防火墙的保护,比如大家知道的SYN攻击、ICMP洪水攻击,所以以代理服务器作为专门为用户保密或者突破访问限制的数据转发通道的应用代理防火墙出现了哈~其使用了一种应用协议分析的新技术。

状态检测防火墙:其基于动态包过滤技术发展而来,加入了一种状态检测的模块,进一点发展了会话过滤功能,会话状态的保留是有时间限制的,此防火墙还可以对包的内容进行分析,从而避免开放过多的端口。

netfilter/iptables IP数据包过滤系统实际上由netfilter和iptables两个组件构成。netfilter是集成在内核中的一部分,其作用是定义、保存相应的规则,而iptables是一种工具,用来修改信息的过滤规则及其他配置,我们可以通过iptables来设置一些适合我们企业需求环境的规则哈~,而这些规则会保存在内核空间之中。

netfilter是Linux核心中的一个通用架构,其提供了一系列的表(tables),每个表由若干个链(chains)组成,而每条链可以由一条或若干条规则(rules)组成。实际上netfilter是表的容器,表是链的容器,而链又是规则的容器。

iptables是针对Linux防火墙 netfilter的管理配置工具。在进行iptables防火墙设置前,必须打开系统内核的IP转发功能,使系统成为路由器。在Red Hat中有以下两种方法实现:

  1.修改内核变量ip_forward

    #echo "1" > /proc/sys/net/ipv4/ip_froward

  2.修改脚本/etc/sysconfig/network

将FROWARD_IPV4=false 改为  FROWARD_IPV4=true

一、数据包流经netfilter防火墙的路径

  1.流入本机数据包的路径:

                    mangle          nat                   mangle    nat     filter

    网络数据包----PREROUTING ----PREROUTING----路由选择--- INPUT ----INPUT ---INPUT -----本机程序

  2.流出本机数据包的路径:

                     mangle    filter                  mangle           nat

    本机程序数据包à OUTPUT -- OUTPUT --- 路由选择 ---- POSTROUTING ----POSTROUTING ---- 网络线路

  3.流经本机转发的数据包的路径:

       A端        mangle        nat                mangle    nat     filter     mangle       nat

网络数据包 ---PREROUTING----PREROUTING---路由选择----FORWARD----FORWARD----FORWARD----POSTROUTING----POSTROUTING--- B端网络

iptables由浅入深(1原理)
 

注:①.路径上某表链规则匹配数据包并进行ACCEPT、DROP、REJECT操作时,ACCEPT使数据包直接到达目的地,DROP和REJECT则当场丢弃数据包,该数据包不会在后续路径上再出现,故会影响其它表的操作。

      ②.PREROUTING和POSTROUTING链只对请求连接的包进行操作,对属于该连接的后续包,不予比对规则,只按已确定的规则自动进行操作,因此建议不要在此链上作过滤操作,否则将漏掉对后续包的过滤。

iptables内置链

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

INPUT:通过路由表后目的地为本机

FORWARDING:通过路由表后,目的地不为本机

OUTPUT:由本机产生,向外转发

POSTROUTIONG:发送到网卡接口之前

netfilter五条链相互关系,即iptables数据包转发流程图

iptables由浅入深(1原理)
 

Iptables工作流程图

iptables拥有三个表和五条链组成

iptables由浅入深(1原理)

 nat工作原理

iptables由浅入深(1原理)

Iptables详细参数表

iptables由浅入深(1原理)
 

Iptables基本语法

iptables [-t 表名] -命令 -匹配 -j 动作/目标

iptables内置了filter、nat和mangle三张表,我们可以使用-t参数来设置对哪张表生效也可以省略-t参数,则默认对filter表进行操作。

具体命令参数可以通过man iptables查询

二、iptables指令的基本格式:

    <iptables> [-t table] < COMMAND  > [chains] [rule-matcher] [ -j  target ]

    <指    令>  [指定表] <指定操作命令>[指定链] [指定匹配规则] [指定目标动作]

注:<>括起来的为必设项,[]括起来的为可设项。iptables指令要求严格区分大小写! 

三、iptables指令的语法规则要素:

  1、netfilter表(Table)

     netfilter的表操作是以-t或--table<table>来指定的,未指定时默认为filte表。共有以下三种表:

      ①.Filter表    (过滤表)

      ②.Nat表       (网络地址转换表)

      ③.Mangle表    (数据包处理表)

  2、常用操作命令(Command)

-A 或--append       在所选的链尾加入一条或多条规则。

-D 或--delete       从所选的链中删除一条或多条匹配的规则。

-R 或--replace      在所选的链中替换一条匹配的规则,需指定规则中的数字。

-I 或--insert       按给出的规则号在所选的链中插入一条规则。

-L 或--list         列出指定链的全部规则,如未指定链,则列出所有链的全部规则。

-F 或--flush        清除指定链和表中的全部规则,如未指定链,则所有链都将被清。

-N 或--new-chain    以给定的名字创建一条新的用户自定义链,不能与已有的链同名。

-X 或--delete-chain 删除指定的用户自定义链,必须保证链中的规则不在使用才能删除,若未指定链,则删除所有用户自定义链。

-P 或--policy       为内置链指定默认规则(链政策)。用户自定义链没有默认规则,其默认规则是规则链中的最后一条规则,用-L命令时它显示在第一行。

-E 或--rename-chain 根据用户给出的名字对指定的自定义链进行重命名,该命令不影响Table的结构。

-C 或--check        检查给定的包是否与指定的规则相匹配。

-Z 或--zero         将指定链中所有规则的数据包(PKTS)和字节(byte)计数器清零。该计数器用来计算同一数据包出现的次数,是过滤阻断式攻击不可或缺的工具。

-h 或--help         给出当前命令语法的简短说明。

  3、链(Chains)

      ①.INPUT链         处理输入包的规则链。

      ②.OUTPUT链        处理输出包的规则链。

      ③.FORWARD链       处理转发包的规则链。

      ④.PREROUTING链    对到达且未经路由判断之前的包进行处理的规则链。

      ⑤.POSTROUTING链   对发出且经过路由判断之后的包进行处理的规则链。

      ⑥.用户自定义链     是由filter表内置链来调用的,它是针对调用链获取的数据包进行处理的规则链。

       注:①.Filter表有INPUT、OUTPUT、FORWARD和自定义四种链形式。

           ②.Nat表有OUTPUT、PREROUTING、POSTROUTING三种链形式。

           ③.Mangle表有INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING五种链形式。

  4、常用匹配规则(rule Matcher)

      -c或--set-counters       重新设置规则的计数器,可指定PKTS和BYTES选项来设置计数器计数规则。

      -s 或--source [!] address[/mask]     指定匹配规则的源主机名称、源IP地址或源IP地址范围。

      --sport 或--source-port  [!] port[:port]

 指定匹配规则的源端口或源端口范围,可用端口号,也可用/etc/services文件中的名字, 端口范围格式xxx:yyy。

      -d 或--destination [!]address[/mask]    指定匹配规则的目的地址或目的地址范围。

      --dport 或--destination-port  [!] port[:port]

 指定匹配规则的目的端口或目的端口范围,可用端口号,也可用/etc/services文件中的名字, 端口范围格式xxx:yyy。

      -i 或--in-interface  [!]interface name[+]

  指定匹配规则的对内网络接口名,默认则符合所有接口,可制定暂未工作的接口,待其工作后才起作用,该选项只对INPUT、FROWARD和PREROUTING链是合法的。

      -o 或—out-interface  [!]interface name[+]

  指定匹配规则的对外网络接口名,默认则符合所有接口,可制定暂未工作的接口,待其工作后才起作用,该选项只对OUTPUT、FROWARD和POSTROUTING链是合法的。

-j 或--jump              指定规则的目标即动作或跳转,如未指定则此规则无任何效果。

      -p 或--protocol [!] protocol

          指定匹配规则的通讯协议,如:tcp、udp、icmp、all,如未指定则匹配所有通讯协议。

      --icmp-type [!]typename   指定匹配规则的ICMP消息类型,选项后需有一个icmp名称类型、数字类型(如3)、或一对用/号分隔的数字类型和编码(如3/3),可用以下命令查看有效的icmp类型名表: iptables  -p  icmp  -h

      -f                       规则应用于IP数据包第二分片以后的分片。

      --tcp-option             这个选项后需接一个数字,用来匹配tcp选项等于该数字的数据包。如果需要检查tcp选项,那些tcp表头部完整的数据包就会被自动删除。

      --tcp-flags              此选项后需接2个参数,以对TCP标志进行筛选。第一个参数表示屏蔽(MASK),它可用来指定数据包中需要检查的TCP标志,而第二个参数表示需要设置的标准,可用的标志包括:SYN、ACK、FIN、RST、URG、PSH、ALL和NONE等,如果指定多个标志,则每个标志间需以逗号分隔。以下范例表示所有标志都要检查,但只有SYN和ACK被设置。

                              iptables –A INPUT –protocol tcp –tcp-flags ALL SYN,ACK –j DENY

      -l                      在系统日志/var/log/messages中记录与该规则匹配的数据包。

      -v                      详细输出。

      -n                      当显示时,不对IP地址执行DNS查找。

      [!] -y                  -y表明tcp握手中的连接请求标志位SYN;!-y表示对该请求的响应。

      [!]-syn                 指定仅仅匹配设置了SYN位,清除了ACK、FIN位的TCP包,该参数仅针对TCP协议类型使用。

      -m  -state              标记数据包。

注:“!”为逻辑非;接口名后跟“+”表示所有以此接口名开头的接口都会被匹配。

附:匹配条件扩展:

        TCP-----匹配源端口,目的端口,及tcp标记的任意组合,tcp选项等。

        UPD-----匹配源端口和目的端口

        ICMP----匹配ICMP类型

        MAC-----匹配接收到的数据的mac地址

        MARK----匹配nfmark

        OWNE----(仅仅应用于本地产生的数据包)来匹配用户ID,组ID,进程ID及会话ID

TOS——匹配IP头的TOS字段的值。

        LIMIT---匹配特定时间段内的数据包。这个扩展匹配对于限制dos攻击数据流非常有用。

        STATE---匹配特定状态下的数据包(由连接跟踪子系统来决定状态),可能的状态包括:

              INVALID      不匹配于任何连接的数据包

              ESTABLISHED  属于某个已经建立的连接的数据包

              NEW          请求建立连接的数据包

              RELATED    属于某个已建立连接产生的新连接的数据包,例如一个ICMP错误消息或ftp数据连接

  5、目标动作(Target)

当规则匹配一个包时,要执行的目标动作以-j参数标识。

     ①.Filter表的目标动作:

          ACCEPT  允许数据包通过。

          DROP    丢弃数据包。

②.Nat表的目标动作:

    SNAT        修改数据包的源地址。

    MASQUERADE  修改数据包的源地址,只用于动态分配IP地址的情况。

    DNAT        修改数据包的目标地址。

    REDIRECT    将包重定向到进入系统时网络接口的IP地址,目标端口改为指定端口。

③.Mangle表的目标动作:

    TTL

    TOS     用来设置IP表头中8位长度的TOS字段的值,此选项只在使用Mangle Tables时才有效。

    MARK    对数据包进行标记,供其它规则或数据包处理程序使用,此选项只在Mangle表中使用。

④.扩展的目标动作:

         REJECT  丢弃数据包的同时返回给发送者一个可配置的错误信息。

         LOG     将匹配的数据包信息,传递给syslog()进行记录。

ULOG    将匹配的数据包信息,使用用户空间的log进程进行记录。

MIRROR  互换源和目的地址以后重新传输该数据包。

TOS     改写包的TOS值。

QUEUE   表示把这个包重导入本机的队列中。

RETURN  表示跳离这条链的匹配,如果是用户自定义链,就会返回原链的下一个规则处继续检查,如果是内置链,那会参考政策来处理数据包。

        注:要使用扩展的目标动作,必须在内核中**相应选项或装载相应内核模块。

四、iptables规则集的保存、恢复和启动

  1、保存与恢复

         用iptables指令在内存中逐条建立起来的规则集,经测试通过后,可用iptables-save命令保存,其中/etc/sysconfig/iptables是iptables守护进程调用的默认规则集文件。

   保存规则集命令:

        #/sbin/iptables-save > /etc/sysconfig/iptables

   恢复规则集命令:

        #/sbin/iptables-restore < /etc/sysconfig/iptables

  2、iptables规则集脚本的启动

     ①.默认脚本的启动

Red Hat iptables的启动脚本文件/etc/rc.d/init.d/iptables在每次启动时都要使用/etc/sysconfig/iptables提供的规则进行规则恢复,并可以使用如下命令保存规则:

          #service iptables save

     ②.自定义脚本的启动

           用户可以在自定义脚本中直接用iptables命令编写一个规则集,并在启动时执行这个脚本。设用户自定义脚本文件名为/etc/fw/rules,则可以在启动脚本/etc/rc.d/rc.local中加入代码:if[-x/etc/fw/rules];then /etc/fw/rules;fi;即可在每次启动时执行该脚本。

注:如果使用此种方式,建议使用ntsysv命令关闭系统的iptables守护进程。