您的位置:新葡亰496net > 电脑系统 > 新葡亰496net:防火墙设置

新葡亰496net:防火墙设置

发布时间:2019-09-29 17:42编辑:电脑系统浏览(161)

    iptables简述

      iptables是Linux防火墙的管理工具,位于/sbin/iptables。真正实现防火墙功能的是netfilter,它是 Linux内核中实现包过滤的内部结构。

      iptables包含4个表,5个链,其中表是按照对数据包的操作区分的,链是按照不同的Hook点来区分的,表和链实际上是netfilter的两个维度。

      4个表:filter,nat,mangle,raw,默认表是filter(没有指定表的时候就是filter表)。表的处理优先级:raw>mangle>nat>filter。
        filter:一般的过滤功能,包含3个链,INPUT、FORWARD、OUTPUT,内核模块:iptables_filter
        nat:用于nat功能(端口映射,地址映射等),包含3个链,PREROUTING、POSTROUTING、OUTPUT,内核模块:iptable_nat
        mangle:修改数据包的服务类型、TTL、并且可以配置路由实现QOS,包含5个链,PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD,内核模块:iptable_mangle
        raw:设置raw时一般是为了不再让iptables做数据包的链接跟踪处理,提高性能,包含2个链,OUTPUT、PREROUTING,内核模块:iptable_raw

      5条链:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING。

        PREROUTING:数据包进入路由表之前
        INPUT:通过路由表后目的地为本机
        FORWARD:通过路由表后,目的地不为本机
        OUTPUT:由本机产生,向外转发
        POSTROUTIONG:发送到网卡接口之前

      5条链在内核空间的分布情况如下图:

                  新葡亰496net 1

      规则链之间的执行顺序(分3种情况):

      第1种情况:入站数据流向
        从外界到达防火墙的数据包,先被PREROUTING规则链处理(是否修改数据包地址等),之后会进行路由选择(判断该数据包应该发往何处),如果数据包的目标主机是防火墙本机(比如说Internet用户访问防火墙主机中的web服务器的数据包),那么内核将其传给INPUT链进行处理(决定是否允许通过等),通过以后再交给系统上层的应用程序(比如Apache服务器)进行响应。
      第2种情况:转发数据流向
        来自外界的数据包到达防火墙后,首先被PREROUTING规则链处理,然后进行路由选择,如果数据包的目标地址是其它外部地址(比如局域网用户通过网关访问QQ站点的数据包),则内核将其传递给FORWARD链进行处理(转发或拦截),然后再交给POSTROUTING规则链进行处理。
      第3种情况:出站数据流向
        防火墙本机向外部地址发送的数据包(比如在防火墙主机中测试公网DNS服务器时),首先被OUTPUT规则链处理,之后进行路由选择,然后传递给POSTROUTING规则链(是否修改数据包的地址等)进行处理。

      防火墙(FireWall):具有网络隔离功能, 工作在网络或主机边缘,对进出的网络或主机数据包基于一定的规则进行检查,并在匹配某规则时由规则定义的行为进行处理的一组功能组件 ,基本上的实现都是关闭所有的通过型访问,只开放允许访问的策略。  

    1、iptables基础知识

    • Netfilter组件
      防火墙功能是集成在内核中的,通过以下命令可以看出防火墙功能是以模块的方式打到内核当中的
    [root@centos7 boot]#cat ./boot/config-3.10.0-514.el7.x86_64 |grep -i iptables
    CONFIG_IP_NF_IPTABLES=m
    CONFIG_IP6_NF_IPTABLES=m
    # iptables trigger is under Netfilter config (LED target)
    

    内核中选取五个位置放了五个hook(勾子) function(INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING),而这五个hook function向用户开放,用户可以通过一个命令工具(iptables)向其写入规则,这五个钩子函数就像检查的关卡一样,对进出本机的的数据钩住后检查。

    新葡亰496net 2

    Paste_Image.png

    • 三种报文流向:
      流入本机:PREROUTING --> INPUT-->用户空间进程
      流出本机:用户空间进程-->OUTPUT--> POSTROUTING
      转发:PREROUTING --> FORWARD --> POSTROUTING
    • 防火墙工具
      iptables:命令行工具,工作在用户空间,用来编写规则,写好的规则被送往netfilter,告诉内核如何去处理信息包
      firewalld:CentOS 7引入了新的前端管理工具
    • iptables由四个表和五个链以及一些规则组成
      四个表table:filter、nat、mangle、raw
      filter表:过滤规则表,根据预定义的规则过滤符合条件的数据包
      nat表:network address translation 地址转换规则表
      mangle:修改数据标记位规则表
      Raw:关闭NAT表上启用的连接跟踪机制,加快封包穿越防火墙速度
      优先级由高到低的顺序为:raw-->mangle-->nat-->filter
      五个内置链chain:INPUT、OUTPUT、FORWARD、PREROUTING
      、POSTROUTING

    新葡亰496net 3

    Paste_Image.png

    可以通过如下命令查看各个表中的链

    iptables -t filter -vnL
    iptables -t nat -vnL
    

    新葡亰496net 4

    Paste_Image.png

    • IPTABLES和路由
      路由功能发生的时间点,报文进入本机后
      判断目标主机是否为本机
      是:INPUT
      否:FORWARD
      报文离开本机之前,判断由哪个接口送往下一跳,路由决策就是本机的路由表

    新葡亰496net 5

    Paste_Image.png

    • 内核中数据包的传输过程
      当一个数据包进入网卡时,数据包首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去
      如果数据包就是进入本机的,数据包就会沿着图向下移动,到达INPUT链。数据包到达INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包经过OUTPUT链,然后到达POSTROUTING链输出
      如果数据包是要转发出去的,且内核允许转发,数据包就会向右移动,经过FORWARD链,然后到达POSTROUTING链输出
    • iptables规则
      规则rule:根据规则的匹配条件尝试匹配报文,对匹配成功的报文根据规则定义的处理动作作出处理
      匹配条件:
      基本匹配:IP,端口,TCP的Flags(SYN,ACK等)
      扩展匹配:通过复杂高级功能匹配
      处理动作:称为target,跳转目标
      内建处理动作:ACCEPT,DROP,REJECT,SNAT,DNAT
      MASQUERADE,MARK,LOG...
      自定义处理动作:自定义chain,利用分类管理复杂情形
      规则要添加在内置链上才生效;添加在自定义上不会自动生效
      链chain:
      内置链:每个内置链对应于一个钩子函数
      自定义链:用于对内置链进行扩展或补充,可实现更灵活的规则组织管理机制;只有Hook钩子调用自定义链时,才生效
    • iptables添加要点
      iptables规则添加时考量点
      要实现哪种功能:判断添加在哪张表上
      报文流经的路径:判断添加在哪个链上
      报文的流向:判断源和目的
      匹配规则:业务需要
      链上规则的次序,即为检查的次序,因此隐含一定的法则
      同类规则(访问同一应用),匹配范围小的放上面,因为放在上面的会先生效,并且生效后就不会继续检查下面的规则了
      不同类规则(访问不同应用),匹配到报文频率较大的放上面
      将那些可由一条规则描述的多个规则合并为一个
      设置默认策略
    • 实验环境准备:
      要关闭系统默认的iptables策略,这样我们才能自己定制防火墙策略,并不是把防火墙服务关闭了,防火墙功能是集成在内核当中的,用户空间通过iptables软件工具编写规则发给内核的netfilter进行处理。
    Centos7: systemctl stop firewalld.service
    systemctl disable firewalld.service
    Centos6:service iptables stop
    chkconfig iptables off
    
    • 防火墙的概念
    • iptables的简介
    • iptables命令
    • 网络防火墙
    • NAT
    • firewalld服务

    一.防火墙概念

    iptables语法格式

      iptables [-t 表名] 命令选项[链名][条件匹配][-j 目标动作或跳转]

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

      命令选项 

        -t:指定表,不指定的话,默认为filter;
        -N:new, 自定义一条新的规则链;
        -X:delete,删除自定义的规则链,但仅能删除用户自定义的且引用计数为0的空的链;
        -P:Policy,设置默认策略,其默认策略有:ACCEPT、DROP、REJECT;
        -E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除;
        -A:append,追加新的规则到指定位置,没指明位置的话默认为最后一条;
        -I:insert, 插入,要指明位置,省略时表示第一条;
        -D:delete,删除规则,需指明规则序号或指明规则本身;
        -R:replace,替换指定链上的指定规则;
        -F:flush,清空指定的规则链;
        -Z:zero,置零,可指定规则置零;iptables的每条规则都有两个计数器:(1) 匹配到的报文的个数;(2) 匹配到的所有报文的大小之和
        -L:list, 列出指定链上的所有规则;
        -n:numberic,以数字格式显示地址和端口号;
        -v:verbose,详细信息,能看到每个规则匹配的数据大小和包数量,-vv, -vvv
        -x:exactly,显示计数器结果的精确值;
        --line-numbers:显示规则的序号

      目标动作或跳转

        ACCEPT:接受
        DROP:丢弃
        REJECT:拒绝
          ---reject-with type:可指定拒绝报文的类型,如 icmp-net-unreachable,icmp-host-unreachable,icmp-port-unreachable等。
        RETURN:返回调用链;
        REDIRECT:端口重定向;
          --to-ports port[-port]:将匹配的端口重定向为此处指定的端口;
        LOG:记录日志
          --log-level:可指定记录的日志等级;
          --log-prefix:指定记录的日志路径,默认路径为:/var/log/messages;
        MARK:做防火墙标记;
        DNAT:目的地址转换
          --to-destination [ipaddr[-ipaddr]][:port[-port]]:将目的地址转换成内网网段的指定ip和端口;
        SNAT:源地址转换
          --to-source [ipaddr[-ipaddr]]:将源地址转换成指定的IP;
        MASQUERADE:当要转换的出口地址为动态IP时,MASQUERADE可自行判断要转换为的地址;
        自定义链名:调用自定义链作为处理动作

      条件匹配

    基本匹配条件,基本匹配条件为内建条件,由iptables(netfilter)自行提供,无需加载任何模块。常见的基本匹配条件有:

      [!]-s, --source address[/mask][...]:检查报文中的源IP地址是否符合此处指定的地址或范围;
      [!]-d, --destination address[/mask][...]:检查报文中的目标IP地址是否符合此处指定的地址或范围;
      [!]-p, --protocol protocol:指定匹配的协议,常见协议包括:TCP、UDP、ICMP等;
      [!]-i,--in-interface name:数据报文流入的接口,只能应用于数据报文流入的环节,只能应用于PREROUTING,INPUT和FORWARD链;
      [!]-o, --out-interface name:数据报文流出的接口;只能应用于数据报文流出的环节,只能应用于FORWARD、OUTPUT和POSTROUTING链

    扩展匹配条件,需加载扩展模块方可生效,而扩展匹配条件又分为隐式扩展和显示扩展。

      隐式扩展不需要手动加载扩展模块,因为其是对协议的扩展,当使用-p选项指明了协议时,就表示已经指明了要扩展的模块。其常见条件包括:

        [!]--source-port, --sport port[:port]:匹配报文的源端口;可指定端口范围;
        [!]--destination-port,--dport port[:port]:匹配报文的目标端口;可指定端口范围;
        [!]--tcp-flags:指定tcp的标记,如:SYN,ACK,FIN,RST等;
        [!]--syn:用于匹配第一次握手,相当于”--tcp-flags SYN,ACK,FIN,RST SYN“;
        [!]--icmp-type {type[/code]|typename}:用于指定icmp协议的类型,如--icmp-type 8

      显示扩展则必须手动加载扩展模块,需使用 -m 选项指明要调用的扩展模块,其格式为 -m 扩展模块。常见的扩展模块如下:

      1、multiport:以离散或连续的方式定义多端口匹配条件,最多不超过15个端口;
        [!]--source-ports,--sports port[,port|,port:port]...:指定多个源端口;
        [!]--destination-ports,--dports port[,port|,port:port]...:指定多个目标端口;
        [!]--ports port[,port|,port:port]...:指明多个端口
      2、iprange:指明连续的IP地址范围
        [!] --src-range from[-to]:源IP地址;
        [!] --dst-range from[-to]:目标IP地址
      3、time:根据将报文送到的时间与指定的时间范围进行匹配;
        --kerneltz:用系统本地时区代替默认的UTC时区;
        --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、string:用于对报文中的应用层数据做字符串模式匹配检查;
        --algo {bm|kmp}:字符串匹配检测算法;
        [!]--string pattern:要检测的字符串模式;
        [!]--hex-string pattern:要检测的字符串模式,16进制格式
      5、connlimit:根据每个客户端的Ip做并发连接数数量匹配检查;
        --connlimit-upto n:连接的数量小于等于n时匹配;
        --connlimit-above n:连接的数量大于n时匹配
      6、limit:对收发报文的速率做条件匹配;
        --limit rate[/second|/minute|/hour|/day]:将匹配的报文限制速率为每second|/minute|/hour|/day发送rate次;
        --limit-burst number:限制当达到多个报文后,执行限制
      7、state:根据”连接追踪机制“去检查连接的状态;
        [!] --state state:state的类型包括如下:
          NEW:新发出请求;连接追踪模板中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求;
          ESTABLISHED:NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信状态;
          RELATED:相关联的连接;如ftp协议中的数据连接与命令连接之间的关系;
          INVALID:无效的连接;
          UNTRACKED:未进行追踪的连接

    更多相关帮助可使用命令 man iptables 和 man iptables-extensions 进行查看。

      防火墙的分类
        主机防火墙:服务范围为当前主机
        网络防火墙:服务范围为防火墙一侧的局域网

    2、iptables命令

    man 8 iptables
    规则格式:iptables[-t table] SUBCOMMAND chain [-m matchname[per-match-options]] -j targetname[per-target-options]
    -t table:
    raw, mangle, nat, [filter]默认

    • SUBCOMMAND:
      1、链管理:
      -N:new, 自定义一条新的规则链
      -X:delete,删除自定义的空的规则链,只有是空链才能被删除,删除之前要清空,iptables -F自定义链和所关联的默认链
      -P:Policy,设置默认策略;对filter表中的链而言,其默认策略有:
      ACCEPT:接受
      DROP:丢弃
      iptables -F是清不掉的,最好不要用这个,可以在链里设置规则
      -E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除
    iptables -P INPUT DROP
    iptables -P INPUT ACCEPT  ---设置默认策略
    

    2、查看:
    -L:list, 列出指定链上的所有规则,本选项须置后
    -n:numberic,以数字格式显示地址和端口号
    -v:verbose,详细信息
    -vv更详细
    -x:exactly,显示计数器结果的精确值,而非单位转换后的易读值,-x就是精确显示,以字节为单位,不加是以k为单位
    --line-numbers:显示规则的序号
    常用组合:
    --vnL
    --vvnxL--line-numbers
    -S selected,以iptables-save 命令格式显示链上规则,可以用此命令将命令的输出结果保存到文件中,将规则存到磁盘上

    [root@centos7 html]#iptables -vnL  ---查看规则
    Chain INPUT (policy ACCEPT 1151 packets, 127K bytes)
     pkts bytes target     prot opt in     out     source               destination         
        0     0 REJECT     all  --  *      *       172.18.21.106        0.0.0.0/0            reject-with icmp-port-unreachable
        0     0 ACCEPT     all  --  *      *       172.18.21.106        0.0.0.0/0           
    Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
     pkts bytes target     prot opt in     out     source               destination         
    Chain OUTPUT (policy ACCEPT 152 packets, 17928 bytes)
     pkts bytes target     prot opt in     out     source               destination         
    [root@centos7 html]#iptables --line-numbers -vnL   ---查看规则并显示编号
    Chain INPUT (policy ACCEPT 1296 packets, 141K bytes)
    num   pkts bytes target     prot opt in     out     source               destination         
    1        0     0 REJECT     all  --  *      *       172.18.21.106        0.0.0.0/0            reject-with icmp-port-unreachable
    2        0     0 ACCEPT     all  --  *      *       172.18.21.106        0.0.0.0/0           
    Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
    num   pkts bytes target     prot opt in     out     source               destination         
    Chain OUTPUT (policy ACCEPT 192 packets, 22320 bytes)
    num   pkts bytes target     prot opt in     out     source               destination     
    [root@centos7 html]#iptables --line-numbers -vnxL   ---以字节显示计数,而不是以默认的k
    Chain INPUT (policy ACCEPT 1432 packets, 157588 bytes)
    num      pkts      bytes target     prot opt in     out     source               destination         
    1           0        0 REJECT     all  --  *      *       172.18.21.106        0.0.0.0/0            reject-with icmp-port-unreachable
    2           0        0 ACCEPT     all  --  *      *       172.18.21.106        0.0.0.0/0           
    [root@centos7 html]#iptables -S 
    -P INPUT ACCEPT
    -P FORWARD ACCEPT
    -P OUTPUT ACCEPT
    -A INPUT -s 172.18.21.106/32 -j REJECT --reject-with icmp-port-unreachable
    -A INPUT -s 172.18.21.106/32 -j ACCEPT
    [root@centos7 html]#iptables -S >/app/f1  ---将规则保存到文件中
    

    3、规则管理:
    -A:append,追加
    -I:insert, 插入,要指明插入至的规则编号,默认为第一条
    -D:delete,删除
    (1) 指明规则序号
    (2) 指明规则本身
    -R:replace,替换指定链上的指定规则编号
    -F:flush,清空指定的规则链
    -Z:zero,置零
    iptables的每条规则都有两个计数器
    (1) 匹配到的报文的个数pkts
    (2) 匹配到的所有报文的大小之和bytes

    iptables -A INPUT -s 172.18.21.106 -j DROP
    iptables -A INPUT -s 172.18.21.106,172.18.21.108 -j REJECT  ---多条ip地址用逗号隔开
    iptables -R INPUT 2 -s 172.18.21.106 -j ACCEPT   ---替换第二条规则
    iptables -I INPUT 2 -s 192.168.74.0/24 -j REJECT   ---把这条规则插入到INPUT链的第二条
    iptables -D INPUT 1   ---删除INPUT链的第一条规则
    iptables -D INPUT -s 172.18.21.106 -j ACCEPT   ---删除链上的规则的第二种方式
    iptables -F  INPUT ---清空指定链的规则,不指定就是清空所有链
    iptables -A INPUT ! -s 172.18.21.106 -j ACCEPT ---表示除了来自172.18.21.106的都接受。这里需要注意的是要将默认权限设置为DROP,!表示取反的意思。用!就不能用多个ip地址之间用逗号隔开的格式。
    iptables -A INPUT ! -s 172.18.21.106 -j REJECT   ---表示除了172.18.21.106的都拒绝,此时默认权限要设置为接受
    
    • 匹配条件
      基本:通用的,PARAMETERS
      扩展:需加载模块,MATCH EXTENTIONS
      1、基本匹配条件:无需加载模块,由iptables/netfilter自行提供
      [!] -s, --source address[/mask][,...]:源IP地址或范围
      [!] -d, --destination address[/mask][,...]:目标IP地址或范围
      [!] -p, --protocol protocol:指定协议,可使用数字如0(all)
      protocol: tcp, udp, icmp, icmpv6,udplite,esp, ah, sctp, mhor “all“ 参看:/etc/protocols
      [!] -i, --in-interface name:报文流入的接口;只能应用于数据报文流入环节,只应用于INPUT、FORWARD、PREROUTING链
      [!] -o, --out-interface name:报文流出的接口;只能应用于数据报文流出的环节,只应用于FORWARD、OUTPUT、POSTROUTING链
    iptables -A INPUT -p icmp -j REJECT   ---禁ping
    iptables -A INPUT -i ens33 -j REJECT   ---流入报文禁止访问哪个网卡
    

    2 、扩展匹配条件:需要加载扩展模块(/usr/lib64/xtables/*.so),方可生效
    查看帮助man iptables-extensions
    (1)隐式扩展:在使用-p选项指明了特定的协议时,无需再用-m选项指明扩展模块的扩展机制,不需要手动加载扩展模块
    tcp协议的扩展选项
    [!] --source-port, --sport port[:port]:匹配报文源端口,可为端口范围
    [!] --destination-port,--dportport[:port]:匹配报文目标端口,可为范围
    [!] --tcp-flags mask comp
    mask 需检查的标志位列表,用,分隔
    例如SYN,ACK,FIN,RST
    comp 在mask列表中必须为1的标志位列表,无指定则必须为0,用,分隔

    示例:
    --tcp-flags SYN,ACK,FIN,RST SYN 表示要检查的标志位为SYN,ACK,FIN,RST四个,其中SYN必须为1,余下的必须为0,也就是三次握手的第一次请求
    --tcp-flags SYN,ACK,FIN,RST SYN,ACK  ---表示三次握手的第二次请求,SYN、ACK为1
    --tcp-flags ALL ALL   ---表示检查所有的标志位,所有位都是1,没有这样的情况,是错误的数据包,可以认为是恶意攻击
    --tcp_flagsALL NONE  ---这个也是一样,所有位都是0,也可以认为是恶意攻击
    [!] --syn:用于匹配第一次握手
    相当于:--tcp-flags SYN,ACK,FIN,RST SYN
    iptables -A INPUT -p tcp --dport 80 -j REJECT  ---拒绝访问本机的tcp协议的80端口,也就是拒绝访问httpd服务
    iptables -A INPUT -p tcp --syn -j REJECT  ---表示tcp的第一次握手被拒绝,也就是新的连接被拒绝,旧的连接不被拒绝,此时的xshell通过ssh还可以继续连接,但在打开一个新的窗口去连接却连接不了了
    iptables -A INPUT -p icmp --icmp-type 8 -j REJECT  ---icmp的请求包是8,icmp的请求包被拒绝,就是拒绝别人ping我
    iptables -A INPUT -p tcp --dport 80:85 -j REJECT  ---表示拒绝访问tcp的80-85端口,端口必须是连续的
    

    udp
    [!] --source-port, --sport port[:port]:匹配报文的源端口;可以是端口范围
    [!] --destination-port,--dportport[:port]:匹配报文的目标端口;可以是端口范围
    icmp
    [!] --icmp-type {type[/code]|typename}
    type/code
    0/0 echo-reply icmp应答,0是icmp的回应包
    8/0 echo-request icmp请求,8是icmp的请求包
    (2)显式扩展:必须使用-m选项指明要调用的扩展模块的扩展机制,要手动加载扩展模块,[-m matchname[per-match-options]]
    1、multiport扩展
    以离散方式定义多端口匹配,最多指定15个端口
    [!] --source-ports,--sports port[,port|,port:port]...
    指定多个源端口
    [!] --destination-ports,--dportsport[,port|,port:port]...
    指定多个目标端口
    [!] --ports port[,port|,port:port]...多个源或目标端口

    iptables -A INPUT -s 172.18.21.106 -p tcp -m multiport --dports 22,80 -j REJECT   ---表示拒绝来自172.18.21.106的主机访问我的tcp的22和80端口,端口可以使离散的,不必是连续的
    

    2、iprange扩展
    指明连续的(但一般不是整个网络)ip地址范围
    [!] --src-range from[-to]源IP地址范围
    [!] --dst-range from[-to]目标IP地址范围

    iptables -A INPUT -p tcp --dport 80 -m iprange --src-range 172.18.21.1-172.18.21.10 -j REJECT 
    

    3、mac扩展
    指明源MAC地址
    适用于:PREROUTING, FORWARD,INPUT chains
    [!] --mac-source XX:XX:XX:XX:XX:XX

    iptables -A INPUT -p tcp --dport 80 -m mac --mac-source 00:0c:29:6d:aa:fe -j REJECT
    

    4、string扩展
    对报文中的应用层数据做字符串模式匹配检测
    --algo {bm|kmp}:字符串匹配检测算法
    bm:Boyer-Moore
    kmp:Knuth-Pratt-Morris
    --from offset 开始偏移
    --to offset 结束偏移
    [!] --string pattern:要检测的字符串模式
    [!] --hex-string pattern:要检测字符串模式,16进制格式

    iptables -A OUTPUT -m string --algo bm --string "google" -j REJECT --表示流出的报文中含有google字符串的就拒绝,这样别人就不可以访问我的google网站,只支持明文,https等加密的就不可以了
    

    5、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...] 星期几
    注意:centos6 默认是本地时区,CentOS7系统默认为要使用UTC时间

    iptables -A OUTPUT -m time --timestart 01:00 --timestop 10:00 -j REJECT   ---表示09:00-18:00上课时间不准上网,因为是UTC时间,比北京时间晚8小时,centos6上直接写本地时区就可以
    date -u 查看utc时间
    iptables -A INPUT  -m time --timestart 01:00 --timestop 10:00 --weekdays San,Sun -j REJECT  ---表示周六和周日的9:00-18:00禁止访问我,注意星期的第一个字母是大写
    iptables -A INPUT -m time --timestart 01:00 --timestop 10:00 --monthdays 10,20,30 -j REJECT 
    

    6、connlimit扩展
    根据每个客户端IP做并发连接数数量匹配
    可防止CC(Challenge Collapsar挑战黑洞)攻击
    --connlimit-upton:连接的数量小于等于n时匹配
    --connlimit-above n:连接的数量大于n时匹配
    通常分别与默认的拒绝或允许策略配合使用

    iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 1 -j REJECT ---表示连接本机的tcp的22端口数量大于1就拒绝
    

    7、limit扩展
    基于收发报文的速率做匹配
    令牌桶过滤器
    --limit rate[/second|/minute|/hour|/day] 超过下面限制的数量后,每分钟允许的请求数
    --limit-burst number 表示前几个不限制

    iptables -A INPUT  -p icmp --icmp-type 8 -m limit --limit 10/minute --limit-burst 10 -j ACCEPT ---表示来自icmp的请求包,前10个不受限制,超过10个,每分钟处理10个请求,要配合下面的使用,其他的包都拒绝,注意一定要和下面的配合使用,不然不会限速的,因为不知道其他的包怎么处理
    iptables -A INPUT -p icmp -j REJECT 
    

    8、state扩展
    根据”连接追踪机制“去检查连接的状态,较耗资源
    conntrack机制:追踪本机上的请求和响应之间的关系
    状态有如下几种:
    NEW:新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求
    ESTABLISHED:NEW状态之后,连接追踪信息库中为其建立的条目失效之前,期间内所进行的通信状态
    RELATED:新发起的但与已有连接相关联的连接,如:ftp协议中的数据连接与命令连接之间的关系,ftp发起数据连接之前,命令连接已经连接,属于ESTABLISHED,当ftp发起新的数据连接时会只要命令连接是ESTABLISHED,即使新的连接受限也不影响ftp连接。
    INVALID:无效的连接,如flag标记不正确
    UNTRACKED:未进行追踪的连接,如raw表中关闭追踪
    已经追踪到的并记录下来的连接信息库
    /proc/net/nf_conntrack
    调整连接追踪功能所能够容纳的最大连接数量
    /proc/sys/net/nf_conntrack_max
    不同的协议的连接追踪时长
    /proc/sys/net/netfilter/
    注意:CentOS7 需要加载模块:modprobe nf_conntrack
    示例

    [root@centos7 ~]#lsmod |grep nf_conntrack   ---模块已经加载,如果没有加载需要用modprobe命令加载
    nf_conntrack_ipv4      19108  1 
    nf_defrag_ipv4         12729  1 nf_conntrack_ipv4
    nf_conntrack          111302  6 nf_nat,xt_connlimit,nf_nat_ipv4,xt_conntrack,nf_nat_masquerade_ipv4,nf_conntrack_ipv4
    iptables -A INPUT -p tcp --dport 22 -m state --state ESTABLISHED -j ACCEPT 
    iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j REJECT 
    以上两条规则可以实现ssh协议新的连接被拒绝,旧的连接继续连接
    

    1、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_conntracktimeout时间
    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
    

    2、开放被动模式的ftp服务示例

    yum install vsftpd
    systemctl start vsftpd
    modprobe nf_conntrack_ftp  ---必须加载这个模块才可以
    lsmod |grep nf_conntrack_ftp
    iptables -F 
    iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 相关联的和已经连接的都是允许的,命令端口连接后,因数据连接和命令连接相关联,所以客户端进行数据连接也是被允许的
    iptables -A INPUT -p tcp --dport 21 -m state --state NEW -j ACCEPT ---连接本机tcp的21端口的新的连接是允许的
    iptables -A INPUT -j DROP ---其他连接是拒绝的
    [root@centos7 var]#iptables -vnL
    Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
     pkts bytes target     prot opt in     out     source               destination         
     1272 81651 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
       10   600 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:21 state NEW
     4093  531K DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0           
    
    • 处理动作:
      -j targetname[per-target-options] -j是jump跳转至下一跳
      简单:ACCEPT,DROP
      扩展:REJECT:--reject-with:icmp-port-unreachable默认
      RETURN:返回调用链
      REDIRECT:端口重定向
      MARK:做防火墙标记
      DNAT:目标地址转换
      SNAT:源地址转换
      MASQUERADE:地址伪装
      LOG:记录日志,非中断的处理动作,本身不拒绝和允许,放在拒绝和允许规则前,并将日志记录在/var/log/messages系统日志中
      --log-level level 级别:emerg, alert, crit, error, warning, notice, info or debug
      --log-prefix prefix 日志前缀,用于区别不同的日志,最多29个字符
      示例
    iptables -A INPUT -p tcp --dport 80 -m state --state NEW -j LOG --log-prefix "new connections"   --- 表示访问本机的httpd服务的新的请求就记录到日志/var/log/messages中,并且记录的日志中的前缀为new connections
    

    一、防火墙的概念

    (一)安全技术介绍

    iptables的保存和载入

      Centos6:
        iptables的规则保存于 /etc/sysconfig/iptables 文件中,可使用命令service iptables save进行规则的保存,而iptables启动或重启的时候也是会读取/etc/sysconfig/iptables中的配置来生成相应的规则。

      Centos7:
        其规则的保存和恢复则使用下面两个命令来实现:
          保存:iptables-save > /PATH/TO/SOME_RULE_FILE
          重载:iptables-restore < /PATH/FROM/SOME_RULE_FILE

     

        硬件防火墙:在专用硬件级别实现部分功能的防火墙;另一部分功能基于软件实现
        软件防火墙:运行于通用硬件平台之上的防火墙的应用软件

    3、自定义链

    示例一:自定义一个链,规则是认为是恶意攻击的报文请求被拒绝
    iptables -N deny   ---创建一个自定义链
    iptables -A deny -p tcp --tcp-flags ALL ALL -j REJECT 
    iptables -A deny -p tcp --tcp-flags ALL NONE -j REJECT ---在自定义链上设置规则为标记位都是1和标记位都是0的tcp报文被拒绝
    iptables -A INPUT -j deny   ---把自定义链内置链相关联,注意自定义链只有和内置链关联后才能起作用
    iptables -vnL
    iptables -F
    iptables -vnL
    iptables -X deny  ---删除自定义链之前一定要先清空自定义链和它所关联的默认链,因为-X 选项是清空自定义的空链
    iptables -vnL
    

    示例二:自定义一个链,规则是禁ping

    iptables -N jinping
    iptables -A jinping -p icmp --icmp-type 8 -j REJECT 
    iptables -A INPUT -j jinping
    iptables -vnL
    

    自定义链的作用是可以把一些常用的规则写到自定义链里,当要用的时候把它和内置链相关联就可以了,很方便。

    总结:
    任何不允许的访问,应该在请求到达时给予拒绝
    规则在链接上的次序即为其检查时的生效次序
    基于上述,规则优化
    1 安全放行所有入站和出站的状态为ESTABLISHED状态连接
    2 谨慎放行入站的新请求
    3 有特殊目的限制访问功能,要在放行规则之前加以拒绝
    4 同类规则(访问同一应用),匹配范围小的放在前面,用于特殊处理
    5 不同类的规则(访问不同应用),匹配范围大的放在前面
    6 应该将那些可由一条规则能够描述的多个规则合并为一条
    7 设置默认策略,建议白名单(只放行特定连接)
    1)iptables-P,不建议
    2)建议在规则的最后定义规则做为默认策略

    (一)安全技术简介

    (1) 入侵检测与管理系统(Intrusion Detection Systems)

    • 特点:是不阻断任何网络访问,量化、定位来自内外网络的威胁情 况,主要以提供报告和事后监督为主,提供有针对性的指导措 施和安全决策依据。一般采用旁路部署方式,主要起到监视的作用。

        网络层防火墙:工作在OSI下面第三层
        应用层防火墙:或代理服务型防火墙,工作在OSI七层

    (1)入侵检测与管理系统(Intrusion Detection System)
    • 特点:不阻断任何网络访问
    • 功能:提供报告和事后监督
    • 旁路部署

    (2)入侵防御与管理系统(Intrusion Prevention System)

    • 特点:以透明模 式工作,分析数据包的内容如:溢出攻击、拒绝服务攻击、木 马、蠕虫、系统漏洞等进行准确的分析判断,在判定为攻击行 为后立即予以阻断,主动而有效的保护网络的安全,一般采用 在线部署方式,所谓的透明的工作模式就是不阻止正常网络的访问,只是针对有攻击特性的网络访问进行防御

      网络型防火墙:
      网络层对数据包进行选择 ,选择的依据是系统内设置的过滤逻辑,被称为访问控制列表(ACL),通过检查数据流中每个数据的源IP,目的IP,所用端口号和协议状态等因素,或他们的组合来确定是否允许该数据包通过
        优点:对用户来说透明,处理速度快且易于维护
        缺点:无法检查应用层数据,如病毒等
      应用层防火墙:
      应用层防火墙/代理服务型防火墙(Proxy Service)将所有跨越防火墙的网络通信链路分为两段,内外网用户的访问都是通过代理服务器上的“ 链接”来实现
        优点: 在应用层对数据进行检查,比较 安全
        缺点:增加防火墙的负载

    (2)入侵防御系统(Intrusion Prevention System)
    • 特点:透明模式工作,分析数据包
    • 功能:判定为攻击时,立即阻断攻击连接
    • 在线部署

    (3)防火墙( FireWall ):

    • 特点:隔离功能,工作在网络或主机边缘, 对进出网络或主机的数据包基于一定的规则检查,并在匹配某规则时由规则定义的行为进行处理的一组功能的组件,基本上 的实现都是默认情况下关闭所有的通过型访问,只开放允许访问的策略

      现实生产环境中所使用的防火墙一般都是二者结合体,即先检查网络数据,通过之后再送到应用层去检查

    (3)防火墙(Firewall)
    • 特点:默认关闭所有通过访问,只开放允许访问的策略
    • 功能:基于设置的规则对进出网络或主机的数据包进行审查,并在符合相关规则时执行规则定义的某些行为
    • 工作在网络或主机的边缘,起到隔离的作用

    (二)防火墙的分类

    • 主机防火墙:服务范围为当前主机
      网络防火墙:服务范围为防火墙一侧的局域网 
      硬件防火墙:在专用硬件级别实现部分功能的防火墙;另一 个部分功能基于软件实现,Checkpoint,NetScreen 软件防火墙:运行于通用硬件平台之上的防火墙的应用软件 
      网络层防火墙:OSI下面第三层
      应用层防火墙/代理服务器:代理网关,OSI七层

      Firewalld放在内核空间,集成在linux 内核中:由内核中选取五个位置放了五个勾子函数(hook function)(INPUT、OUTPUT 、FORWARD 、PREROUTING 、POSTROUTING),而这五个勾子函数向用户开放,用户可以通过一个命令工具(iptables )向其写入规则。整个规则由信息过滤表(table )组成,包含控制IP包处理的规则集(rules ),每条规则被分组放在链(chain )上

    (二)防火墙的分类

    (三)网络型的防火墙

      iptables:是一个命令行工具,工作在用户空间。用来编写FireWalld的规则,写好的规则被送往netfilter,告诉内核该如何去处理信息包

    (1)按照服务范围分
    • 主机防火墙:服务范围为当前主机
    • 网络防火墙:服务范围为防火墙一侧的局域网

    网络层防火墙

    • 包过滤防火墙 
    • 网络层对数据包进行选择,选择的依据是系统内设置的过滤逻辑 ,被称为访问控制列表(ACL),通过检查数据流中每个数据的 源地址,目的地址,所用端口号和协议状态等因素,或他们的组 合来确定是否允许该数据包通过 
      优点:对用户来说透明,处理速度快且易于维护 
      缺点:无法检查应用层数据,如病毒等 例如应用层发来一个50k的病毒数据包,但是网络层的mtu的分片大小只有1500个字节,将病毒数据包分割成很多片,所以无法整合辨析该数据包的类型,也就无法分析是否为病毒数据包

    iptables 的组成
      iptables由四个表和五个链以及一些规则组成
      四个表(table):filter 、nat 、mangle 、raw
        filter 表: 过滤规则表,根据预定义的规则过滤符合条件的数据包
        nat 表:(network address translation)地址转换规则表(利于ftp类的数据传输)
        mangle 表: 修改数据标记位规则表 (相当于在协议上打标签)
        raw 表:关闭nat 表上启用的连接跟踪机制,加快封包穿越防火墙速度
          优先级由高到低的顺序为:raw-->mangle-->nat-->filter

    (2)按照实现方式分
    • 硬件防火墙:在专用硬件级别实现部分功能的防火墙,另一个部分功能基于软件实现,Checkpoint,NetScreen
    • 软件防火墙:运行于通用硬件平台之上的防火墙的应用软件

    (四)应用层的防火墙

    • 应用层防火墙/代理服务型防火墙(Proxy Service) 
      将所有跨越防火墙的网络通信链路分为两段 
      内外网用户的访问都是通过代理服务器上的“链接”来实现 
      优点:在应用层对数据进行检查,比较安全 
      缺点:增加防火墙的负载
      注意:所谓代理服务防火墙就是防火墙本身会起到代理作用,也就是说当企业内部要访问外部浏览器时,是通过代理服务器防火墙来实现,代理服务器代替用户去访问外部浏览器,而不是转发,这是和路由器工作机制的区别
    • 在实际应用中,应用层防火墙和网络层防火墙是相结合的,既先在网络层中检查网络数据,然后送到应用层去检查数据包的安全性

      五个内置链(chain)
        INPUT
        OUTPUT
        FORWARD
        PREROUTING
        POSTROUTING

    (3)按照工作的网络层次分
    • 网络层防火墙:OSI下面第三层
    • 应用层防火墙/代理服务器:代理网关,OSI七层

    二.iptables的基本认识

    • 在内核空间,集成在linux内核中,属于netfilter组件
    • 扩展各种网络服务的结构化底层框架 
    • 内核中选取五个位置放了五个hook(勾子) function(INPUT、 OUTPUT、FORWARD、PREROUTING、POSTROUTING), 而这五个hook function向用户开放,用户可以通过一个命令工 具(iptables)向其写入规则 
    • 由信息过滤表(table)组成,包含控制IP包处理的规则集( rules),规则被分组放在链(chain)上 
    • 三种报文流向: 
      流入本机:PREROUTING --> INPUT-->用户空间进程 
      流出本机:用户空间进程 -->OUTPUT--> POSTROUTING 
      转发:PREROUTING --> FORWARD --> POSTROUTING
    • 防火墙工具,iptables本身并不是防火墙,而是一种防火墙工具软件 
      iptables 
      命令行工具,工作在用户空间 
      用来编写规则,写好的规则被送往netfilter,告诉内核如何去处 理信息包

      表和链的对应关系:功能的实现:
        表: 链
        filter: INPUT, FORWARD, OUTPUT
        nat:PREROUTING(SNAT),POSTROUTING(DNAT),OUTPUT
        mangle: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
        raw: PREROUTING, OUTPUT

    (三)网络层防火墙

    • 包过滤防火墙
    • 网络层对数据包进行选择,选择的依据是系统内设置的过滤逻辑,被称为访问控制列表(ACL),通过检查数据流中每个数据的源地址,目的地址,所用端口号和协议状态等因素,或他们的组合来确定是否允许该数据包通过
    • 优点:对用户来说透明,处理速度快且易于维护
    • 缺点:无法检查应用层数据,如病毒等

    (二)iptables的组成

    • iptables由四个表和五个链以及一些规则组成 
      四个表table:filter、nat、mangle、raw
      filter表:过滤规则表,根据预定义的规则过滤符合条件的数据包
      nat表:network address translation 地址转换规则表
      mangle:修改数据标记位规则表
      Raw:关闭NAT表上启用的连接跟踪机制,加快封包穿越防火墙速度
      优先级由高到低的顺序为:raw-->mangle-->nat-->filter 
      五个内置链chain
      INPUT OUTPUT FORWARD PREROUTING POSTROUTING

      网络数据报文的流向:
        流入本机:PREROUTING --> INPUT--> 用户空间进程
        流出本机:用户空间进程 -->OUTPUT--> POSTROUTING
        转发:PREROUTING --> FORWARD --> POSTROUTING

    (四)应用层防火墙/代理服务型防火墙

    • 将所有跨越防火墙的网络通信链路分为两段
    • 内外网用户的访问都是通过代理服务器上的“链接”来实现
    • 优点:在应用层对数据进行检查,比较安全
    • 缺点:增加防火墙的负载

    (1)Netfilter表和链对应关系

    新葡亰496net 6

    image.png

    数据包过滤匹配流程

    新葡亰496net 7

    image.png

      报文进入本机后
        判断目标主机是否为本机
          是:INPUT开始发挥作用
          否:FORWARD开始发挥作用
      报文离开本机之前
        判断由哪个网卡接口送往下一跳,OUTPUT发挥作用

    二、iptables的简介

    (2)IPTABLES和路由

    • 路由功能发生的时间点 
      报文进入本机后
      判断目标主机是否为本机
      是:INPUT
      否:FORWARD 
      报文离开本机之前
      判断由哪个接口送往下一跳

      新葡亰496net 8

      image.png


      内核数据包的传输过程
      当数据包进入网卡时,首先进入prerouting进行检测,来判断该数据包的目的Ip是否发送本机的,如果是发往本机的,就会进入input链,本机进程处理数据后,就会通过output链将数据发送出去,最后经过postrouting发送出去
      如果经过判断数据包的目的ip不是发送本机的,而是转发到别的主机时,则会将数据包送到forward链中,经过内核同意后,流入到postrouting后转发出去

      当一个数据包进入网卡时,数据包首先进入PREROUTING 链,内核根据数据包目的IP 判断是否需要转送出去
      (1)如果数据包就是进入本机的,数据包就会沿着图向下移动,到达INPUT 链。数据包到达INPUT链后,本机内的任何进程都可以收到它。本机上运行的程序也可以发送数据包,这些数据包经过OUTPUT链,然后到达POSTROUTING链输出到网卡设备传输出去
      (2)如果数据包是要转发出去的,且内核允许数据转发,数据包就会向右移动,经过FORWARD 链,然后到达POSTROUTING 链输出到另一端网卡传输出去

    (一)Netfilter组件

    • 内核空间,集成在linux内核中
    • 扩展各种网络服务的结构化底层框架
    • 内核中选取五个位置放了五个hook(勾子) function(INPUT, OUTPUT, FORWARD, PREROUTING, POSTROUTING),而这五个hook function向用户开放,用户可以通过一个命令工具(iptables)向其写入规则
    • 由信息过滤表(table)组成,包含控制IP包处理的规则集(rules),规则被分组放在链(chain)上
    • 三种报文流向:
      流入本机:PREROUTING --> INPUT-->用户空间进程
      流出本机:用户空间进程-->OUTPUT--> POSTROUTING
      转发:PREROUTING --> FORWARD --> POSTROUTING

    (3)iptables规则

    • 规则rule:根据规则的匹配条件尝试匹配报文,对匹配成功的报文 根据规则定义的处理动作作出处理 
      匹配条件:默认为与条件,同时满足
      基本匹配:IP,端口,TCP的Flags(SYN,ACK等)
      扩展匹配:通过复杂高级功能匹配 
      处理动作:称为target,跳转目标
      内建处理动作:ACCEPT,DROP,REJECT,SNAT,DNAT MASQUERADE,MARK,LOG...
      自定义处理动作:自定义chain,利用分类管理复杂情形 
      规则要添加在链上,才生效;添加在自定义上不会自动生效 
      链chain: 内置链:每个内置链对应于一个钩子函数
      自定义链:用于对内置链进行扩展或补充,可实现更灵活的规 则组织管理机制;
      只有Hook钩子调用自定义链时,才生效

    iptables 规则
      规则(rule):根据规则的匹配条件尝试匹配报文,对匹配成功的报文根据规则作出处理动作
      匹配条件:默认为与条件,即要同时满足规则
        基本匹配:IP, 端口,TCP 的Flags (SYN,ACK 等)
        扩展匹配:通过复杂高级功能匹配
      处理动作:称为target ,跳转目标
        内建处理动作:ACCEPT,DROP,REJECT,SNAT,DNAT,MASQUERADE,MARK,LOG...
        自定义处理动作:自定义chain ,利用分类管理复杂情形
        注意:自定义规则要添加在链上会才生效;

    (二)防火墙工具

    • iptables
      命令行工具,工作在用户空间
      用来编写规则,写好的规则被送往netfilter,告诉内核如何去处理信息包
    • firewalld
      CentOS 7引入了新的前端管理工具

    (4)iptables添加要点

    • iptables规则添加时考量点 
      要实现哪种功能:判断添加在哪张表上 
      报文流经的路径:判断添加在哪个链上 
      报文的流向:判断源和目的 
      匹配规则:业务需要 
      链上规则的次序,即为检查的次序,因此隐含一定的法则 
      同类规则(访问同一应用),匹配范围小的放上面 
      不同类规则(访问不同应用),匹配到报文频率较大的放上面 
      将那些可由一条规则描述的多个规则合并为一个 
      设置默认策略 
      实验环境准备: 
      Centos7: systemctl stop firewalld.service systemctl disable firewalld. service 
      Centos6:service iptables stop; chkconfig iptables off

     

    (三)iptables的组成

    • 主要由四个表、五个链以及一些规则组成

    • 四个表(table): filter, nat, mangle, raw

      • filter: 过滤规则表,根据预定义的规则过滤符合条件的数据包
      • nat: network address translation 地址转换规则表
      • mangle: 修改数据标记位规则表
      • raw: 关闭NAT表上启用的连接跟踪机制,加快封包穿越防火墙速度
      • 优先级由高到低的顺序为: raw-->mangle-->nat-->filter
    • 五个内置链chain

      • INPUT
      • OUTPUT
      • FORWARD
      • PREROUTING
      • POSTROUTING

    三.iptables命令的应用

    首先通过 man 8 iptables去了解一些相关命令的应用
    扩展应用 man 8 iptables-extensions来了解

    新葡亰496net 9

    image.png

    iptables -vnL和iptables -vnL -t 指定表来查看

    新葡亰496net 10

    image.png

    (1)filter表中规则的使用
    例: iptables -t filter -A INPUT -s 192.168.136.134 -j DROP
    解释说明—:-t指定表(不写默认为使用filter表),-A代表增加规则,增加input链,-s代表源地址,-j跳转,将源地址丢弃,就是禁止源地址的访问

    新葡亰496net 11

    image.png

    新葡亰496net 12

    image.png

    新葡亰496net 13

    image.png

    当清除策略后,会再次ping通 iptables -F清除策略
    ping 成功

    新葡亰496net 14

    同样用ssh和curl也可以进行测试,其中-j DROP 也可以改为REJECT,拒绝的更直接
    iptables -vnL --line-numbers 显示规则序号

    新葡亰496net 15

    image.png

    iptables -I INPUT -s 192.168.136.133 -j ACCEPT——I代表插入的意思,直接加到iptbales表中的第一行,A代表追加,加到最后一行

    新葡亰496net 16

    image.png

    新葡亰496net 17

    image.png

    指定加到第几行:iptables -I INPUT 2 -s 192.168.136.111 -j ACCEPT——将规则放到第二行

    新葡亰496net 18

    image.png

    删除命令: iptables -D INPUT 6——指定删除第五行命令

    新葡亰496net 19

    image.png

    iptables 命令介绍、用法
      命令格式:iptables [-t table] SUBCOMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]
        -t table:
          raw, mangle, nat, filter 默认为filter
        SUBCOMMAND:

    (四)内核中数据包的传输过程

    • 当一个数据包进入网卡时,数据包首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去

    • 如果数据包就是进入本机的,数据包就会经过INPUT链供有关进程接收。本机上运行的程序可以发送数据包,这些数据包经过OUTPUT链,然后到达POSTROUTING链输出

    • 如果数据包是要转发出去的,且内核允许转发,数据包就会经过FORWARD链,然后到达POSTROUTING链输出

    iptables 匹配条件分类

    (1)基本匹配条件:通用条件,不要额外加载模块,在iptables/netfilter中提供
    1.-s --source address指定源地址:iptables -A INPUT -s 192.168.136.0/24 -j REJECT,整个网段都拒绝,但是注意设置策略的时候不要将自己也拒绝掉,所以要注意设置的策略
    也可以一次写两个地址: iptables -A INPUT -s 192.168.136.170,192.168.136.180 -j REJECT
    iptables -A INPUT !-s 192.168.136.180 -j REJECT——加入叹号代表除了180的地址都被拒绝
    ! -s 192.168.136.0/24 ——除了这个网段都被拒绝

    新葡亰496net 20

    image.png

    2.-d --destination address 指定目标地址: iptables -A INPUT -s 172.18.254.242 -d 172.18.0.107 -j REJECT——指定目标地址
    3.-p --protocol protocol 指定规定协议:protocol: tcp, udp, icmp, icmpv6, udplite,esp, ah, sctp 参看:/etc/protocols
    例: iptables -A INPUT -p icmp -j REJECT——规定icmp协议被拒绝,无法使用Ping命令测试网络连通性

    新葡亰496net 21

    image.png

    但是并不影响别的协议的应用

    新葡亰496net 22

    image.png

    注意:一般情况下很少拒绝tcp协议,因为tcp协议对应的端口和包含的命令很复杂
    4.-i --in-interface name 报文流入的接口;只能应用于数据 报文流入环节,只应用于INPUT、FORWARD、PREROUTING链
    例: iptables -A INPUT -i eth0 -p icmp -j REJECT:拒绝从eth0这个网卡的ip的icmp协议,如果有两个网卡的话,另一个网卡的icmp协议不被禁止

    新葡亰496net 23

    image.png

    新葡亰496net 24

    image.png

    5.-o --out-interface name:报文流出的接口;只能应用于数 据报文流出的环节,只应用于FORWARD、OUTPUT、POSTROUTING链
    例: iptables -A OUTPUT -i eth0 -p icmp -j REJECT:拒绝output链的输出
    (2)扩展匹配条件:需要加载模块来实现,MATCH EXTENTIONS

    • 扩展匹配条件:需要加载扩展模块(/usr/lib64/xtables/*.so) ,方可生效  查看帮助 man iptables-extensions
      1.隐式扩展方式:在使用-p选项指明了特定的协议时,无需再用-m选项 指明扩展模块的扩展机制,不需要手动加载扩展模块

      新葡亰496net 25

      image.png


      (1)tcp协议的扩展选项
      [!] --source-port, --sport port[:port]:匹配报文源端口, 可为端口范围
      [!] --destination-port,--dport port[:port]:匹配报文目标 端口,可为范围
      [!] --tcp-flags mask comp mask 需检查的标志位列表,用,分隔
      例如 SYN,ACK,FIN,RST
      comp 在mask列表中必须为1的标志位列表,无指定则必须 为0,用,分隔
      例: iptables -A INPUT -p tcp --dport 80 -j REJECT

      新葡亰496net 26

      image.png


      示例:
      --tcp-flags SYN,ACK,FIN,RST SYN 表示要检查 的标志位为SYN,ACK,FIN,RST四个,其中SYN必须为1,余 下的必须为0
      --tcp-flags SYN,ACK,FIN,RST SYN,ACK
      --tcp-flags ALL ALL ——不存在这种包,为错误数据包
      --tcp_flags ALL NONE——同上
      [!] --syn:用于匹配第一次握手 相当于:--tcp-flags SYN,ACK,FIN,RST SYN
      例:iptables -A INPUT -p tcp --syn -j REJECT——第一次握手被拒绝,拒绝新的连接,但是旧的连接不会断开

      新葡亰496net 27

      image.png

      无法连接
      (2)udp
      [!] --source-port, --sport port[:port]:匹配报文的 源端口;可以是端口范围
      [!] --destination-port,--dport port[:port]:匹配报 文的目标端口;可以是端口范围
      应用协议:dns和DHCP使用udp协议
      (3) icmp
      [!] --icmp-type {type[/code]|typename}
      type/code
      0/0 echo-reply icmp应答
      8/0 echo-request icmp请求
      例:iptables -A INPUT -p icmp --icmp-type 8 -j REJECT——拒绝请求包,也就说明回应包也被拒绝
      2.显式扩展:必须使用-m选项指明要调用的扩展模块的扩展 机制,要手动加载扩展模块 [-m matchname [per-match-options]]
      (1)multiport扩展
      以离散方式定义多端口匹配,最多指定15个端口
      [!] --source-ports,--sports port[,port|,port:port]... 指定多个源端口
      [!] --destination-ports,--dports port[,port|,port:port]... 指定多个目标端口
      [!] --ports port[,port|,port:port]...多个源或目标端口
      例:iptables -A INPUT -s 192.168.136.134 -p tcp --mutiport --dports 22,80 -j REJECT
      (2)iprange扩展 指明连续的(但一般不是整个网络)ip地址范围
      [!] --src-range from[-to] 源IP地址范围
      [!] --dst-range from[-to] 目标IP地址范围
      iptables -A INPUT -m iprange --src-range 192.168.136.134-192.168.136.180 -p tcp -m --mutiport --dports 22,80 -j REJECT
      (3)mac扩展 指明源MAC地址
      适用于:PREROUTING, FORWARD,INPUT chains
      [!] --mac-source XX:XX:XX:XX:XX:XX
      例:iptables -A INPUT -m mac --mac-source 00:0c:29:67:c2:8b -p tcp-m --mutiport --dports 22,80 -j REJECT
      (4)string扩展 对报文中的应用层数据做字符串模式匹配检测
      --algo {bm|kmp}:字符串匹配检测算法
      bm:Boyer-Moore
      kmp:Knuth-Pratt-Morris
      --from offset 开始偏移
      --to offset 结束偏移
      [!] --string pattern:要检测的字符串模式
      [!] --hex-string pattern:要检测字符串模式,16进制格式
      iptables -A OUTPUT -m string --algo bm --string "magedu" -j REJECT

      新葡亰496net 28

      image.png


      (5)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...] 星期几
      --kerneltz:内核时区,不建议使用,CentOS7系统默认为UTC
      注意: centos6 不支持kerneltz ,--localtz指定本地时区(默认)

      新葡亰496net 29

      image.png


      例:iptables -A OUTPUT -m time --timestart 01:00 --timestop 09:30 string --algo bm --string "magedu" -j REJECT——在这个时间段无法访问magedu.com,超过这个时间后就可以访问

      新葡亰496net 30

      image.png


      更加完全的设置:
      iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun
      (6)connlimit扩展
      根据每客户端IP做并发连接数数量匹配
      可防止CC(Challenge Collapsar挑战黑洞)攻击
      --connlimit-upto n:连接的数量小于等于n时匹配
      --connlimit-above n:连接的数量大于n时匹配 通常分别与默认的拒绝或允许策略配合使用
      示例:iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 1 -j REJECT
      解释:阻止并发连接的次数,不论是哪个源地址并发连接的次数都不能超过一次,超过一次以上就被拒绝,拒绝的是tcp端口的22端口,拒绝ssh的连接

      新葡亰496net 31

      image.png


      第二次连接就会被拒绝
      (7)limit扩展
      基于收发报文的速率做匹配
      令牌桶过滤器
      --limit rate[/second|/minute|/hour|/day]
      --limit-burst number
      例:
      iptables -I INPUT -p icmp --icmp-type 8 -m limit --limit 10/minute --limit-burst 10 -j ACCEPT
      iptables -I INPUT 2 -p icmp -j REJECT——配合上述命令使用,代表含义是不符合上述条件的都被拒绝,而且该规则的位置应该在上述规则的下面,否则全都被拒绝,一定要注意顺序问题

      新葡亰496net 32

      image.png

      新葡亰496net 33

      image.png


      (8)state扩展
      根据”连接追踪机制“去检查连接的状态,较耗资源 
      conntrack机制:追踪本机上的请求和响应之间的关系 
      状态有如下几种:
      NEW:新发出请求;连接追踪信息库中不存在此连接的 相关信息条目,因此,将其识别为第一次发出的请求 ESTABLISHED:NEW状态之后,连接追踪信息库中为 其建立的条目失效之前期间内所进行的通信状态 RELATED:新发起的但与已有连接相关联的连接,如: ftp协议中的数据连接与命令连接之间的关系 INVALID:无效的连接,如flag标记不正确 UNTRACKED:未进行追踪的连接,如raw表中关闭追踪
      例:
      iptables -A INPUT -p tcp --dport 22 -m state --state ESTABLISHED -j ACCEPT:此规则的定义代表原来的连接保持
      iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j REJECT:新建立的SSH连接就拒绝
      两个规则的定义一般配合使用,并且最好是旧连接的规则定义写在前面,新新建立的连接协议写在后面,这样节省资源

      新葡亰496net 34

      image.png


      已经追踪到的并记录下来的连接信息库 /proc/net/nf_conntrack

      新葡亰496net 35

      image.png


      调整连接追踪功能所能够容纳的最大连接数量 /proc/sys/net/nf_conntrack_max 

      新葡亰496net 36

      image.png


      调整最大连接数量:
      vim /etc/sysctl.conf
      net.nf_conntrack_max = 393216
      net.netfilter.nf_conntrack_max = 393216
      调整连接超时时间:
      net.netfilter.nf_conntrack_tcp_timeout_established = 300 ——建立连接时间最大为300s
      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 ——通知对方等待关闭连接的时间
      不同的协议的连接追踪时长 /proc/sys/net/netfilter/

      新葡亰496net 37

      image.png


      注意:CentOS7 需要加载模块: modprobe nf_conntrack
      lsmod |grep nf_conf——查看加载的模块

      新葡亰496net 38

      image.png

    开放被动模式的ftp服务

    (1) 装载ftp连接追踪的专用模块:
    跟踪模块路径:/lib/modules/kernelversion/kernel/net/netfilter
    vim /etc/sysconfig/iptables-config
    配置文件 IPTABLES_MODULES=" nf_conntrack_ftp "
    加载 modproble nf_conntrack_ftp模块 

    新葡亰496net 39

    (2) 放行请求报文:
    命令连接:NEW, ESTABLISHED
    数据连接:RELATED, ESTABLISHED
    设置规则:
    iptables -A INPUT -s 192.168.136.1 -j ACCEPT——先保证windows的连接
    ipatbles -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT——接受已经建立的连接和相关联的连接
    iptables -A INPUT -p tcp --dport 21 -m state --state NEW -j ACCEPT——新建立的连接,并走21目标端口的tcp协议接受连接
    iptables -A INPUT -j REJECT——其他连接全部拒绝
    设置完成后,进行测试
    在另一台主机上:ftp 192.168.136.170

    新葡亰496net 40

    image.png

    其他协议无法访问:curl 192.168.136.170

    新葡亰496net 41

    image.png

      1、 链管理:
        -N :new, 自定义一条新的规则链
        -X :delete ,删除自定义的空的规则链
        -P :Policy ,设置默认策略;对filter表中的链而言,其默认策略有:
          ACCEPT :接受
          DROP :丢弃
        -E :重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除

    (五)iptables规则

    • 规则(rule):根据规则的匹配条件尝试匹配报文,对匹配成功的报文根据规则定义的处理动作作出处理

    • 匹配条件:默认为与条件,同时满足
      基本匹配:IP,端口,TCP的Flags(SYN, ACK等)
      扩展匹配:通过复杂高级功能匹配

    • 处理动作(target):
      内建处理动作:ACCEPT, DROP, REJECT, SNAT, DNAT, MASQUERADE, MARK, LOG...
      自定义处理动作:自定义chain,利用分类管理复杂情形

    • 链(chain):
      内置链:每个内置链对应于一个钩子函数
      自定义链:用于对内置链进行扩展或补充,可实现更灵活的规则组织管理机制
      只有Hook钩子调用自定义链时,才生效

    Target: 

    ACCEPT, DROP, REJECT, RETURN 
    LOG, SNAT, DNAT, REDIRECT, MASQUERADE,.. 
    LOG: 非中断target,本身不拒绝和允许,放在拒绝和允许规则前
    并将日志记录在/var/log/messages系统日志中
    --log-level level 级别: emerg, alert, crit, error, warning, notice, info or debug
    --log-prefix prefix 日志前缀,用于区别不同的日志,最多 29个字符
    例:
    iptables -I INPUT -s 192.168.136.134 -p tcp -m multiport --dports 80,21,22,23 -m state --state NEW -j LOG --log-prefix "new connections:"
    在客户端用curl命令测试一下

    新葡亰496net 42

    image.png

    新葡亰496net 43

    image.png

    补:相关链管理的应用:
    -N:new, 自定义一条新的规则链
    iptables -N deny_invalid_packect

    新葡亰496net 44

    image.png

    iptables -A deny_invalid_packect -p tcp --tcp-flags ALL ALL -j REJECT——将标记位都是1的连接跳转到deny链中,进行匹配检查
    iptables -A deny_invalid_packect -p tcp --tcp-flags ALL NONE -j REJECT——将标记位都是0的连接跳转到deny链中,进行匹配检查
    iptables -A INPUT -s 192.168.136.0/24 -j deny_invalid_packect——将INPUT链与自定义的链相关联,只要下次有源地址来访问,就跳转到自定义规则中进行检查匹配
    -X:delete,删除自定义的空的规则链
    删除不能直接ipatbles -X deny_invalid_packect

    新葡亰496net 45

    image.png

    iptables -F deny_invalid_packect
    iptables -F INPUT
    iptables -X deny_invalid_packect

    新葡亰496net 46

    image.png

    练习:

    iptables -N deny_icmp_ssh——建立新的规则链
    iptables -A deny_icmp_ssh -s 192.168.136.134 -p tcp --dport 22 -j REJECT——设定规则,只要是192.168.136.134这个主机的tcp协议来访问本机的22端口就拒绝
    ipatbles -A deny-icmp_ssh -s 192.168.136.180 -p icmp -j REJECT——只要是192.168.136.180这个主机来访问就禁止Ping命令
    ipatbles -A INPUT -s 192.168.136.134,192.168.136.180 -j deny_icmp_ssh——input与自定义链相关联,只要是这两个ip来访问就跳转到自定义的链上,并分析后拒绝对应的ssh连接和ping
    -P:Policy,设置默认策略;
    对filter表中的链而言,其默认策略有:
    ACCEPT:接受
    新葡亰496net:防火墙设置。DROP:丢弃
    如果将默认策略改为DROP
    iptables -P INPUT DROP
    此时无法用ipatbles -F来进行清空,因为设置的是新的默认链且为drop,如果想要修改就要通过iptables -P INPUT ACCEPT来修改回来
    如果一定要设置一个默认的拒绝规则可以通过 iptables -A INPUT -j REJECT来实现,并且该规则也可以通过ipatbles -F来清空
    -E:重命名自定义链;引用计数不为0的自定义链不能够被重命名, 也不能被删除

      2 、查看:
        -L :list, 列出指定鏈上的所有规则,本选项须置后
        -n :numberic ,以数字格式显示地址和端口号
        -v :verbose ,详细信息
        -vv: 更详细
        -x :exactly ,显示计数器结果的精确值, 而非单位转换后的易读值
        --line-numbers :显示规则的序号
        -S: selected, 以iptables-save 命令格式显示链上规则

    (六)iptables添加要点

    • iptables规则添加时考量点
      要实现哪种功能:判断添加在哪张表上
      报文流经的路径:判断添加在哪个链上
      报文的流向:判断源和目的
      匹配规则:业务需要

    • 链上规则的次序,即为检查的次序,因此隐含一定的法则
      同类规则(访问同一应用),匹配范围小的放上面
      不同类规则(访问不同应用),匹配到报文频率较大的放上面
      可由一条规则描述的多个规则合并为一个
      设置默认策略

      3 、规则管理:
        -A :append ,追加
        -I :insert, 插入,要指明插入至的规则编号,默认为第一条
        -D :delete ,删除
        -R :replace ,替换指定链上的指定规则编号
        -F [chain]:flush ,清空指定的[chain]规则链
        -Z :zero ,置零 (重新记包的个数)

    三、iptables命令

    • 实验环境准备
    // CentOS 7关闭firewalld服务
    systemctl stop firewalld
    systemctl disable firewalld
    // CentOS 6关闭系统默认iptables策略
    service iptables stop
    chkconfig iptables off
    

     

    (一)规则格式

    iptables [-t table] SUBCOMMAND chain rule-specification
    rule-specification = [matches...] [target]
    match = -m matchname [per-match-options]
    target = -j targetname [per-target-options]
    
    • -t table:raw|mangle|nat|[filter]:指定表,filter表为默认
    • chain:PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING

      匹配条件

    (二)SUBCOMMAND

      基本匹配:通用的,PARAMETERS
      扩展匹配:需加载模块,MATCH EXTENTIONS

    (1)查看
    • 选项:

      • -L:list, 列出指定链上的所有规则,本选项须置后
      • -n:numberic,以数字格式显示地址和端口号
      • -v:verbose,详细信息
      • -vv:更详细
      • -x:exactly,显示计数器结果的精确值,而非单位转换后的易读值
      • --line-numbers:显示规则的序号
      • -S:selected,以iptables-save命令格式显示链上规则
    • 常用组合:
      --vnL
      --vnxL --line-numbers

    • 查看当前的策略

    新葡亰496net 47

    • 查看当前的策略,并详细显示了策略编号以及计数器的精确值

    新葡亰496net 48

      1 、基本匹配:无需加载模块,由iptables/netfilter 自行提供
        [!] -s, --source address[/mask][,...] :源IP 地址或范围
        [!]新葡亰496net, -d, --destination address[/mask][,...] :目标IP 地址或范围
        [!] -p, --protocol protocol :指定协议,可使用数字如0 (all)
          protocol: tcp, udp, icmp, icmpv6, udplite, esp, ah, sctp,
            更多协议可参看:/etc/protocols
        [!] -i, --in-interface name:报文流入的接口;只能应用于数据报文流入环节,只应用于 INPUT 、FORWARD 、PREROUTING 链
        [!] -o, --out-interface name:报文流出的接口;只能应用于数据报文流出的环节,只应用于 FORWARD 、OUTPUT 、 POSTROUTING 链

    (2)规则管理
    • 选项:

      • -A:append,追加
      • -I #:insert,插入,要指明插至的规则编号,默认为第一条
      • -D:delete,删除,后接:
        指明规则序号,或者
        指明规则本身
      • -R #:replace,替换指定链上的指定编号规则
      • -F:flush,清空指定的规则链
      • -Z:zero,置零
    • iptables的每条规则都有两个计数器

      • 匹配到的报文的个数
      • 匹配到的所有报文的大小之和
    • 实验:iptables规则管理

      // 添加策略:阻止来自192.168.136.130主机的访问
      iptables -A INPUT -s 192.168.136.130 -j REJECT
      // 插入策略:阻止来自192.168.25.0/24网段的访问,并且此策略编号为1
      iptables -I INPUT 1 -s 192.168.25.0/24 -j REJECT
      // 替换策略:将策略2改为阻止来自192.168.136.129主机的访问
      iptables -R INPUT 2 -s 192.168.136.129 -j REJECT
      // 删除策略:删除策略1
      iptables -D INPUT 1
      // 清空策略,并将计数器归零
      iptables -F
      iptables -Z
      
      • 添加策略

      新葡亰496net 49

      • 插入策略

      新葡亰496net 50

      • 替换策略

      新葡亰496net 51

      • 删除策略

      新葡亰496net 52

      • 清空策略,并且计数器归零

      新葡亰496net 53

      2 扩展匹配条件:需要加载扩展模块(/usr/lib64/xtables/*.so) ,方可生效
          查看需要的模块: man iptables-extensions 
      (1) 隐式扩展 :在使用-p 选项指明了特定的协议时,无需再用-m选项指明扩展模块的扩展机制,不需要手动加载扩展模块
        tcp 协议的扩展选项:
          [!] --source-port, --sport port[:port] :匹配报文源端口,可为端口范围
          [!] --destination-port, --dport port[:port]:匹配报文目标端口,可为端口范围
          [!] --tcp-flags mask comp
            mask: 需检查的标志位列表,用,分隔
              例如 SYN,ACK,FIN,RST,PSH,URG(标记位)
            comp: 在mask 列表中必须为1的标志位列表,未指定则必须为0 ,用, 分隔

    (三)匹配条件

    • 分类:
      基本:通用的,PARAMETERS
      扩展:需加载模块,MATCH EXTENTIONS

        udp协议的扩展选项:
          [!] --source-port, --sport port[:port] :匹配报文的源端口;可以是端口范围
          [!] --destination-port,--dport port[:port] :匹配报文的目标端口;可以是端口范围
          [!] --icmp-type {type[/code]|typename} 匹配icmp报文的进出标记
            type/code
            0/0 echo-reply icmp 应答回应包(定义在OUTPUT链)
            8/0 echo-request icmp 请求包(定义在INPUT链)

    (1)基本匹配条件:无需加载模块,由iptables/netfilter自行提供
    • 选项:

      • -s, --source address[/mask][,...]:源IP地址或范围
      • -d, --destination address[/mask][,...]:目标IP地址或范围
      • -p, --protocol protocol:指定协议
        protocol: tcp, udp, icmp, 参看:/etc/protocols
      • -i, --in-interface name:报文流入的接口;只能应用于数据报文流入环节,只应用于INPUT, FORWARD, PREROUTING链
      • -o, --out-interface name:报文流出的接口;只能应用于数据报文流出的环节,只应用于FORWARD, OUTPUT, POSTROUTING链
    • 实验:阻止来自192.168.136.0/24网段主机的icmp连接

    // 设置策略(IP: 192.168.136.230)
    iptables -A INPUT -s 192.168.136.0/24 -p icmp -j REJECT
    // 在其他主机测试(IP: 192.168.136.130)
    ping -c 5 192.168.136.230
    curl 192.168.136.230
    

    新葡亰496net 54

      (2) 显式扩展 :必须使用-m选项指明要调用的扩展模块的扩展机制,要手动加载扩展模块,用法:[-m matchname [per-match-options]]

    (2) 扩展匹配条件:需要加载扩展模块(/usr/lib64/xtables/*.so),方可生效
    • 查看帮助:man iptables-extensions (CentOS 7),man iptables (CentOS 6)

        1、multiport扩展:
         以离散方式定义多端口匹配;最多指定15个端口;

    1)隐式扩展:
    • 在使用-p选项指明了特定的协议时,无需再用-m选项指明扩展模块的扩展机制,不需要手动加载扩展模块
    1. tcp协议的扩展选项
      --source-port, --sport port[:port]
      匹配报文源端口,可为端口范围
      --destination-port, --dport port[:port]
      匹配报文目标端口,可为端口范围
      --tcp-flags mask comp
      mask:需检查的标志位列表(例如SYN,ACK,FIN,RST),用","分隔
      comp:在mask列表中必须为1的标志位列表,无指定则必须为0,用","分隔
    • 实验:拒绝telnet和ssh服务的建立新连接,旧连接保持原状
      分析:拒绝telnet和ssh服务可以封禁端口,只拒绝建立新连接即拒绝TCP状态位中只有SYN=1的状态
    // 设置策略(IP: 192.168.136.230),以下两条命令等价
    iptables -A INPUT -p tcp --dport 22:23 --tcp-flags SYN,ACK,FIN,RST SYN -j REJECT
    iptables -A INPUT -p tcp --dport 22:23 --syn -j REJECT
    // 在其他主机测试(IP: 192.168.136.130)
    ssh 192.168.136.230
    telnet 192.168.136.230
    

    新葡亰496net 55

    1. udp协议的扩展选项
      --source-port, --sport port[:port]
      匹配报文的源端口,可以是端口范围
      --destination-port, --dport port[:port]
      匹配报文的目标端口,可以是端口范围

    2. icmp协议的扩展选项
      --icmp-type {type[/code]|typename}
      type/code
      0/0 echo-reply:icmp应答
      8/0 echo-request:icmp请求

    • 实验:阻止对本机的icmp请求
      iptables -A INPUT -p icmp --icmp-type 8 -j REJECT

    设定策略前ping本机ip正常,设定策略后ping本机ip全部失败

    新葡亰496net 56

           [!] --source-ports,--sports port[,port|,port:port]...:可指明多个源端口;
           [!] --destination-ports,--dports port[,port|,port:port]...:指明多个离散的目标端口 port:port 表示连续的两个端口;
           例:
            ~]# iptables -I INPUT -s 172.16.0.0/16 -d 172.16.100.100 -p tcp -m multiport --dports 22,80 -j ACCEPT
            ~]# iptables -I OUTPUT -d 172.16.0.0/16 -s 172.16.100.100 -p tcp -m multiport --sports 22,80 -j ACCEPT

    2)显式扩展:
    • 必须使用-m选项指明要调用的扩展模块的扩展机制,需要手动加载扩展模块
      [-m matchname[per-match-options]]
    1. multiport扩展:以离散方式定义多端口匹配,最多指定15个端口
      --source-ports, --sports port[,port|,port:port]...
      指定多个源端口
      --destination-ports, --dports port[,port|,port:port]...
      指定多个目标端口
      --ports port[,port|,port:port]...多个源或目标端口
    • 实验:阻止来自192.168.136.0/24网段主机在TCP的20-25, 80端口的访问请求
    // 设置策略(IP: 192.168.136.230)
    iptables -A INPUT -s 192.168.136.0/24 -p tcp -m multiport -dports 20:25,80 -j REJECT
    // 在其他主机测试(IP: 192.168.136.130)
    ftp 192.168.136.230
    ssh 192.168.136.230
    telnet 192.168.136.230
    curl 192.168.136.230
    

    设置策略前

    新葡亰496net 57

    设置策略后

    新葡亰496net 58

    1. iprange扩展:指明连续的(但一般不是整个网络)ip地址范围
      --src-range from [-to] 源IP地址范围
      --dst-range from [-to] 目标IP地址范围
    • 示例:阻止IP在192.168.136.129-192.168.136.229范围内的主机建立tcp连接
      iptables -A INPUT -p tcp -m iprange --src-range 192.168.136.129-192.168.136.229 -j REJECT
    1. mac扩展:指明源MAC地址
      适用于:PREROUTING, FORWARD, INPUT chains
      --mac-source XX:XX:XX:XX:XX:XX
    • 示例:阻止来自MAC地址为00:50:56:3f:60:3c的主机建立icmp连接
      iptables -A INPUT -p icmp -m mac --mac-source 00:50:56:3f:60:3c -j REJECT
    1. string扩展:对报文中的应用层数据做字符串模式匹配检测
      --algo {bm|kmp}:字符串匹配检测算法
      bm:Boyer-Moore
      kmp:Knuth-Pratt-Morris
      --from offset:开始偏移
      --to offset:结束偏移
      --string pattern:要检测的字符串模式
      --hex-string pattern:要检测字符串模式,16进制格式
    • 实验:阻断http服务器返回报文中包含google字样的连接
    // 设置策略(IP: 192.168.136.230)
    iptables -A OUTPUT -p tcp --sport 80 -m string --algo bm --string "google" -j REJECT
    // 在其他主机测试(IP: 192.168.136.130)
    curl 192.168.136.230
    curl 192.168.136.230/index2.html
    

    前两行为设置策略前,后两行为设置策略后

    新葡亰496net 59

    1. 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...]:星期几
      CentOS 7使用UTC时间,CentOS 6使用本地时区时间
    • 实验:设置工作日指定时间段禁止http连接
    // 当前策略设置的时间段为UTC 01:00-10:00,当前时间不在范围中,故可以访问http服务
    iptables -A INPUT -p tcp --dport 80 -m time --timestart 01:00 --timestop 10:00 ! --weekdays Sat,Sun -j REJECT
    // 更新策略后,时间范围改为UTC 01:00-14:00,当前时间在范围中,故访问被拒绝
    iptables -R INPUT 1 -p tcp --dport 80 -m time --timestart 01:00 --timestop 14:00 ! --weekdays Sat,Sun -j REJECT
    

    新葡亰496net 60

    1. connlimit扩展:根据每客户端IP做并发连接数数量匹配
      可防止CC(Challenge Collapsar挑战黑洞)攻击
      --connlimit-upto n:连接的数量小于等于n时匹配,与默认的拒绝策略配合使用
      --connlimit-above n:连接的数量大于n时匹配,与默认的允许策略配合使用
    • 示例:只允许来自192.168.136.130主机发起最多2个并发ssh连接
      iptables -A INPUT -s 192.168.136.130 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
    1. limit扩展:基于收发报文的速率做匹配
      令牌桶过滤器
      --limit rate [/second|/minute|/hour|/day]:限速
      --limit-burst number:前多少个报文不做限速
    • 示例:对icmp发起的请求进行限速,前5个请求不限速,之后的请求每10秒允许一个
    iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit 6/minute --limit-burst 5 -j ACCEPT
    iptables -A INPUT -p icmp --icmp-type 8 -j DROP
    

    新葡亰496net 61

    1. state扩展:根据连接追踪机制去检查连接的状态,较耗资源
    • conntrack机制:追踪本机上的请求和响应之间的关系,状态有如下几种:

      • NEW:新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求
      • ESTABLISHED:NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态
      • RELATED:新发起的但与已有连接相关联的连接,如:ftp协议中的数据连接与命令连接之间的关系
      • INVALID:无效的连接,如flag标记不正确
      • UNTRACKED:未进行追踪的连接,如raw表中关闭追踪
    • 查询连接追踪信息

      • 已经追踪到的并记录下来的连接信息库
        /proc/net/nf_conntrack
      • 调整连接追踪功能所能够容纳的最大连接数量
        /proc/sys/net/nf_conntrack_max
      • 不同的协议的连接追踪时长
        /proc/sys/net/netfilter/
    • 实验:开放ftp服务的被动模式
      分析:ftp服务的被动模式端口不固定,一般指定端口的方法不适用,通过放行21端口的相关端口的方法设置相关策略

    modprobe nf_conntrack_ftp      // 装载ftp连接追踪模块
    iptables -F
    // 放行已经建立的命令连接、数据连接以及新发起的数据连接
    iptables -A INPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
    // 放行新发起的命令连接
    iptables -A INPUT -p tcp --dport 21 -m state --state NEW -j ACCEPT
    // 阻止其他无关连接
    iptables -A INPUT -j REJECT
    

    新葡亰496net 62

        2、iprange扩展
         指明连续的(但一般是不能扩展为整个网络的)ip地址范围时使用;

    (四)Target:处理动作

    • 语法:-j targetname [per-target-options]

    • 简单:
      ACCEPT:放行
      DROP:丢弃

    • 扩展:
      REJECT:拒绝
      RETURN:返回调用链
      REDIRECT:端口重定向
      LOG:记录日志,dmesg
      MARK:做防火墙标记
      DNAT:目标地址转换
      SNAT:源地址转换
      MASQUERADE:地址伪装

    • LOG:非中断target,本身不拒绝和允许,放在拒绝和允许规则前并将日志记录在/var/log/messages系统日志中
      --log-level level 级别:emerg, alert, crit, error, warning, notice, info or debug
      --log-prefix prefix 日志前缀,用于区别不同的日志,最多29个字符

    • 实验:将新发起的ssh和http请求记录在系统日志中,日志条目以"new connections: "作为前缀存储
      iptables -A INPUT -p tcp -m multiport --dports 22,80 -m state --state NEW -j LOG --log-prefix "new connections: "

    新葡亰496net 63

          [!] --src-range from[-to]:指明连续的源IP地址范围;
          [!] --dst-range from[-to]:指明连续的目标IP地址范围;
          例:
           ~]# iptables -I INPUT -d 172.16.100.100 -p tcp -m multiport --dports 22:23,80 -m iprange --src-range 172.16.100.1-172.16.100.120 -j ACCEPT
           ~]# iptables -I OUTPUT -s 172.16.100.100 -p tcp -m multiport --sports 22:23,80 -m iprange --dst-range 172.16.100.1-172.16.100.120 -j ACCEPT

    (五)链管理

    • 选项:
      -N:new,自定义一条新的规则链
      -X:delete,删除自定义的空规则链
      -P:Policy,设置默认策略;对filter表中的链而言,其默认策略有:
      ACCEPT:接受
      DROP:丢弃
      -E:重命名自定义链

    • 注意:
      引用计数不为0的自定义链不能够被重命名,也不能被删除
      不建议修改链默认策略,可以设置策略兜底

    • 实验:自定义链"deny_icmp_ssh",作用为拒绝icmp和ssh连接。关联"deny_icmp_tcp"链至INPUT链,实现拒绝来自192.168.136.100-192.168.136.200范围内主机的icmp和ssh连接

    // 新建自定义链
    iptables -N deny_icmp_ssh
    iptables -A deny_icmp_ssh -p icmp -j REJECT
    iptables -A deny_icmp_ssh -p tcp --dport 22 -j REJECT
    // 关联自定义链至INPUT链
    iptables -A INPUT -m iprange --src-range 192.168.136.100-192.168.136.200 -j deny_icmp_ssh
    // 其他主机上测试
    ping -c 5 192.168.136.230
    ssh 192.168.136.230
    // 清除自定义链
    iptables -F deny_icmp_ssh     // 清除deny_icmp_ssh链的策略
    iptables -F                   //清除INPUT关联deny_icmp_ssh链的策略
    iptables -X deny_icmp_ssh     //删除策略为空的deny_icmp_ssh链
    

    设置完毕的策略:自定义链下两条策略,INPUT链的策略关联了自定义链

    新葡亰496net 64

    在IP: 192.168.136.130主机测试ping和ssh登录,均失败

    新葡亰496net 65

    在IP: 192.168.136.229主机测试ping和ssh登录,均成功

    新葡亰496net 66

        3、string扩展
         检查报文中出现的字符串;

    (六)iptables规则安排的基本原则

    • 任何不允许的访问,应该在请求到达时给予拒绝

    • 规则在链接上的次序即为其检查时的生效次序

    • 基于上述,规则优化

      1. 安全放行所有入站和出站的状态为ESTABLISHED状态连接
      2. 谨慎放行入站的新请求
      3. 有特殊目的限制访问功能,要在放行规则之前加以拒绝
      4. 同类规则(访问同一应用),匹配范围小的放在前面,用于特殊处理
      5. 不同类的规则(访问不同应用),匹配范围大的放在前面
      6. 应该将那些可由一条规则能够描述的多个规则合并为一条
      7. 设置默认策略,建议白名单(只放行特定连接)
      8. 修改默认策略时不建议iptables -P,建议在规则的最后定义规则做为默认策略

          --algo {bm|kmp}(对比字符串的两种算法)
            bm = Boyer-Moore bm算法
            kmp = Knuth-Pratt-Morris kmp算法
          [!] --string {pattern}(从数据头到尾的检查)
          例:
           ~]# iptables -I OUTPUT -m string --algo bm --string 'Google' -j REJECT

    (七)iptables规则的保存和生效

    • 规则有效期限:
      使用iptables命令定义的规则,手动删除之前,其生效期限为kernel存活期限

    • 保存规则至指定的文件:

      • CentOS 6环境
      // 将规则覆盖保存至/etc/sysconfig/iptables文件中
      service iptables save
      // 自动从/etc/sysconfig/iptables重新载入规则
      service iptables start
      
      • CentOS 7环境
      // 规则文件重定向至文件,以下两条命令等效
      iptables -S > /PATH/TO/SOME_RULES_FILE
      iptables-save > /PATH/TO/SOME_RULES_FILE
      // 重新载入预存规则文件中的规则
      iptables-restore < /PATH/FROM/SOME_RULES_FILE
      
      • iptables-restore 选项:
        -n, --noflush:不清除原有规则
        -t, --test:仅分析生成规则集,但不提交
    • 开机自动重载规则文件中的规则:

      • CentOS 6:设置iptables开机启动
        chkconfig --list iptables

      • CentOS 7:在/etc/rc.d/rc.local文件添加规则恢复命令

      vim /etc/rc.d/rc.local
      iptables-restore < /PATH/FROM/IPTABLES_RULES_FILE
      chmod  x /etc/rc.d/rc.local
      

        4、time扩展
         根据报文到达的时间与指定的时间(范围)进行匹配;

    四、网络防火墙

    • iptables/netfilter网络防火墙:

      • 充当网关
      • 使用filter表的FORWARD链
    • 注意的问题:

      • 请求-响应报文均会经由FORWARD链,要注意规则的方向性
      • 如果要启用conntrack机制,建议将双方向的状态为ESTABLISHED的报文直接放行
    • 允许内网(192.168.136.0/24)的主机访问外网(172.18.0.0/16)的ftp, ssh服务,但外网的主机不允许访问内网主机的所有服务

      modprobe nf_conntrack_ftp
      iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
      iptables -A FORWARD -s 192.168.136.0/24 -p tcp --dport 21:22 -j ACCEPT
      iptables -A FORWARD -j REJECT 
      
      • 内网访问外网的ftp, ssh服务均成功

      新葡亰496net 67

      • 外网访问内网的ftp, ssh服务均失败

      新葡亰496net 68

          --datestart 起始日期
          --datestop 结束日期

    五、NAT

          --timestart 起始时间
          --timestop 结束时间

    (一)NAT基本概念

    • NAT:network address translation
      链:PREROUTING,INPUT,OUTPUT,POSTROUTING
      请求报文:修改源/目标IP,由定义如何修改
      响应报文:修改源/目标IP,根据跟踪机制自动实现

    • SNAT:source NAT
      链:POSTROUTING, INPUT
      让本地网络中的主机通过某一特定地址访问外部网络,实现地址伪装
      请求报文:修改源IP

    • DNAT:destination NAT
      链:PREROUTING, OUTPUT
      把本地网络中的主机上的某服务开放给外部网络访问(发布服务和端口映射),但隐藏真实IP
      请求报文:修改目标IP

    • PNAT:port NAT,端口和IP都进行修改,发生在多台本地网络主机的端口冲突时

          --monthdays 起始月份
          --weekdays 起始周
          (可多个选项配合起来,来使用限制条件)
          例:
           ~]# iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.100 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun -j DROP

    (二)SNAT配置:通过net表的target配置

    • SNAT:固定IP
      --to-source [ipaddr[-ipaddr]][:port[-port]]

    • MASQUERADE:动态IP,如拨号网络

    • 实验:通过SNAT实现本地网络主机访问外网,而不会暴露本地网络主机IP

      • 当外网IP为固定IP时
        iptables -t nat -A POSTROUTING -s 192.168.136.0/24 -j SNAT --to-source 172.18.251.164

      • 当外网IP为动态IP时,
        iptables -t nat -A POSTROUTING -s 192.168.136.0/24 -j MASQUERADE

      • 测试:内网主机访问外网服务器http服务
        curl 172.18.250.44
        外网服务器httpd服务日志显示源地址为172.18.251.164,实现了SNAT功能

      新葡亰496net 69

        5、connlimit扩展
         根据每个客户端IP(也可以是地址块)做并发连接数数量匹配;

    (三)DNAT配置:通过net表的target配置

    • 格式:DNAT --to-destination [ipaddr[-ipaddr]][:port[-port]]

    • 实验:实现本地网络主机通过外网的指定网址提供http服务,具体如下:
      外网指定IP:172.18.251.164,内网主机IP:192.168.136.230
      外网IP端口80指向内网主机的80端口,外网IP端口8080指向内网主机的8000端口

      iptables -t nat -A PREROUTING -d 172.18.251.164 -p tcp --dport 80 -j DNAT --to-destination 192.168.136.230:80
      iptables -t nat -A PREROUTING -d 172.18.251.164 -p tcp --dport 8080 -j DNAT --to-destination 192.168.136.230:8000
      
      • 外网主机通过指定外网IP的不同端口成功访问内网主机不同端口提供的http服务

      新葡亰496net 70

      • 内网主机的访问日志,可以看到外网主机IP

      新葡亰496net 71

          --connlimit-above n:连接的数量大于n -j DROP
          --connlimit-upto n: 连接的数量小于等于n

    (四)转发:通过改变目标IP和端口,将接受的包转发至不同地址

    • 格式:REDIRECT --to-ports port[-port]

    • 作用于NAT表,可用于:PREROUTING, OUTPUT, 自定义链

    • 实验:实现将对主机1314,9527端口的访问转发至主机的80端口
      iptables -t nat -A PREROUTING -d 192.168.136.230 -p tcp -m multiport --dports 1314,9527 -j REDIRECT --to-ports 8000

    新葡亰496net 72

          例:

    六、firewalld服务

           ~]# iptables -A INPUT -d 172.16.100.100 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT

    (一)基本概念

        6、limit扩展
         基于收发报文的速率做检查;

    (1)简介
    • firewalld是CentOS 7.0新推出的管理netfilter的工具
    • firewalld是配置和监控防火墙规则的系统守护进程,可以实现iptables,ip6tables,ebtables的功能
    • firewalld服务由firewalld包提供

          令牌桶过滤器:实现令牌算法

    (2)zone:区域
    • firewalld支持划分区域zone,每个zone可以设置独立的防火墙规则
    • 归入zone顺序:
      • 先根据数据包中源地址,将其纳为某个zone
      • 纳为网络接口所属zone
      • 纳入默认zone,默认为public zone,管理员可以改为其它zone
    • 网卡默认属于public zone,lo网络接口属于trusted zone
    • firewalld zone分类
    zone名称 默认配置
    trusted 允许所有流量
    home 拒绝除和传出流量相关的,以及ssh,mdsn,ipp-client,samba-client,dhcpv6-client预定义服务之外其它所有传入流量
    internal 和home相同
    work 拒绝除和传出流量相关的,以及ssh,ipp-client,dhcpv6-client预定义服务之外的其它所有传入流量
    public 拒绝除和传出流量相关的,以及ssh,dhcpv6-client预定义服务之外的其它所有传入流量,新加的网卡默认属于publiczone
    external 拒绝除和传出流量相关的,以及ssh预定义服务之外的其它所有传入流量,属于external zone的传出ipv4流量的源地址将被伪装为传出网卡的地址。
    dmz 拒绝除和传出流量相关的,以及ssh预定义服务之外的其它所有传入流量
    block 拒绝除和传出流量相关的所有传入流量
    drop 拒绝除和传出流量相关的所有传入流量(甚至不以ICMP错误进行回应)

          --limit rate[/second|/minute|/hour|/day]
          --limit-burst number(峰值个数)
          例:
           ~]# iptables -A INPUT -d 172.16.100.100 -p icmp --icmp-type 8 -m limit --limit 3/minute --limit-burst 5 -j ACCEPT #前五个不限制,超过后每分钟只响应三个
           ~]# iptables -A INPUT 2 -p icmp -j REJECT

    (二)firewalld配置

    • firewall-cmd --get-services 查看预定义服务列表
    • /usr/lib/firewalld/services/*.xml预定义服务的配置

        7、state扩展
         根据连接追踪机制检查连接的状态;

    (1)三种配置方法
    • firewall-config:图形工具(firewall-config包)
    • firewall-cmd:命令行工具(firewalld包)
    • /etc/firewalld:配置文件,一般不建议

          调整连接追踪功能所能够容纳的最大连接数量:
          /proc/sys/net/nf_conntrack_max

    (2)firewall-cmd 命令选项
    • --get-zones
      列出所有可用区域
    • --get-default-zone
      查询默认区域
    • --set-default-zone=<ZONE>
      设置默认区域
    • --get-active-zones
      列出当前正使用的区域
    • --add-source=<CIDR> [--zone=<ZONE>]
      添加源地址的流量到指定区域,如果无--zone= 选项,使用默认区域
    • --remove-source=<CIDR> [--zone=<ZONE>]
      从指定区域中删除源地址的流量,如果无--zone= 选项,使用默认区域
    • --add-interface=<INTERFACE> [--zone=<ZONE>]
      添加来自于指定接口的流量到特定区域,如果无--zone= 选项,使用默认区域
    • --change-interface=<INTERFACE> [--zone=<ZONE>]
      改变指定接口至新的区域,如果无--zone= 选项,使用默认区域
    • --list-all [--zone=<ZONE>]
      列出指定区域的所有配置信息,包括接口、源地址、端口、服务等,如果无--zone= 选项,使用默认区域
    • --add-service=<SERVICE> [--zone=<ZONE>]
      允许服务的流量通过,如果无--zone= 选项,使用默认区域
    • --add-port=<PORT/PROTOCOL> [--zone=<ZONE>]
      允许指定端口和协议的流量,如果无--zone= 选项,使用默认区域
    • --remove-service=<SERVICE> [--zone=<ZONE>]
      从区域中删除指定服务,禁止该服务流量,如果无--zone= 选项,使用默认区域
    • --remove-port=<PORT/PROTOCOL> [--zone=<ZONE>]
      从区域中删除指定端口和协议,禁止该端口的流量,如果无--zone= 选项,使用默认区域
    • --reload
      删除当前运行时配置,应用加载永久配置
    • 示例:
    // 查看默认zone
    firewall-cmd --get-default-zone
    // 默认zone设为dmz
    firewall-cmd --set-default-zone=dmz
    // 在internalzone中增加源地址192.168.0.0/24的永久规则
    firewall-cmd --permanent --zone=internal --add-source=192.168.0.0/24
    // 在internalzone中增加协议mysql的永久规则
    firewall-cmd --permanent --zone=internal --add-service=mysql
    // 加载新规则以生效
    firewall-cmd --reload
    

          已经追踪到并记录下的连接:
          /proc/net/nf_conntrack

    (三)rich规则

    • 当基本firewalld语法规则不能满足要求时,可以使用以下更复杂的规则
      • rich-rules:富规则,功能强,表达性语言
      • direct configuration rules:直接规则,灵活性差
        帮助:man 5 firewalld.direct

          定义不同协议或连接类型追的时长:
          /proc/sys/net/netfilter/

    (1)rich规则简介
    • rich规则比基本的firewalld语法实现更强的功能,不仅实现允许/拒绝,还可以实现日志syslog和auditd,也可以实现端口转发,伪装和限制速率
    • rich语法:
    rule
    [source]
    [destination]
    service|port|protocol|icmp-block|masquerade|forward-port
    [log]
    [audit]
    [accept|reject|drop]
    
    • man 5 firewalld.richlanguage

        可追踪的连接状态:
        1、NEW:新发出的请求;连接追踪的记录文件中不存此连接相关的信息条目,因此,将其识别为第一次发出的请求;
        2、ESTABLISHED:NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信的状态;
        3、RELATED:相关的连接;如ftp协议的命令连接与数据连接之间的关系;
        4、INVALIED:无法识别的连接;
        例:
         --state STATE1,STATE2,...

    (2)rich规则生效顺序
    • 该区域的端口转发,伪造规则
    • 该区域的日志规则
    • 该区域的允许规则
    • 该区域的拒绝规则
    • 每个匹配的规则生效,所有规则都不匹配,该区域默认规则生效

           ~]# iptables -A INPUT -d 172.16.100.100 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT
           ~]# iptables -A OUTPUT -s 172.16.100.100 -p tcp -m multiport --sports 22,80 -m state --state ESTABLISHED -j ACCEPT

    (3)rich规则选项
    • --add-rich-rule='<RULE>'
      添加rich规则至指定zone,若未指明zone则为默认zone
    • --remove-rich-rule='<RULE>'
      从指定zone删除rich规则,若未指明zone则为默认zone
    • --query-rich-rule='<RULE>'
      查询指定zone中是否有RULE规则,若未指定zone则为默认zone
      返回值0代表存在,返回值1代表不存在
    • --list-rich-rules
      列出指定zone的所有rich规则,若未指定zone则为默认zone
    • 示例:
    // 拒绝从192.168.0.11的所有流量,当address选项使用source或destination时,必须用family=ipv4|ipv6.
    firewall-cmd --zone=classroom --add-rich-rule='rule family=ipv4 source address=192.168.0.11/32 reject'
    // 限制每分钟只有两个连接到ftp服务
    firewall-cmd --add-rich-rule='rule service name=ftp limit value=2/m accept'
    // 抛弃esp(IPsec 体系中的一种主要协议)协议的所有数据包
    firewall-cmd --add-rich-rule='rule protocol value=esp drop'
    // 接受所有192.168.1.0/24子网端口范围7900-7905的TCP流量
    firewall-cmd --zone=vnc --add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 port port=7900-7905 protocol=tcp accept'
    

        

    (4)rich日志规则
    • log [prefix="<PREFIX TEXT>" [level=<LOGLEVEL>] [limit value="<RATE/DURATION>"]

      • <LOGLEVEL>
        可以是emerg, alert, crit, error, warning, notice, info, debug
      • <DURATION>
        s:秒,m:分钟,h:小时,d:天
    • audit [limit value="<RATE/DURATION>"]

    • 示例:
      接受ssh新连接,记录日志到syslog的notice级别,每分钟最多三条信息
      firewall-cmd --zone=work --add-rich-rule='rule service name="ssh" log prefix="ssh" level="notice" limit value="3/m" accept

     

    (5)伪造和端口转发
    • NAT网络地址转换,firewalld支持伪造和端口转发两种NAT方式

    • 伪造NAT

      • 格式:firewall-cmd --zone=<ZONE> --add-masquerade
      • 示例:将来自192.168.0.0/24网段的IP伪造为外网动态IP
        firewall-cmd --zone=public --add-rich-rule='rule family=ipv4 source address=192.168.0.0/24 masquerade'
    • 端口转发:将发往本机的特定端口的流量转发到本机或不同机器的另一个端口。通常要配合地址伪造才能实现

      • 格式:firewall-cmd --zone=<ZONE> --add-forward-port=port=<PORTNUMBER>:proto=<PROTOCOL>[:toport=<PORTNUMBER>][:toaddr=<IPADDR>]
        说明:toport=和toaddr=至少要指定一个
      • 示例:
        转发传入的连接513/TCP,到访火墙的132/TCP到public zone 的192.168.0.254
        firewall-cmd --zone=public --add-forward-port=port=513:proto=tcp:toport=132:toaddr= 192.168.0.254
    • rich规则语法:

      • 格式:forward-port port=<PORTNUM> protocol=tcp|udp [to-port=<PORTNUM>] [to-addr=<ADDRESS>]
      • 示例:
        转发从192.168.0.0/26来的,发往80/TCP的流量到防火墙的端口8080/TCP
        firewall-cmd --zone=work --add-rich-rule='rule family=ipv4 source address=192.168.0.0/26 forward-port port=80 protocol=tcp to-port=8080'

    本文由新葡亰496net发布于电脑系统,转载请注明出处:新葡亰496net:防火墙设置

    关键词: