规则文件(配置文件):/etc/sysconfig/iptables

    保存启用中的规则于配置文件中:

            1、#iptables -save > /etc/sysconfig/iptables

            2、#service iptables save

生效规则文件(配置文件)中的规则

            1、#iptables-restore < /etc/sysconfig/iptables

            2、#service iptables restart

                        执行的操作,清空现有规则,读取并生效规则文件中的规则



基本语法格式:

    iptables [ -t TABLES ] COMMAND CHAIN CRETIRIA -j TARGET

                     表            规则            链         匹配条件       动作


    -t TABLES:

            nat,mangle,raw,filter


    COMMAND:(CHAIN)

            链:(链中的规则):

                -F:flush,清空规则连:

                -N:new,自建一条链

                -X:delete,删除一条自定义链

                -P:policy,设置默认策略,对filter表来讲,默认规则为ACCEPT或DROP:

                -E:重命名自定义链

                -A:链尾部增加一条规则  

                -D:删除一条规则            iptables [ -t table ] -D chain rulenum

                -R:替换一条规则            iptables [ -t table ] -R chain rulenum rule-specification

                -I:插入一条规则              iptables [ -t table ] -I chain rulenum rule-specification


            查询:

                -L:list


                        -n:数字格式显示主机地址和端口

                        -v:详细格式,-vv,-vvv

                        --line-number:显示规则编号

                        -x:exactly,精确显示数值


  pkts     bytes    target   prot      opt       in             out                   source             destination

  包数    字节数    目标       协议                流入借口     流出借口               原地址            目标地址





        CRETIRIA(匹配条件):

                匹配条件:

                        通用匹配:

                                -s  地址:指定报文源IP地址匹配的范围:(可以是IP也可以是网络地址:可以使用!取反)

                                        --src,   --source  

                                 -d  地址:指定报文目标IP地址匹配的范围:

                                        --dis,--destination

                                -p  协议:指定匹配报文的协议类型,一般有三种tcp,udp和icmp

                                -i    interface:数据报文流入的接口:入方向(prerouter,input,forward)

                                -o   interface:数据报文流出的接口:出方向(output,forward,postrouter)


                        扩展匹配:调用netfilter额外模块实现特殊检查机制,(使用到相关功能,要使用iptables命令 -m

                                                                                                                来调用相关模块)

                                隐式扩展:当使用 -p {tcp|udp|icmp}中的一种时,可以直接使用扩展专用选项

                                            -p tcp [ -m tcp ]

                                                    --sport PORT[-PORT]

                                                    --dport

                                                    --tcp-flag 要检查标志位列表(用逗号分隔) 必须为1的标志位列表(逗号分隔)

                                                                    例如:  --tcp-flags syn,ack,rst,fin syn   

                                                                                     检查 syn,ack,rst,fin 标志位,syn必须为1。其他为0

                                                                                  --syn




                                                                                        all 为所有位,none 为没有

                                                                                        iptables -I INPUT -p -tcp --tcp-flags all all -j drop      (标志位全1 drop)

                                                                                        iptables -I INPUT -p -tcp --tcp-flags all none -j drop  (标志位全0 drop)

                                            -p udp [ -m udp ]

                                                    --sport

                                                    --dport




                                显示扩展:必须明确说明使用那个模块进行扩展

                                        -m 扩展模块名称


                                            模块:iptables,netfilter各拥有一部分代码,必须都拥有对应模块,才能使用。


                                            multiport:多端口匹配

                                                        可用于匹配非连续或连续端口


                                                        专用选项:

                                                            --source-ports,--sports port[,port,port:port]

                                                            --destination-ports,--dports                

                                                            --ports


                                            iprange:匹配指定范围内的地址:

                                                        匹配一段连续的地址而非整个网络时有用

    

                                                        专用选项: !取反

                                                            [!]--src-ragne IP [IP]

                                                            --dst-range


                                           string:字符串匹配。能够检查报文应用层中的字符串。

                                                        字符匹配检查高效算法

                                                                kmp,bm

                                                        专用选项:

                                                            --algo {kmp|bm}

                                                            --string "STRING"   检查(匹配)字串

                                                            --htx-string "HEX_STRING: HEX_STRING为编码为16进制的字串 

                                            time:基于时间做访问控制


                                                            专用选项:

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

                                                                --datestop

                                                                

                                                                --timestart hh:mm[:ss]

                                                                --timestop hh:mm[:ss]


                                                                --weekdays day[,day]

                                                                                    mon,tue


                                            connlimit:连接数限制,对每个IP所能够发起并发连接数做限制:


                                                                专用选项:

                                                                            [!]--connlimit-above [n]  :连接数限定  !可取反


                                            limit:速率限制


                                                                专用选项:

                                                                            --limit n[/second|/minute/hour/day]

                                                                            --limit-burst n

                                            state:状态检查。(内核中划一段空间存储条目,来识别报文是否来访问过)

                                                                            (并发大的不建议开启此功能,会导致条目空间满载从而拒绝访问)

                                                        

                                                        专用选项:--state [new| ESTABLISHED|RELATED| INVALID}


                                                        链接追踪中的状态:

                                                                NEW:新建立一个回话

                                                                ESTABLISHED:已建立的连接

                                                                RELATED:有关联关系的连接

                                                                INVALID:无法识别的连接


                                                        调整链接追踪功能所能容纳的连接的最大数目

                                                                /proc/sys/net/nf_conntrack_max

                                                        当前追踪的所有链接

                                                               /proc/net/nf_conntrack

                                                        不通协议或链接类型追踪时的属性:

                                                               /proc/sys/net/netfilter/     (都在此目录下)


                                                        放行被动模式下的FTP

                                                                1、装载模块(/lib/modules/KERNEL_VERSION/kernel/net/netfilter/)

                                                                                模块:nf_conntrack_ftp

                                                                2、放行请求报文

                                                                        (1)放行new状态对21端口请求的报文

                                                                        (2)放行ESTABLISHED以及RALATED状态的报文

                                                                3、放行响应报文

                                                                        (1)放行ESTABLISHED以及RALATED状态的报文

                                                                

 -j TARGET

                ACCEPT:允许通

                DROP:拒绝通过

                REJEDT:拒绝通过,并给予回应



