netfilter是实现linux防火墙框架的内核模块。形象的说,netfilter在内核的网络协议中设置了5个哨卡,负责检查或处置进出或转发的IP包。这5个哨卡就是PREROUTING, INPUT, OUTPUT, FORWARD, POSTROUTING。通过这5个哨卡可以实现4种功能:raw, mangle, nat, filter。在Linux防火墙的专业术语中,这些哨卡就叫作链(CHAIN),功能叫作表(TABLE)。在每个链上能实现的功能是不同的。反过来说,即每个功能能部署的哨卡(即链)是不一样的。如下所示:

filter表:INPUT  OUTPUT  FORWARD

nat表:   PREROUTING  POSTROUTING  OUTPUT

mangle表:PREROUTING  INPUT  OUTPUT  FORWARD  POSTROUTING

raw表:   PREROUTING  OUTPUT


      iptables是Linux防火墙的配置工具,通过其在netfilter的具体表链上添加或删除指定的规则以实现在内核空间对IP包的管理。下面简要总结一下iptables命令的常用选项和参数:

    iptables [-t table] {-L|-F|-Z} [ CHAIN [num]] [options]

        -L    查看指定表table的指定链CHAIN中的规则。省略num,则显示该链中所有的规则;省略CHAIN,则显示该表所有链的所有规则。省略table,默认为filter表。

        -F    清空指定表table的指定链CHAIN中的规则。

        -Z   对指定表table的指定链CHAIN中的规则计数器作清零操作。

    options中常用的参数:

        -n    以数字格式显示IP和PORT。

        -v    以详细格式显示。

        -x    对匹配到的包数、字节数等数据不作单位换算,显示精确值。

        --line-number   显示各规则的行号。


    iptables [-t table] -A CHAIN rule-specification

    在指定表table的指定链CHAIN的尾部追加一条规则。


    iptables [-t table] -I CHAIN [num] rule-specification

    在指定表table的指定链CHAIN中插入一条规则。其中数字num表示插入的行号,省略num表示插入在第1行。


    iptables [-t table] -D CHAIN num

    在指定表table的指定链CHAIN中删除指定行号的规则。


    iptables [-t table] -R CHAIN num rule-specification

    在指定表table的指定链CHAIN中第num行的规则替换为指定的规则。


    iptables [-t table] -P CHAIN target

    对指定表table的指定链CHAIN指定的默认策略,如DROP, ACCEPT等。


    iptables [-t table] -S [CHAIN]

    以文本的形式显示指定表table的指定链CHAIN的配置规则。


    rule-specification 由匹配条件和处理策略组成: 匹配条件 -j 处理策略

    主要处理策略(target): ACCEPT, DROP, REJECT, SNAT, DNAT, LOG, RETURN, REDIRECT.

    匹配条件分为以下2类

    基本匹配条件:

        -s :匹配原地址,可以IP,也可以网络地址。

        -d : 匹配目标地址。

        -p : 匹配协议,通常只使用{TCP|UDP|ICMP}三者之一

        -i :数据报文流入的接口;通常只用于INPUT、FORWARD和PREROUTING

        -o :流出的接口;通常只用于OUTPUT、FORWARD和POSTROUTING


    扩展匹配条件:

    隐含扩展: 使用-p {tcp|udp|icmp}指定某特定协议后,自动能够对协议进行的扩展

        -p tcp
             --dport m[-n] :匹配的目标端口,可以是连续的多个端口
             --sport m[-n] :匹配源标端口,可以是连续的多个端口
             --tcp-flags check_flags_list true_flags_list  check_flags_list是要检查的标志位列表,true_flags_list是要其值为‘1’的标志位列表。“ALL”可以表示所有的标志位,“NONE”表示不包含任意标志位。

             --syn    相当于--tcp-flags URG,PSH,RST,SYN,ACK,FIN SYN 

                      也相当于--tcp-flags ALL SYN

        -p udp
             --dport m[-n] :匹配的目标端口,可以是连续的多个端口

             --sport m[-n] :匹配源标端口,可以是连续的多个端口


        -p icmp
             --icmp-type type    指定icmp包的类型。8: ping请求,0:ping响应。


    显式扩展:必须明确指定的扩展模块
       -m 扩展模块名称 --专用选项1 --专用选项2 。。。

  • multiport: 多端口匹配,一次指定多个(15个以内)离散端口
       --source-ports , --sports   port[,port|,port:port]
       --destination-ports, --dports port[,port|,port:port]

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

     例子:
        iptables -I INPUT -d 172.16.100.7 -p tcp -m multiport --dports 22,80 -j ACCEPT
        iptables -I OUTPUT -s 172.16.100.7 -p tcp -m multiport --sports 22,80 -j ACCEPT


  • iprange: ip地址范围
       --src-range from[-to]
       --dst-range from[-to]

     例子:
       iptables -A INPUT -p tcp --dport 23 -m iprange --src-range 172.16.100.1-172.16.100.100 -j ACCEPT
       iptables -A OUTPUT -p tcp --sport 23 -m iprange --dst-range 172.16.100.1-172.16.100.100 -j ACCEPT


  • time: 指定时间范围
        --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
        --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

        --timestart hh:mm[:ss]
        --timestop hh:mm[:ss]

        --weekdays day[,day...]

     例子:
         iptables -A INPUT -p tcp --dport 80 -m time --weekdays Mon,Tus,Wed,Thu,Fri --timestart 08:00 --time-stop 18:00 -j ACCEPT


  • string: 字符串匹配
       --algo {bm|kmp}:字符匹配查找时使用算法
       --string "STRING": 要查找的字符串
       --hex-string “HEX-STRING”: 要查找的字符,先编码成16进制格式

  • connlimit: 每IP对指定服务的最大并发连接数;
          --connlimit-above [
    n]


  • limit: 报文速率控制
       
      --limit number[/second|/minute|/hour|/day]
          --limit-burst number


  • state: 状态匹配。启用该扩展模块,则内核模块需要加载mod: ip_conntrack, nf_conntrack。默认已经加载。

              --state    指定连接的状态类型:NEW,  ESTABLISHED,  RELATED,  INVALID


组织iptables匹配规则的法则:
    1. 对于进入的状态为ESTABLISHED都应该放行;
    2. 对于出去的状态为ESTABLISHED都应该放行;
    3. 严格检查进入的状态为NEW的连接;
    4. 所有状态为INVALIED都应该拒绝;


FTP相关规则生效必须加载的内核模块
    1. 确保iptables加载ftp协议支持的模块:ip_nat_ftp, ip_conntrack_ftp
           编辑/etc/sysconfig/iptables-config文件,定义如下参数:
               IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp"

    2. 放行请求报文的RELATED和ESTABLISHED状态,放行响应报文的ESTABLISHED状态;


netfilter相关的调优参数

    1. 调整连接追踪功能所能容纳的追踪的最大连接数:
           # cat /proc/sys/net/nf_conntrack_max
    2. 定义了连接追踪的最大值,因此,建议按需调大此值;

           # cat /proc/net/nf_conntrack
    3. 记录了当前追踪的所有连接

           # cat /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established