iptables详解

  1. 1.    iptables

用于实现Linux下访问控制的功能,它分为硬件或软件防火墙两种,无论哪种,防火墙都是工作的地方一定是在网络的边缘,我们的工作就是需要去定义到底防火墙是如何工作,这就是防火墙的策略以及规则,以达到让它对出入网络的IP,数据进行检测.

iptables/netfilter:软件实现的主机或网络防火墙

主机防火墙:服务范围为当前主机;

网络防火墙:服务范围为局域网;

iptables/netfilterIP数据包过滤系统实际上有netfilter和iptables两个组件构成,

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

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

        iptables包含4个表,5个链,其中表是按照对数据包的操作区分的,链是按照不同的Hook(钩子)点来区分的,实际上似乎netfilter的两个维度.

        4个表:filter,nat,mangle,raw,默认的表是filter(没有指定表的时候就是filter表).表的处理优先级为:rawàmangleànatàfilter.

               filter:一般的过滤功能

               nat:用于nat功能(端口映射,地址映射等)

               mangle:拆解数据包,做出修改,并重新封装起来

               raw:优先级最高.设置raw时一般是为了不再让iptables做数据包的链接跟踪处理,提高性能.

        5个链:PREROUTING,INPUT,OUTPUT,FORWARD,POSTROUTING

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

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

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

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

               POSTROUTING:发送到网卡接口之前.

              iptables中表和链的对应关系:

                     raw:PREROUTING,OUTPUT

                     mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

                     nat:PRETOUTING,INPUT,OUTPUT,POSTROUTING

                     filter:INPUT,FORWOAR,OUTPUT

最常用的链:input(进入),output(出去),forward(转发),而PREROUTING和POSTROUTING用于网络地址转换(NAT)

              报文流向:

                     到本机某进程的报文:PREROUTINGàINPUT

当一个数据包进入网卡时,首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去,如果数据包是进入本机的,则数据包会到达INPUT链.到达后,任何进都会收到它.

                     由本机转发的报文:PREROUTINGàFORWARDàPOSTROUTING

由上文的第一步开始后,内核根据数据包目的IP判断需要转送出去后,且内核允许转发,数据包会送到FORWARD链,然后在到达POSTROUTINGOUT链输出.

                     由本机某进程发出的:OUTPUTàPOSTROUTING

              规则的组成部分:

规则就是运维管理人员定制的条件,规则一般定义为如果数据包头符合条件,就处理处理数据包,规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址,目的地址,传输协议(如TCP,UDP,SMCP等)当数据包于规则匹配是,iptables就根据所定义的方法来处理数据包,如放行,(ACCEPT),拒绝(REJECT),丢弃(DROP)等,配置防火墙的主要工作就是添加,修改和删除这些规则.

注意:处理数据包时,如果不想处理数据包时,定义方法最好为丢弃(DROP),如果处理方法为拒绝(REJECT)的话对方根据此来判断此主机是存在,那么就会想法设法***.

             

  1. 2.    iptables命令

规则的编写格式:

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

                    

                     -t:表名

                            默认为filter,其他可用的有raw,mangle,nat

                    

                     COMMAND:

                            链:

                                   -P:policy,策略,定义默认策略;一般有两种选择,ACCEPT(放行)和DROP(丢弃)

                                   -N:new,新建一条自定义的规则链;被内建链上的规则调用才能生效;[-j                                           chain_name];                              

                                   -X:drop,删除自定义的引用计数为0的空链;

                                   -F:flush,清空指定的链;

                                   -E:重命名自定义的引用计数和为0的链;

                            规则:

                                   -A:append,追加,在指定链的尾部追加一条规则;

                                   -I:insert,插入,在指定的为位置(省略位置时表示链首)插入一条规则;

                                          -I 3:表示插入为第3条

                                   -D:delete:删除,删除指定的规则

                                          -D 3:表示删除为第3条

-R:replace,替换,将指定的规则替换为新规则;不能仅修改规则中的部分,而是全部替换;              

       -R 3:表示替换第3条规则

                      查看:

                             -L:list,列出表中链上的规则;

                                    -n:numeric,以数值格式显示;

                                    -v:verbose,显示详细格式信息;

                                           -vv,-vvv:表示更加详细的格式信息

                                    -x:exactly:计数器的精确结果;

                                    --line-numbers:显示链中的规则编号;

                      计数器:

                             重置规则计数器:

                                    -Z:zero,归0操作;

              Chain

(1)  内建链;

(2)  自定义链;

匹配条件:

       多重条件:逻辑关系为与;

       基本匹配条件:

[!] –s,--sourceaddress[/mask][,…:] :检查报文中的源IP地址是否符合此处指定的地址或范围;可以写多重条件用”,”隔开

[!] –d, --destinationaddress[/mask][,…] :检查报文中的目标IP地址是否符合此处指定的地址;

       [!] –p,--protocol {TCP|UDP|ICMP}:检查报文中的协议是否符合此处指定的协议

       [!] -i, --in-interface name:数据报文的流入接口;INPUT,FORWARDand PREROUTING

[!] –o, --out-interfacename:数据报文的流出接口;FORWARD,OUTPUT and POSTROUTING

              扩展匹配条件

                     隐式扩展::不用-m选项指出matchname即可使用此match的专用选项进行匹配

                            -p tcp:隐含了-mtcp;

                                   [!]--urce=port,--sport port[:port] :匹配报文中传输层的源端口;

                                   [!]--stination-port,--dport port[:port]: 匹配报文中传输蹭的目标端口;

                                   [!]--tcp-flags mask comp

                                          SYN,ACK,FIN,RST,URG,PSH;

                                          mask:要检查的标志位列表,以逗号分隔;

comp:必须为1的标志位,余下的出现在mask列表中的标志位则必须为0;

                                                       

                                          --tcp-flags  SYN,ACK,FIN,RST  SYN

                                   [!] --syn

                                          相当于--tcp-flags  SYN,ACK,FIN,RST  SYN

                                   -p udp:隐含了-mudp:

                                          [!]--source-port,--sport port[:port]:匹配报文中传输层的源端口;

[!]--destination-port,--dport port[:port]:匹配报文中传输层的目标端口;

                                   -p icmp:隐含了-micmp:

                                          [!]--icmp-type {type[/code]|typename}

                                          8:echo-request

                                          0:echo-reply

                     显示扩展:必须使用-m选项指出matchname,有的match可能存在专用的选项;

                            获取帮助:

                                   Centos 7: maniptables-extensions

                                   Centos 6:man iptables

                            Multiport扩展

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

                                   [!] –source-ports,--sportspotr[,port|,port:port]… :指定多个源端口
                                   [!]—destination-ports,dportsport[,port|,port:port]…:指定多个目标端口

                                   [!]—ports port[,port|,port:port]...:指定多个端口;

                            Iprange扩展

                                   以连续的ip地址范围指明连续的多地址匹配条件;

                                   [!]--src-range from[-to]:源IP地址;

                                   !]--dst-range from[-to]:目标IP地址;

                            string扩展

                                   对报文中的应用层数据做字符串匹配检测;

                                          [!]--string pattern:要检测字符串模式;

                                          [!]--hex-string pattern:要检测的字符串模式,16进制编码;

                                          --algo{bm|kmp}

                            Time扩展

                                   根据报文到达的时间与指定的时间范围进行匹配度检测;

                                   --datestartYYYY[-MM[-DD[Thh[:mm[:ss]]]]]:起始日期时间;

                                   --datestopYYYY[-MM[-DD[Thh[:mm[:ss]]]]]:结束日期时间;

                                   --timestarthh:mm[:ss]

                                   -timestop hh:mm[:ss]

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

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

~]# iptables -I INPUT-d 172.16.100.67 -p tcp --dport 23 -m time --timestart 09:00:00 --timestop18:00:00 --weekdays Tue,Thu,Sat -j ACCEPT

                            connlimit扩展

                                   根据每客户端IP做并发连接数匹配;

                                   --connlimit-upton:连接数数量小于等于n,此时应该允许;

                                   --connlimit-aboven:连接数数量大于n,此时应该拒绝;

~]# iptables -A INPUT-d 172.16.100.67 -p tcp --dport 23 -m connlimit --connlimit-upto 2 -j ACCEPT

                            limit扩展

                                   基于收发报文的速率进行匹配;

                                   --limitrate[/second|/minute|/hour|/day]:平均速率

                                   --limit-burstnumber:峰值速率

                            state扩展

                                   状态检测;连接追踪机制(conntrack);

                                   INVALID:无法识别的状态;

                                   ESTABLISHED:已建立的连接;

                                   NEW:新连接;

                                   RELATED:相关联的连接;

                                   UNTRACKED:未追踪的连接;

                                   nf_conntrack内核模块;

                                          踪到的连接:/proc/net/nf_conntrack文件中;

                                          能追踪的最大连接数量定义在:/proc/sys/net/nf_conntrack_max

                                                 此值可自行定义,建议必要时调整到足够大;

                                          不同的协议的连接追踪的时长:

                                                 /proc/sys/net/netfilter/

                                                              

                                          [!]--state STATE

                            处理动作(目标)

                                   j targetname [per-target-options]

                                          rgetname

                                          ACCEPT:接受

                                          ROP:丢弃;

                                          EJECT:拒绝;

  1. 3.    保存和重载规则:

ptables-save > /PATH/TO/SOME_RULE_FILE

iptables-restore< /PATH/FROM/SOME_RULE_FILE

        CentOS 6

                    保存规则:

                            service iptablessave

                                   自动保存规则至/etc/sysconfig/iptables文件中;

                    重载规则:

                            server iptables restore

                                   从/etc/sysconfig/iptables文件中重载规则;

4.   规则优化:

              (1) 可安全放行所有入站及出站,且状态为ESTABLISHED的连接;

              (2) 服务于同一类功能的规则,匹配条件严格的放前面,宽松放后面;

              (3) 服务于不同类功能的规则,匹配报文可能性较大扩前面,较小放后面;

              (4) 设置默认策略;

                     (a) 最后一条规则设定;

                     (b) 默认策略设定;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章