前言:

    对于一个Linux运维来说,如果不熟悉iptables配置,这时咱们来脑补一下,然后服务器不在你身边,刚好你设置了 "iptables -P INPUT DROP",然后就悲剧了,SSH连接不上了。这还不是最关键的,线上服务器分分钟上万,这个锅你来背。所以说,掌握iptables对我们运维来说,至关重要。


1.基本概念

    (1).iptables只是Linux防火墙的管理工具而已,位于/sbin/iptables。真正实现防火墙功能的是netfilter,它是Linux内核中实现包过滤的内部结构。
    (2). 防火墙是对于进出本主机或本网络的报文根据事先定义的检查规则作匹配检测,对于能够被规则匹配到的报文作出相应处理的组件。
    (3). iptables包含4表5链。其中表是按照对数据包的操作区分的,链是按照不同的Hook点来区分的,表和链实际上是netfilter的两个维度。


2.关于4表5链

    2.1 iptables 的链

        规则链的作用在于对数据包进行过滤或处理,根据处理时机的不同,各种规则被组织在不同的“链”中,规则链是防火墙规则/策略的集合。

        内置链:对应于hook function,分为以下5个

            PREROUTING    路由前

            INPUT       输入队列

            FORWARD      转发队列

            OUTPUT       输出队列

            POSTROUTING   路由后

        自定义链接:用于内置链的扩展和补充,可实现更灵活的规则管理机制;设置的时候需要自己手动添加关联关系。


    2.2 iptables 的表

        规则具有某一类相似用途的防火墙规则,按照不同处理时机区分到不同的规则链以后,被归置到不同的“表”中规则表是规则链的集合。

        默认表:相对应于不同的功能,分为以下4个

            filter:  用于过滤,防火墙主要功能;

            nat:    用于网络地址转换

            mangle:  用于拆解报文,按需修改,并重新封装起来;

            raw:    用于关闭nat表上启用的连接追踪机制;


    2.3 表和链的对应关系

wKiom1ciC1WxKCGRAACmL9Liy6I885.png

    

    2.4 匹配规则

wKiom1ciC6KRNrYCAAFHseeezuQ075.png


            

3. iptables命令

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

    -t table:指定表  默认为filter表,可设置的表:raw/mangle/nat/[filter]

       

    COMMAND:

        链管理:

            -N:new, 自定义一条新的规则链

            -X: delete,删除自定义的规则链

            -E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除

            -P:Policy,设置默认策略;对filter表中的链而言,其默认策略有:

                ACCEPT:接受

                DROP:丢弃

                REJECT:拒绝

        规则管理:

            -A:append,追加

            -I:insert, 插入,要指明位置,省略时表示第一条

            -D:delete,删除

            -R:replace,替换指定链上的指定规则

            -F:flush,清空指定的规则链

            -Z:zero,置零;

            -S:显示指定链上的所有规则 (主要用于保存规则的)

        查看:

            -L:list, 列出指定链上的所有规则;

            -n:numberic,以数字格式显示地址和端口号;

            -v:verbose,详细信息;

            -vv, -vvv 更详细的信息

            -x:exactly,显示计数器结果的精确值;而非单位换算后的结果 

            --line-numbers:显示规则的序号


    3.1 基本匹配条件

        无需加载任何模块,由iptables/netfilter自行提供

        [!] -s address[/mask][,...]:源IP地址是否符合此处指定的地址或范围

        [!] -d address[/mask][,...]:目标IP地址是否符合此处指定的地址或范围

        [!] -p protocol 限制协议(tcp/udp/icmp)

        [!] -i name:数据报文流入的接口;应用于数据报文流入的环节

        [!] -o name:数据报文流出的接口;应用于数据报文流出的环节


    3.2 隐式扩展

        不需要手动加载的扩展模块,它们是对协议的扩展,但凡使用-p指明了协议,就表示已经指明了要扩展的模块;

        tcp:隐含了指明“-m tcp”

            [!] --sport port[:port]:匹配报文的源端口;也可以是端口范围;

            [!] --dport port[:port]:匹配报文的目标端口;可以是端口范围;

            [!] --tcp-flags  mask  comp 检查包文件mask指明的tcp标志位,而要这些标志位comp中必须为1

            例如:“--tcp-flags  SYN,ACK,FIN,RST  SYN”表示,要检查的标志位为SYN,ACK,FIN,RST四个,其中SYN必须为1,余下的必须为0;

            [!] --syn:用于匹配第一次握手,相当于”--tcp-flags  SYN,ACK,FIN,RST  SYN“;

        udp:隐含了指明“-m udp” 

            [!] --sport port[:port]:匹配报文的源端口;可以是端口范围;

            [!] --dport port[:port]:匹配报文的目标端口;可以是端口范围;

        icmp:隐含了指明“-m icmp”

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

                0/0 : echo-reply  ping应答

                8/0 : echo-request  ping请求 