自定义链


自定义链使用方法:

        建立一个定义链,在主链中使用一条匹配规则跳转到自定义链,自定义链开始生效,按顺序匹配自定义链,如果自定义链中有RETURN就会返回主链继续匹配下去。



创建自定义链:

        iptables [-t table ] -N chain


删除自定义链(零引用):

        iptables [ -t table ] -X chain


重命名自定义链(零引用):

        iptables  [-t table ] -E old_name new_name        

       

主链指向自定义链: 

        iptables [ -t TABLES ] COMMAND CHAIN CRETIRIA -j TARGET

                                                                                    -j chain(自定义链)  

                                                                                    TARGET填写自定义链名

自定义链返回主链: -j RETURN

        iptables [ -t TABLES ] COMMAND CHAIN CRETIRIA -j TARGET


        列子:iptables -A httpd_in -j RETURN

                        自定义链中插入规则  -j RETURN,返回主链,继续匹配

 




列子

优化规则:

1、尽量减少规则条目

2、访问量大的规则尽量放前面

3、统一服务的规则,规格更加严格的放在前面,尽早剔除。 


列子:


1、设定默认规则

iptables -t filter -P INPUT DROP


1、通过ssh的tcp三次握手的第一次

iptables -I INPUT 3 -d xx.xx.xx.xx -p tcp --dport 22 --tcp-flags sys, ack,rst,fin sync -j ACCEPT


2、允许本机器dns解析 172.16.100.7


iptables -A OUTPUT -s 172.16.100.7 -p udp --dport 53 -j ACCEPT

iptables -A INPUT -d 172.16.100.7 -p udp --sport 53 -j ACCEPT


3、本机可ping其他主机,不允许其他主机ping本机


iptables -A OUTPUT -s 172.16.100.7 -p icmp --icmp-type 8 -j ACCEPT

iptables -A INPUT -d 172.16.100.74 -p icmp --icmp-type 0  -j ACCEPT


4、写一条规则允许22,80端口访问

iptables -I INPUT -d 172.16.100.7 -p -tcp -m multiport --dports 22,80 -j ACCEPT

iptables -I OUPUT -s 172.16.100.7 -p tcp -m multiport --sports 22,80 -j ACCEPT



5、允许172.16.100.1-172.16.100.100 的地址访问本机23端口

iptables -A INPUT -d 172.16.100.7 -p tcp --dport 23 -m iprange --src-range 172.16.100.1-172.16.100.100 -j ACCEPT

iptables -A OUTPUT -s 172.16.100.7 -p tcp --sport23 -m iptange --dst-range 172.16.100.1-172.16.100.100 -j ACCEPT



6、禁止含有sex字符串流出。

iptables -I OUTPUT -m string -- algo kmp --string "sex" -j DROP



7、周一、二、四、五,上午8点20分到下午6点40拒绝访问web服务。

iptables -I INPUT -d 172.16.100.7 -p tcp --dport  80 -m time --timestart 08:20 --timestop 18:40 --weekdays Mon,Tue,Thu,Fri -j REJECT


8、本机的ssh服务,仅限制每个IP发起两个链接请求。

iptables -A INPUT -d 172.16.100.7 -p tcp --dport 22  -m connlimit --connlimit-ablove 2 -j DROP

        此规则匹配发现超过两个ssh链接后就拒绝,一般此规则后续规则里面放行ssh服务。

        

9、设置ping的速率

iptables -A INPUT -d 172.16.100.7 -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 5 -j ACCEPT

iptables -A OUTPUT -d 172.16.100.7 -p icmp --icmp-type 8  -j ACCEPT


10、通过22,80端口且状态为NEW或者ESTABLISHED。

iptables -I INPUT -d 172.16.100.7 -p tcp -m multiport --dport 22,80 -m state NEW,ESTABLISHED -j ACCEPT

iptables -I OUTPUT -m state --state ESTABLISHED -j ACCEPT

    结合下面这一条规则使用,可以极大的提升防火墙匹配性能。

    iptables -I INPUT -d 172.16.100.7  -m multiport  -m state ESTABLISHED -j ACCEPT (放在第一条)

    iptables -I OUTPUT -s 172.16.100.7  -m multiport  -m state ESTABLISHED -j ACCEPT


11、给FTP放行。

iptables -A INPUT -d 172.16.100.7 -p tcp -m state --state RELATED -j ACCEPT           

iptables -R OUTPUT 1 -s 172.16.100.7 -m state ESTABLISHED,RELATED -j ACCEPT  (output第一行)



12、自定义链