时间:2018.2.5
作者:李强
参考:man,info,magedu讲义,万能的internet
实验环境:VMware® Workstation 12 Pro ,Centos 6.9,Centos 7.4,SecureCRT Version 8.1.4
声明:以下英文纯属个人翻译,英文B级,欢迎纠正,以下内容纯属个人理解,并没有对错,只是参考,盗版不纠,才能有限,希望不误人子弟为好。
版本:v1-2018.2.5

为内核级功能,由Netfilter组件提供,需要安装iptables软件包去通过命令去配置此功能。

1、参考资料

官方站点:[http://www.netfilter.org]

2、工作原理

  • 首先我们要晓得,报文的三个流向

    1、流入本机:PRETOUTING----INPUT----用户进程空间

    2、流出本机:用户进程空间----OUTPUT----POSTROUTING

    3、转发:PREROUTING----FORWARD----POSTROUTING

  • 内核中数据包的传输过程

    1、当一个数据包进入网卡时,会进入PRETOURING链中,内核通过数据包的目的ip地址结合路由表判断数据是否需要转送出去

    2、如果数据包是进入本机的,就会进入INPUT链,然后响应的进程处理这些数据包,生成新的数据包,发送到OUTPUT链中,然后通过POSTROUTING链发送出去

    3、如果数据包是要转发的,并且内核允许转发,数据包就会进过FORWARD链,然后从POSTROUTING链转发出去。

五个位置:input,output,forward,prerouting,postroutig

netfilter对外提供五个hook function 对应上面五个位置,iptables通过在5个位置进行规则的设置来控制网络报文的转发

netfilter前端管理工具
    cui:iptables,firewall-cmd
    gui:firewall-config

ip数据包处理的规则集rules,分组在chain上,然后存放于过滤表table中,chain默认有5类,table默认有4种。

用户也可以将类似的规则rule分组成自定义的chain中,然后存放于table中。

总之防火墙的功能,就是数据报文来了,kernel发现开启了防火墙的功能,然后根据防火墙设置的匹配条件,对数据包进行相应的处理。

以上解释过于无聊,所以换种说法,就是一个土财主皇帝有钱,但是呢又怕死,所以请了王牌保镖保护他,他找来侍卫长也就是说netfilter,告诉他我的安全靠你了,结果netfilter不管事,就找了个iptables的外包公司,iptables公司就勘查现场,派了驻守5个位置的若干保镖chain过去,分别实现不同的功能(raw没有找到好的比喻,发入场券的mangle,搜身的filter,引路的nat)分别驻守大门,负责对进出人员车辆进行检查,驻守院子,对过往人员进行处理,驻守卧室的门,对进出与雇主交流的人进行检查。好人员已到位,部署已到位具体怎么检查就是iptables公司的一套了,告知netfilter大总管,netfilter说管,然后去告诉5个保镖怎么检查,至于要怎么检查,肯定就是root大老板来说了,root找netfilter,netfilter说我也不懂,你要不告诉iptables,然后root告诉iptables需要实现什么需求,然后iptables就把规则写出来告诉netfilter,你去这么搞,netfilter说好的。然后5个位置的若干保镖就开始干活,当然位置如果不够再加就是自定义的chain了,当时root不知道的事,权利都给了iptables和netfilter,如果iptables和netfilter串通瞎搞就会把自己给搞死了,所以说秦桧,严嵩,魏忠贤之流是不得不防的。瞎扯到这里。

  • 防火墙的定义与分类

    1、什么是防火墙?

    工作与主机或者网络边缘,对进出的报文通过实现定义的规则进行检查,并且有匹配的规则的工作进行处理的一组硬件或者软件,甚至是二者结合

    2、防火墙的分类

    主机防火墙、网络防火墙;
    硬件防火墙、软件防火墙;
    网络层防火墙、应用层防火墙

    3、安全防护设备

    硬件的应用层防火墙中可以集成AV和IPS组件。
    
    honeypot 蜜罐
    
    漏扫设备
    
    堡垒机

3、iptables命令行管理工具

iptables工作原理

命令行工具,工作在用户空间,编写规则,然后将写好的的规则发给netfilter,告诉内核如何处理数据报文

iptables有四个表,五个链和一些规则组成

四个表 table

    filter:数据过滤规则表
    nat:网络地址转换规则表
    mangle:修改数据标记位规则表
    raw:关闭nat表上启用的连接跟踪机制,加快封包穿越防火墙的速度

    优先级高低顺序为raw-->mangle-->nat-->filter

五个内置链chain

    INPUT
    OUTPUT
    FORWORD
    PREROUTING
    POSTROUTING

    每种表里有哪些一系列的规则,可以通过iptable -t table -vnL  来查看,不同table中的chain name一样但是内容不一样。是相互独立的。

    每种表都表示iptables的一种功能特性

        1、filter表对应处理的位置是input,output和forward,所以filter表中只有3中内置的INPUT,OUTPUT和FORWARD系列的规则集。

        2、nat表对应处理的位置是prerouting和postrouting和input和output,
        所以nat table中只有4种内置的RREROUTING和POSTROUTING和INPUT和OUTPUT系列的规则集。RREROUTING主要用来做DNAT,POSTROUTING做SNAT

        3、mangle表对应处理的位置可以是5个位置的任意位置上。

        4、raw

规则(rule-specification)

        匹配条件(matches)
            基本匹配:IP,端口,TCP的Flags(SYN,ACK,FIN,RST,USG,PSH)
            扩展匹配:时间,状态等,需要额外的动态库支持,所以使用扩展匹配要确保相对应的so文件存在。
        处理动作(target)
            内置动作:ACCEPT,DROP,REJECT,SNAT,DNAT,MASQUREADE,MARK,LOG
            自定义动作:自定义链chain

应用位置
            内置chain:input,output,forward,prerouting,postrouting
            自定义chain:

网络设备中设置过滤的步骤

        1、先定义域,默认域有local,management,input,output,dmz
        2、将接口加入到域中
        3、定义域到域的数据流方向
        4、定义规则
        5、应用规则到域到域的方向,行程域间策略和域内策略

iptables添加的要点

        1、要实现哪些功能,判断-t 在哪个table上
        2、报文流经的路径,判断对哪个chain操作
        3、报文的流向,判断源和目的
        4、匹配规则,业务需要

chain中规则的次序

        1、按照从上到下次序匹配,一旦匹配到不再向下匹配,因此匹配范围小的往上放
        2、匹配度最多的往上放,能合并的规则尽量放到一条规则里去
        3、所有都匹配不到后会去默认匹配规则

iptables命令使用方法

  • 格式
    iptables  -t table  command chain  rule-specificiton

    rule-specifiction= match  target 

    match = [-m] 

    target= -j targetname per-targetname-options

    table:主要有filter,nat,mangle,raw,security等
    chain:内置有INPUT,OUTPUT,FORWORD,PREROUTING,POSTROUTING
    targetname:
        ACCEPT
        DROP
        REJECT:--reject-with:icmp-port-unreachable默认
        RETURN:返回调用链
        REDIRECT:端口重定向
        LOG:记录日志,dmesg
        MARK:做防火墙标记
        DNAT:目标地址转换
        SNAT:源地址转换
        MASQUERADE:地址伪装
  • 选项
    针对chain的选项有:

    -A, --append chain rule-specification               //在后面追加新的规则
    -I,--insert chain [rulenum] rule-specification      //插入新的规则,默认插入到第一行,可以rulenum指定插入的次序,此处规则往后移
    -C, --check chain rule-specification                //检查规则是否已经存在,存在不提示,不存在报错误信息
    -D, --delete chain rule-specification               //删除1个或多个规则,2种格式,第一种指定规则删除,第二种指定序号删除
    -D, --delete chain rulenum
    -F, --flush [chain]                                 //清除选择链的所有规则,如果没有选择chain默认当前table的所有chain,
    -R, --replace chain rulenum rule-specification      //替换指定序号的规则
    -Z, --zero [chain [rulenum]]                        //清除所有指定chain或者chain的rulenum的字节和包的统计数量,如果没有指定,则所有chain都归零
    -S, --list-rules [chain]                            //
    -L, --list [chain]                                  //列出指定chain的规则,没有执行择表示tables的所有chain,通常配合-vnL使用,n一定是在L前的。
        -v, --verbose                                   //详细信息,-vv,或者-vvv更详细
        -n, --numeric                                   //数字格式输出,默认情况下会去将ip地址或者端口等解析成相映的hostname,protocols,service等
        -x, --exact                                     //显示精确的统计值
        --line-numbers                                  //显示规则时为每个chain中的rule编号
    -N, --new-chain chain                               //创建一个用户自定义的chain
    -X, --delete-chain [chain]                          //删除用户自定义的空chain,如果没有指定,则删除所有自定义的空chain,如果非空,先用-F清空规则,然后再使用-X
    -E, --rename-chain old-chain new-chain              //修改用户自定义的chain名称
    -P, --policy chain target                           //设置默认的target对于指定的chain,默认为ACCEPT

    --modprobe=command                                  

    针对匹配条件的有:

    基本匹配条件:
    [!] -p, --protocol protocol

        -p tcp 

            --dport  port[:port]    :匹配一个或多个连续的目的端口

            --sport  port[:port]    :匹配一个或多个连续的源端口

            --tcp-flags mask comp   :(Flags: SYN ACK FIN RST URG PSH ALL NONE)
                mask:表示去匹配哪些标志位Flags,多个用逗号隔开
                comp:表示哪些标志位Flags为1,多个用逗号隔开

            --syn: 等价于--tcp-flags SYN,RST,ACK,FIN SYN

        -p udp

            --dport port[:port]

            --sport port[:port]

        -p icmp

            --icmp-type type[/code]|typename 

        iptables -p icmp -h  //可以获取icmp的帮助
        iptables -p tcp  -h  //可以获取tcp的帮助
        iptables -p udp  -h  //可以获取udp的帮助

    [!] -s, --source address[/mask][,...]       //指定检查源ip地址

    [!] -d, --destination address[/mask][,...]  //指定检查目的ip地址

    [!] -i, --in-interface name                 //指定检查入接口地址

    [!] -o, --out-interface name                //指定检查出接口地址

    扩展匹配条件:
     -m, --match match
     Centos6下man iptables
     Centos7下man iptables-extensions
    常用有
     -m multiport   //指定多个不连续地址,最多15个,port:port地址范围算2个

         [!] --source-ports,--sports port[,port|,port:port]...

         [!] --destination-ports,--dports port[,port|,port:port]...

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

     -m iprange                 //指定地址范围

         [!] --src-range from[-to]

         [!] --dst-range from[-to]

     -m mac
     -m string  //对报文中的应用层数据做字符串模式匹配检测,内核版本需要大于等于2.6.14.

         --algo {bm|kmp}        //指定字符串匹配检测算法

         --from offset          //开始偏移,默认为0

          --to offset           //结束偏移,不指定检查整个数据包

          [!] --string pattern  //检查匹配给的字符串模式

          [!] --hex-string pattern

       Examples:

              # The string pattern can be used for simple text characters.
              iptables -A INPUT -p tcp --dport 80 -m string --algo bm --string 'GET /index.html' -j LOG

              # The hex string pattern can be used for non-printable characters, like |0D 0A| or |0D0A|.
              iptables -p udp --dport 53 -m string --algo bm --from 40 --to 57 --hex-string '|03|www|09|netfilter|03|org|00|'

     -m time    //根据将报文到达的时间与指定的时间范围进行匹配.所有时间默认为UTC格式,注意时间转换。

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

             如果--datestart和--datestop没有指定,默认从1979-01-01到2038-01-19,所以指定的日期有效范围也是如此

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

             时间范围为 00:00:00 到 23:59:59

             [!] --monthdays day[,day...]   //每个月的几号,值范围为1-31,2月可能为28或者29天

             [!] --weekdays day[,day...]    //星期几,值范围为1-7,或者用英文首字母2位或者3位

             --kerneltz:内核时区,不建议使用,CentOS7系统默认为UTC

             注意: centos6 不支持kerneltz ,--localtz指定本地时区(默认)

             示例:
             iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp --dport 80 -m time --timestart 14:30 --timestop18:30 --weekdays Sat,Sun --kerneltz -j DROP

     -m connlimit   //根据每客户端IP做并发连接数数量匹配,可防止CC(Challenge Collapsar挑战黑洞)***

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

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

         通常分别与默认的拒绝或允许策略配合使用
         示例:
         iptables -A INPUT -d 172.16.100.10 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT

     -m limit   //基于收发报文的速率做匹配

        令牌桶过滤器 
        --limit rate[/second|/minute|/hour|/day]
        --limit-burst number
        示例:
        iptables -I INPUT -d 172.16.100.10 -p icmp --icmp-type 8 -m limit --limit 3/minute --limit-burst 5 -j ACCEPT

     -m state   //根据”连接追踪机制“去检查连接的状态,较耗资源

         conntrack机制:追踪本机上的请求和响应之间的关系
         状态有如下几种:
        NEW:新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求
        ESTABLISHED:NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态
        RELATED:新发起的但与已有连接相关联的连接,如:ftp协议中的数据连接与命令连接之间的关系
        INVALID:无效的连接,如flag标记不正确
        UNTRACKED:未进行追踪的连接,如raw表中关闭追踪
        iptables命令
         [!] --state state
         示例:
        iptables -A INPUT -d 172.16.100.10 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT
        iptables -A OUTPUT -s 172.16.100.10 -p tcp -m multiport --sports 22,80 -m state --state ESTABLISHED -j ACCEPT
         已经追踪到的并记录下来的连接信息库
        /proc/net/nf_conntrack 
         调整连接追踪功能所能够容纳的最大连接数量
        /proc/sys/net/nf_conntrack_max
         不同的协议的连接追踪时长
        /proc/sys/net/netfilter/
         注意:CentOS7 需要加载模块: modprobe nf_conntrack

        iptables命令
         iptables的链接跟踪表最大容量为/proc/sys/net/nf_conntrack_max,各
        种状态的超时链接会从表中删除;当模板满载时,后续连接可能会超时
         解决方法两个:
        (1) 加大nf_conntrack_max 值
        vi /etc/sysctl.conf
        net.nf_conntrack_max = 393216
        net.netfilter.nf_conntrack_max = 393216
        (2) 降低 nf_conntrack timeout时间
        vi /etc/sysctl.conf
        net.netfilter.nf_conntrack_tcp_timeout_established = 300
        net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
        net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
        net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
        iptables -t nat -L -n

        iptables命令
         开放被动模式的ftp服务
         (1) 装载ftp连接追踪的专用模块:
        跟踪模块路径:/lib/modules/kernelversion/kernel/net/netfilter
        vim /etc/sysconfig/iptables-config 配置文件
        IPTABLES_MODULES=" nf_conntrack_ftp "
        modproble nf_conntrack_ftp
         (2) 放行请求报文:
        命令连接:NEW, ESTABLISHED
        数据连接:RELATED, ESTABLISHED
        iptables –I INPUT -d LocalIP -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
        iptables -A INPUT -d LocalIP -p tcp --dport 21 -m state --state NEW -j ACCEPT
         (3) 放行响应报文:
        iptables -I  OUTPUT -s LocalIP -p tcp -m state --state ESTABLISHED -j ACCEPT 

     -j, --jump target

iptables 规则的备份与恢复

因为iptables为命令行工具,通常命令行工具只在内存中生效,并不将配置写入磁盘。
因此要想要配置下次启动依然生效,因此需要将配置写入文件,当然这里不用手动去修改文件。
  • Centos6下
    iptables -S

    1、service iptables save  //将规则覆盖保存至/etc/sysconfig/iptables文件中

    2、iptables-save  > /path/to/backfile   

    //备份当前iptables规则到指定文件中,默认是stdout

    3、iptables-restore  < /path/to/backfile 

    //恢复备份的iptables规则到当前中,-n ,不覆盖当前规则

    4、因为我们可以通过备份的iptables规则文件,使用iptables-restore来进行还原,默认iptables是载入/etc/sysconfig/iptables中的规则,此时我们在/etc/rc.d/rc.local中,执行iptables-restore < /path/to/backfile会重新载入新的规则。

    5、或者通过计划任务crontab或者at来通过iptables-restore来恢复iptables规则。
  • Centos7下
    同6一样,但是因为7下iptables不再是服务了,所以iptables无法通过Centos6下的第一种方法,需要使用剩下的其他方法
table chain target
raw
mangle
nat PREROUTING,POSTTOURING DNAT,SNAT,MASQUERADE
filter INPUT,OUTPUT,FORWARD ACCPET,DROP,REJECT

实际应用场景:

有个问题就是没有添加备注的功能,换个人不知道你写的每条规则干嘛东东的,这就不好了。

  • 1、iptables

    filter
    nat

    自定义链chain的使用:

    
    
    例如:
     iptables -F
     iptables -N web 创建自定义链
     iptables -vnL
     iptables -A web -s 10.0.1.0/24 -p tcp --dport 80 -j ACCEPT 添加web链规则,允许本地主机访问web服务;
     iptables -I web 1 -m string --algo kmp --string "old" -j REJECT 插入第1条web链,包含了old字符串的页面禁止访问;
    只要状态是ESTABLISHED应放行;
     iptables -I web 2 -p tcp -m state --state ESTABLISHED -j ACCEPT 插入web链第2条,放行状态是ESTABLISHED;
    此时,内网用户访问web服务:不能访问
    curl httpd://172.18.11.111
    是不能访问的,因为自定义链不会直接生效的,只有被调用才生效;
    iptables -A FORWARD -p tcp -j web 在forward链上调用web自定义链;
    此时,内网用户就能访问web服务了;

实现网络防火墙:

实验环境:3台主机,1台模拟路由器,1台模拟客户端,1台模拟服务器

1、上网时间控制:1,3,5的9:00-12:00 14:00-18:00 不允许上网
2、访问网站控制:iqiyi,youku,tudou,不允许访问
3、特地主机控制:172.18.0.100-101
4、路由器只开启特定服务:http,https,ssh ,dns
5、SNAT

首先防火墙策略部署在路由器上,然后需要使用表nat

echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf
sysctl -p

假设eth1连接内网,eth0连接外网

iptables -t nat -A REROUTING -i eth1 -m iprange --src-range=172.18.0.100-101 -j MASQUERADE
iptables -t nat -A REROUTING -i eth1 -m time  --timestart=01:00 --timestop=04:00 --weekday=1,3,5 -j REJECT
iptables -t nat -A REROUTING -i eth1 -m time  --timestart=06:00 --timestop=10:00 --weekday=1,3,5 -j REJECT
iptables -t nat -A REROUTING -i eth1 -m string --algo bm --string 'iqiyi|youku|tudou' -j REJECT
iptables -t nat -A POSTROUTING -o eth0 -s 172.18.0.0/16  -j MASQUERADE
iptables -t nat -A POSTROUTING -j REJECT 

- 2、firewalld

 暂时先这样子