iptables

iptables

1.介绍

iptables是与Linux最新3.5版本的内核集成的IP信息包过滤系统。如果Linux系统连接到因特网或LAN、服务器连接到因特网或LAN的代理服务器,则该系统有利于在Linux系统上更好的控制IP信息包过滤和防火墙设置。

防火墙在做信息包过滤决定时,有一套遵循和组成的规则,这些规则存储在专用的信息包过滤表中,而这些表集成在Linux内核中。在信息包过滤表中,规则被分组放在链中(chain)。而netfilter/iptables IP信息包 过滤系统是一款功能强大的工具,可对规则进行添加、编辑、和移除的操作。

netfilter组件也称为内核空间(Kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则表。

iptables组件是一种工具,也称为用户空间(userspace),它使插入、修改、和除去信息包过滤表中的规则变得容易。

2.历史版本

与Linux内核各版本集成的防火墙历史版本:
1.     2.0.X内核:ipfwadm
2.     2.2.X内核:ipchains
3.     2.4.X内核:iptables

3.内容

Iptables采用“表”和“链”的分层结构。在REHL4中是三张表五个链。现在REHL5成了四张表五个链了,不过多出来的那个表用的也不太多,所以基本还是和以前一样。

iptables在内核中一个定义了五个位置:

1.内核空间中:从一个网络接口进来,到另一个网络接口出去。
2.数据包从内核流入用户空间。
3.数据包从用户空间流出
4.进入/离开本机的外网接口
5.进入/离开本机的内网接口

链:

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

1.PREROUTING(路由前)
2.INPUT(数据包流入)
3.FORWARD(路由转发)
4.OUTPUT(数据包流出)
5.POSTROUTING(路由后)

表:

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

功能

表<-->链
1.Filter表-->三个链:INPUT、FORWARD、OUTPUT
作用:过滤数据包  内核模块:iptables_filter.

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

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

4.Raw表-->两个链:OUTPUT、PREROUTING
作用:决定数据包是否被状态跟踪机制处理  内核模块:iptable_raw

优先级(由高而低):raw -> mangle -> nat -> filter

iptables规则的组成部分:

匹配条件:

    网络层首部:SourceIP, DestinationIP, ...
    传输层首部:SourtPort, DestinationPort, TCP Flags(SYN,ACK,FIN,URG,RST,PSH), ...
    扩展模块引入的辅助检查机制:
    跳转目标:-j target 
        内建的处理机制:ACCEPT, DROP, REJECT, SNAT, DNAT, MASQUERADE, MARK, LOG, ...
        用户自定义链:

添加规则时需要考量的因素:
    (1) 实现的功能:用于判定将规则添加至哪个表;
    (2) 报文的流经位置:用于判断将规则添加至哪个链;
    (3) 报文的流向:判定规则中何为”源“,何为”目标“;
    (4) 匹配条件:用于编写正确的匹配规则;
        (a) 专用于某种应用的同类规则,匹配范围小的放前面;
        (b) 专用于某些应用的不同类规则,匹配到的可能性较多的放前面;同一类别的规则可使用自定义链单独存放;
        (c) 用于通用目的的规则放前面;                

filter表:过滤,”防火墙“意义的核心所在;
    INPUT,FORWARD,OUTPUT

语法结构

iptables [-t 表名] 命令选项 [链名] [条件匹配] [-j 目标动作或跳转]
说明:表名、链名用于指定 iptables命令所操作的表和链,命令选项用于指定管理iptables规则的方式(比如:插入、增加、删除、查看等;
条件匹配用于指定对符合什么样条件的数据包进行处理;目标动作或跳转用于指定数据包的处理方式(比如允许通过、拒绝、丢弃、跳转(Jump)给其它链处理。

iptables [-t tables] COMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]

 [-t tables] 指明是那个表
     -t table:
         raw,mangle,nat,[filter]
COMMAND 指明规则处理命令,使用大写字母,单个表示。
    链管理:
         -N new 自定义一条新的规则链
         -X 删除自定义链
         -p 设置默认策略;对filter表中的链而言,其默认策略:
             ACCEPT:接受
             DROP:丢弃
             REJECT:拒绝
         -E 重命名自定义链;应用技术不为0的自定义链,不能够被重命名,也不能被删除
    规则管理:
        -I 插入一条规则
         -A 追加一条规则
         -D 删除一条规则
             指明规则序号
             指明规则本身
         -R 替换指定链上的指定规则
         -F 清空指定的规则链
         -Z 置零
             iptables的每条规则都有两个计数器
                     匹配到的报文个数
                     匹配到的所有报文的大小之和
     查看:
         -L:列出指定链上的所有规则
             -n 以数字格式显示地址和端口号
             -v 详细信息
                 -vv -vvv
             -x 显示计数器结果的精确值
             --line-numbers 显示规则序号
         -S 显示指定链上的所有规则
chain  添加到哪个链
[-m matchname [per-match-options]]  扩展匹配条件
    matchname匹配条件
[per-target-options]   扩展处理机制
    target跳转目标

小写字母,做匹配条件定义

大写字母,做处理动作定义

格式:

 iptables [-t table] {-A|-C|-D} chain rule-specification

iptables [-t table] -I chain [rulenum] rule-specification

iptables [-t table] -R chain rulenum rule-specification

iptables [-t table] -D chain rulenum

iptables [-t table] -S [chain [rulenum]]

iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]

iptables [-t table] -N chain

iptables [-t table] -X [chain]

iptables [-t table] -P chain target

iptables [-t table] -E old-chain-name new-chain-name

    rule-specification = [matches...] [target]

    match = -m matchname [per-match-options]

    target = -j targetname [per-target-options]            

详细命令管理选项

-A 在指定链的末尾添加(append)一条新的规则
-D  删除(delete)指定链中的某一条规则,可以按规则序号和内容删除
-I  在指定链中插入(insert)一条新的规则,默认在第一行添加
-R  修改、替换(replace)指定链中的某一条规则,可以按规则序号和内容替换
-L  列出(list)指定链中所有的规则进行查看
-E  重命名用户定义的链,不改变链本身
-F  清空(flush)
-N  新建(new-chain)一条用户自己定义的规则链
-X  删除指定表中用户自定义的规则链(delete-chain)
-P  设置指定链的默认策略(policy)
-Z 将所有表的所有链的字节和数据包计数器清零
-n  使用数字形式(numeric)显示输出结果
-v  查看规则表详细信息(verbose)的信息
-V  查看版本(version)
-h  获取帮助(help)

匹配条件:

通用匹配(PARAMETERS):
    [!] -s, --source address[/mask][,...]:检查报文的源IP地址是否符合此处指定的范围,或是否等于此处给定的地址;
    [!] -d, --destination address[/mask][,...]:检查报文的目标IP地址是否符合此处指定的范围,或是否等于此处给定的地址;
       匹配所有地址写成0.0.0.0
    [!] -p, --protocol protocol:匹配报文中的协议,可用值tcp, udp,  udplite, icmp,  icmpv6,esp,  ah, sctp, mh 或者  "all", 亦可以数字格式指明协议;
     -m, --match match:调用指定的扩展匹配模块来扩展匹配条件检查机制;
    [!] -i, --in-interface name:限定报文仅能够从指定的接口流入;only for packets entering the INPUT, FORWARD  and  PREROUTING  chains.
    [!] -o, --out-interface name:限定报文仅能够从指定的接口流出;for packets entering the FORWARD, OUTPUT and POSTROUTING chains.
扩展匹配(MATCH EXTENSIONS)
    -m tcp  --sport, --dport

隐式扩展:

-p tcp:可直接使用tcp扩展模块的专用选项;
    [!] --source-port,--sport port[:port]  匹配报文源端口;可以给出多个端口,但只能是连续的端口范围 ;
    [!] --destination-port,--dport port[:port]   匹配报文目标端口;可以给出多个端口,但只能是连续的端口范围 ;
    [!] --tcp-flags mask comp  匹配报文中的tcp协议的标志位;Flags are: SYN ACK FIN RST URG PSH ALL NONE;
        mask:要检查的FLAGS list,以逗号分隔;
        comp:在mask给定的诸多的FLAGS中,其值必须为1的FLAGS列表,余下的其值必须为0;
            --tcp-flags SYN,ACK,FIN,RST  SYN
            --tcp-flags ALL ALL
            --tcp-flags ALL NONE
    [!] --syn:    --tcp-flags SYN,ACK,FIN,RST  SYN    

-p udp:可直接使用udp协议扩展模块的专用选项:
    [!] --source-port,--sport port[:port]
    [!] --destination-port,--dport port[:port]

[!] --icmp-type {type[/code]|typename}
    0/0: echo reply
    8/0:echo request

显式扩展:

必须使用-m选项指明要调用的扩展模块的扩展机制;

1、multiport

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

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

# iptables -I INPUT  -d 172.16.0.7 -p tcp -m multiport --dports 22,80,139,445,3306 -j ACCEPT

2、iprange

以连续地址块的方式来指明多IP地址匹配条件;
[!] --src-range from[-to]
[!] --dst-range from[-to]

# iptables -I INPUT -d 172.16.0.7 -p tcp -m multiport --dports 22,80,139,445,3306 -m iprange --src-range 172.16.0.61-172.16.0.70 -j REJECT

3、time

This  matches  if the packet arrival time/date is within a given range.

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

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

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

--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

 --kerneltz:使用内核配置的时区而非默认的UTC;

4、string

This modules matches a given string by using some pattern matching strategy. 

--algo {bm|kmp}
[!] --string pattern
[!] --hex-string pattern

--from offset
--to offset

~]# iptables -I OUTPUT -m string --algo bm --string "gay" -j REJECT