4. 显式扩展

    必须显式地指明使用的扩展模块进行的扩展。-m 选项指出


    4.1 multiport扩展

        以离散方式定义多端口匹配;最多指定15个端口;

        [!] --sports port[,port|,port:port]...:指定多个源端口;

        [!] --dports port[,port|,port:port]...:指定多个目标端口;

        [!] --ports port[,port|,port:port]...:指明多个端口;


    4.2 iprange扩展

        指明连续的(但一般不包含整个网络)ip地址范围;

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

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


    4.3 string扩展

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

        --algo {bm|kmp}:字符串匹配检测算法;

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

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


    4.4 time扩展

        根据将报文到达的时间/日期与指定的时间/日期范围进行匹配;

        --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 起始日期时间

        --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 结束日期时间

        --timestart hh:mm[:ss] 每天起始时间

        --timestop hh:mm[:ss] 每天结束时间

        [!] --monthdays day[,day...] 匹配一个月的哪些天  

        [!] --weekdays day[,day...]  匹配一周中的哪些天


    4.5 connlimit扩展

        根据每个客户端主机做并发连接数数量匹配;

        --connlimit-upto n:连接的数量小于等于n时匹配;

        --connlimit-above n:连接的数量大于n时匹配;


    4.6 limit扩展

        基于令牌桶算法对报文的速率做匹配;

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

        --limit-burst number   突发速率


    4.7 state扩展

        根据连接追踪机制去检查连接的状态;

        conntrack(连接追踪)机制:追踪本机上的请求和响应之间的关系;状态有如下几种:

        NEW:新发出请求;连接追踪模板中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求;

        ESTABLISHED:NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信状态;

        RELATED:相关联的连接;如ftp协议中的数据连接与命令连接之间的关系;

        INVALID:无法识别的连接;

        UNTRACKED:未进行追踪的连接;


5. 处理动作


    5.1 LOG

        用于记录iptables日志(记录于/var/log/massages日志中)

        --log-level level   日志级别(默认为4)

            emerg, alert, crit, error, warning, notice, info or debug

        --log-prefix prefix  日志前缀

    

    5.2 SNAT

        源地址转换,修改IP报文中的源IP地址

        用在nat表中, POSTROUTING链和INPUT链上

        --to-source [ipaddr[-ipaddr]][:port[-port]]


    5.3 DNAT

        目标地址转换,修改IP报文中的目标IP地址

        应用在nat表中,PREROUTING链和OUTPUT链上

        --to-destination [ipaddr[-ipaddr]][:port[-port]]


6. 使用示例


    1.设置filter中INPUT和OUTPUT链默认策略为DROP

[root@ch7 ~]# iptables -P INPUT DROP
[root@ch7 ~]# iptables -P OUTPUT DROP


    2.允许本机访问外网的web服务器

[root@ch7 ~]# iptables -A INPUT -s 172.18.0.0/16 -p tcp --dport 80 -j ACCEPT
[root@ch7 ~]# iptables -A OUTPUT -d 172.18.0.0/16 -p tcp --sport 80 -j ACCEPT


    3.允许本机ping别的主机;但不开放别的主机ping本机

假设默认策略全为DROP
[root@ch7 ~]# iptables -A INPUT -p icmp --icmp-type 0  -j ACCEPT
[root@ch7 ~]# iptables -A OUTPUT -p icmp --icmp-type 8  -j ACCEPT


    4.拒绝TCP标志位全部为1及全部为0的报文访问本机

[root@ch7 ~]# iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
[root@ch7 ~]# iptables -A INPUT -p tcp --tcp-flags ALL SYN,FIN,ACK,RST -j DROP

    

    5.限制本地主机的web服务器在周一不允许访问;新请求的速率不能超过100个每秒;web服务器包含了admin字符串的页面不允许访问;web服务器仅允许响应报文离开本机

默认策略为DROP

[root@ch7 ~]# iptables -A INPUT -p tcp --dport 80 -m time ! --weekdays 1  -m limit --limit 100/second -m state --state NEW -j ACCEPT
[root@ch7 ~]# iptables -A INPUT -p tcp --dport 80 -m state --state ESTABLISHED -j ACCEPT
[root@ch7 ~]# iptables -A OUTPUT -p tcp --sport 80 -m string --algo bm !--string admin -m state --state ESTABLISHED,RELATED -j ACCEPT


    6.在工作时间,周一到周五的8:30-18:00,开放本机的ftp服务给172.18.0.0网络中的主机访问;数据下载请求的次数每分钟不得超过5个

默认策略为DROP
[root@ch7 ~]# iptables -A INPUT -s 172.18.0.0/16 -p tcp --dport 21 -m time --weekdays 1,2,3,4,5 --timestart 8:30 --timestop 18:00 -m connlimit --connlimit-upto 5 -m state --state NEW,ESTABLISHED -j ACCEPT
[root@ch7 ~]# iptables -A OUTPUT -d 172.18.0.0/16 -m state --state ESTABLISHED,RELATED -j ACCEPT


    7.在防火墙上做SNAT,让内网客户机能上外网

[root@ch7 ~]# iptables -t nat -A POSTROUTING -s 172.18.0.0/16 -j SNAT --to-source 10.10.0.1

    8.在防火墙上做DNAT,让外网客户机能访问内网服务器

[root@ch7 ~]# iptables -t nat -A PREROUTING -d 10.10.0.1 -j DNAT --to-destination 172.18.10.10


后语:

    以上只是讲解了iptables的一小部分内容,常见的用法的总结。如果你想更深入的了解iptables,咱们可以一起探讨相关问题。