5、connlimit 

Allows  you  to  restrict  the  number  of parallel connections to a server per client IP address (or client address block).

--connlimit-upto n
--connlimit-above n

~]# iptables -I INPUT -d 172.16.0.7 -p tcp --syn --dport 22 -m connlimit --connlimit-above 2 -j REJECT

6、limit 

This  module  matches  at  a limited rate using a token bucket filter. 

--limit rate[/second|/minute|/hour|/day]
--limit-burst number

~]# iptables -I OUTPUT -s 172.16.0.7 -p icmp --icmp-type 0 -j ACCEPT

7、state

The "state" extension is a subset of the "conntrack" module.  "state" allows access to the connection tracking state for this packet.

[!] --state state
    INVALID, ESTABLISHED, NEW, RELATED or UNTRACKED.

    NEW: 新连接请求;
    ESTABLISHED:已建立的连接;
    INVALID:无法识别的连接;
    RELATED:相关联的连接,当前连接是一个新请求,但附属于某个已存在的连接;
    UNTRACKED:未追踪的连接;

state扩展:
    内核模块装载:
        nf_conntrack
        nf_conntrack_ipv4

        手动装载:
            nf_conntrack_ftp 

                追踪到的连接:
                    /proc/net/nf_conntrack

                调整可记录的连接数量最大值:
                    /proc/sys/net/nf_conntrack_max

                超时时长:
                    /proc/sys/net/netfilter/*timeout*

处理动作(跳转目标):

-j targetname [per-target-options]
    简单target:
        ACCEPT, DROP

    扩展target:
        REJECT
            This is used to send back an error packet in response to the matched packet: otherwise it is equivalent to  DROP  so it  is  a  terminating  TARGET,  ending  rule traversal.

            --reject-with type
                The type given can be icmp-net-unreachable, icmp-host-unreachable, icmp-port-unreachable, icmp-proto-unreach‐ able, icmp-net-prohibited, icmp-host-prohibited, or icmp-admin-prohibited (*), which return  the  appropriate ICMP  error  message (icmp-port-unreachable is the default).

        LOG
            Turn  on  kernel  logging of matching packets.

            --log-level
            --log-prefix

    自定义链做为target:

保存和载入规则:

保存:iptables-save > /PATH/TO/SOME_RULE_FILE
重载:iptabls-restore < /PATH/FROM/SOME_RULE_FILE
    -n, --noflush:不清除原有规则
    -t, --test:仅分析生成规则集,但不提交

================================================================================

<% if (theme.canvas_nest) { %> <% } %> s