iptables

iptables

  • 包过滤型的防火墙

  • Firewall:防火墙,隔离工具;工作于主机或网络边缘,对于进出本主机或本网络的报文根据事先定义的检查规则作匹配检测,对于能够被规则匹配到的报文作出相应处理的组件;

    • 主机防火墙
      网络防火墙

    • 软件防火墙(软件逻辑)
      硬件防火墙(硬件和软件逻辑)

  • 版本

    • ipfw (firewall framework):命令行工具,生成规则并送往内核
    • ipchains (firewall framework):生成规则
    • iptables(netfilter)

      • iptables:rules until,位于用户空间的通用规则编写工工具
      • netfilter:工作在kernel

        • hook function(钩子函数)
          input
          output
          forward
          prerouting
          postrouting
  • iptables的链:内置链和自定义链

    • 内置链:对应于hook function

      • PREROUTING
        INPUT
        FORWARD
        OUTPUT
        POSTROUTING
    • 自定义链接:用于内置链的扩展和补充,可实现更灵活的规则管理机制;被内置链调用
  • 功能:

    • filter:过滤,防火墙;
      nat:network address translation;用于修改源IP或目标IP,也可以改端口;
      mangle:拆解报文,做出修改,并重新封装起来;修改除源地址、目标地址以外的其他属性;LVS会使用到;
      raw:关闭nat表上启用的连接追踪机制;
  • 功能<–>链:

    • 在同一链上的不同功能生效的顺序,由其功能的优先级决定:raw > mangle > ant > filter
    • raw:PREROUTING, OUTPUT
      mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
      nat:PREROUTING,[INPUT,]OUTPUT,POSTROUTING
      filter:INPUT,FORWARD,OUTPUT
  • 报文流向:

    • 流入本机:PREROUTING –> INPUT
      由本机流出:OUTPUT –> POSTROUTING
      转发:PREROUTING –> FORWARD –> POSTROUTING
  • 路由功能发生的时刻:

    • 报文进入本机后:PREROUTING之后;
      判断目标主机是?
      报文离开本机之前:POSTROUTING之前
      判断经由哪个接口送往下一站?
  • 规则:

    • 组成部分:根据规则匹配条件来尝试匹配报文,一旦匹配成功,就由规则定义的处理动作作出处理;

      • 匹配条件:

        • 基本匹配条件
          扩展匹配条件
      • 处理动作:

        • 基本处理动作
          扩展处理动作
          自定义处理机制
  • 添加规则时的考量点:

    • 通过要实现哪种功能:判断添加到哪个表上;
    • 通过报文流经的路径:判断添加到哪个链上;

    • 链:链上的规则次序,即为检查的次序;因此,隐含一定的应用法则:

      1. 同类规则(访问同一应用),匹配范围小的放上面;
      2. 不同类的规则(访问不同应用),匹配到报文频率较大的放在上面;
      3. 将那些可由一条规则描述的多个规则合并起来;
      4. 设置默认策略;使用白名单机制;

        1. 不建议使用:iptables -P
        2. 在规则的最后定义规则作为默认策略;
      5. 同为放行规则时,允许的规则,匹配范围大的放上面
      6. 同为放行规则时,拒绝的规则,把匹配范围小的放上面

iptables

  • iptables启动与配置

    • CentOS 6:

      • service iptables {start|stop|restart|status}

        • start:读取事先保存的规则,并应用到netfilter上;
          stop:清空netfilter上的规则,以及还原默认策略等;
          status:显示生效的规则;
          restart:清空netfilter上的规则,再读取事先保存的规则,并应用到netfilter上;
      • 默认的规则文件:/etc/sysconfig/iptables

      • checkconfig iptables on|off;开机是否启动

    • CentOS 7:

      • systemctl start|stop|restart|status firewalld.service

      • systemctl disable firewalld.service

      • systemctl stop firewalld.service

  • 命令选项

    iptables [-t table] {-A|-C|-D} chain rule-specification
    
      iptables [-t table] -I chain [rulenum] rule-specification
    
      iptables [-t table] -R chain rulenum rule-specification
    
      iptables [-t table] -D chain rulenum
    
      iptables [-t table] -S [chain [rulenum]]
    
      iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
    
      iptables [-t table] -N chain
    
      iptables [-t table] -X  [chain]
    
      iptables [-t table] -P chain target
    
      iptables [-t table] -E old-chain-name new-chain-name
    
      注释性选项:
      rule-specification = [matches...]  [target]
    
      match = -m matchname [per-match-options]
    
      target = -j targetname [per-target-options]
  • 规则格式:

    iptables   [-t table]   COMMAND   chain   [-m matchname [per-match-options]]   -j targetname [per-target-options]`
    • -t table:
      raw, mangle, nat, [filter]

    • COMMAND:如何管理chain的命令

      • 链管理:

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

        • -A:append,追加;
        • -I:insert, 插入,要指明位置,省略时表示第一条;
        • -D:delete,删除;

          1. 指明规则序号;
          2. 指明规则本身;
        • -R:replace,替换指定链上的指定规则;
        • -F:flush,清空指定的规则链;
        • -Z:zero,置零;
          iptables的每条规则都有两个计数器:

          1. 匹配到的报文的个数;pkts
          2. 匹配到的所有报文的大小之和;bytes
      • 查看:

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

          • -n:numberic,以数字格式显示地址和端口号;
            -v:verbose,详细信息;-vv, -vvv
            -x:exactly,显示计数器结果的精确值;
            –line-numbers:显示规则的序号;
    • chain:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

    • 匹配条件:-m matchname [per-match-optinons]

      • 基本匹配条件:无需加载任何模块,由iptables/netfilter自行提供;
        [!] -s, –source address[/mask][,…]:检查报文中的源IP地址是否符合此处指定的地址或范围;
        [!] -d, –destination address[/mask][,…]:检查报文中的目标IP地址是否符合此处指定的地址或范围;
        [!] -p, –protocol protocol (/etc/protocols中的协议名)

        protocol: tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh or  "all"
              主要讲:{tcp|udp|icmp}

        [!] -i, –in-interface name:数据报文流入的接口;只能应用于数据报文流入的环节,只能应用于PREROUTING,INPUT和FORWARD链;
        [!] -o, –out-interface name:数据报文流出的接口;只能应用于数据报文流出的环节,只能应用于FORWARD、OUTPUT和POSTROUTING链;

      • 扩展匹配条件: 需要加载扩展模块,方可生效;

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

          • tcp:

            [!] --source-port, --sport port[:port]:匹配报文的源端口;可以是端口范围;
            [!] --destination-port,--dport port[:port]:匹配报文的目标端口;可以是端口范围;
            [!] --tcp-flags  mask  comp
              mask is the flags which we should examine,  written as a comma-separated list,例如 SYN,ACK,FIN,RST
              comp is a comma-separated list  of  flags  which must be set,例如SYN
              例如:“--tcp-flags  SYN,ACK,FIN,RST  SYN”表示,要检查的标志位为SYN,ACK,FIN,RST四个,其中SYN必须为1,余下的必须为0;
            [!] --syn:用于匹配第一次握手,相当于”--tcp-flags  SYN,ACK,FIN,RST  SYN“;
          • udp

            [!] --source-port, --sport port[:port]:匹配报文的源端口;可以是端口范围;
            [!] --destination-port,--dport port[:port]:匹配报文的目标端口;可以是端口范围;
          • icmp

            [!] --icmp-type {type[/code]|typename}
                  echo-request:8   (ping请求)
                      ~]# iptables -A INPUT -d 172.16.100.67 -p icmp --icmp-type 8 -j DROP    自己可以ping其他主机,其他主机ping不了自己
                  echo-reply:0        (ping回应)
        • 显式扩展:必须显式地指明使用的扩展模块进行的扩展;[-m matchname [per-match-options]];

          • 使用帮助

            • CentOS 6:man iptables
            • CentOS 7:man iptables-extensions
          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 172.16.0.0/16 -d 172.16.100.67 -p tcp -m multiport –dports 22,80 -j ACCEPT

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

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

            ~]# iptables -A INPUT -d 172.16.100.67 -p tcp –dport 80 -m iprange –src-range 172.16.100.5-172.16.100.10 -j DROP

          3. string扩展
            对报文中的应用层数据做字符串模式匹配检测;对明文编码的协议生效;

            --algo {bm|kmp}:字符串匹配检测算法;
                 bm:Boyer-Moore
                 kmp:Knuth-Pratt-Morris
             [!] --string pattern:要检测的字符串模式;
             [!] --hex-string pattern:要检测的字符串模式,16进制格式;

            ~]# iptables -A OUTPUT -s 172.16.100.67 -d 172.16.0.0/16 -p tcp –sport 80 -m string –algo bm –string “gay” -j REJECT

          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...]
            
             --kerneltz:使用内核上的时区,而非默认的UTC;

            ~]# iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.67 -p tcp –dport 80 -m time –timestart 14:30 –timestop 18:30 –weekdays Sat,Sun –kerneltz -j DROP

          5. connlimit扩展(连接限制)
            根据每客户端IP做并发连接数数量匹配;

            --connlimit-upto n:连接的数量小于等于n时匹配;
             --connlimit-above n:连接的数量大于n时匹配;
                 使用时,根据默认策略是允许还是拒绝使用

            ~]# iptables -A INPUT -d 172.16.100.67 -p tcp –dport 21 -m connlimit –connlimit-above 2 -j REJECT

          6. limit扩展
            基于收发报文的速率做匹配;
            采用令牌桶过滤器;

            --limit rate[/second|/minute|/hour|/day]        平均速率
             --limit-burst number            峰值数量

            ~]# iptables -I INPUT -d 172.16.100.67 -p icmp –icmp-type 8 -m limit –limit 3/minute –limit-burst 5 -j ACCEPT
            ~]# iptables -I INPUT 2 -p icmp -j REJECT

          7. state扩展

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

              • 在内核的内存空间当中,把每一个请求的连接和本机出去的连接,彼此之间通过模板建立起关联关系,从而能够追踪来本机访问的每一个客户端和本机响应的每一个响应报文或响应链接,它们二者之间有什么关系;
            • conntrack机制:追踪本机上的请求和响应之间的关系;因此,能使得对所有请求报文的响应能够定义的状态,有如下几种:

              • NEW:新发出请求;连接追踪模板中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求;
              • ESTABLISHED:NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信状态;
              • RELATED:相关联的连接;如ftp协议中的数据连接与命令连接之间的关系;
              • INVALID:无效的连接;
              • UNTRACKED:未进行追踪的连接;
            • [!] –state state

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

              ~]#  iptables -A INPUT -d 172.16.100.67 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT
              ~]# iptables -A OUTPUT -s 172.16.100.67 -p tcp -m multiport --sports 22,80 -m state --state ESTABLISHED -j ACCEPT
            • 调整连接追踪功能所能够容纳的最大连接数量:

              /proc/sys/net/nf_contrack_max
            • 已经追踪到到的并记录下来的连接:

              /proc/net/nf_conntrack
            • 不同协议的连接追踪时长

              /proc/sys/net/netfilter/
            • iptables的链接跟踪表最大容量为/proc/sys/net/ipv4/ip_conntrack_max,链接碰到各种状态的超时后就会从表中删除;当模板满载时,后续的连接可能会超时

              • 方法一:
                加大nf_conntrack_max 值

                vi /etc/sysctl.conf
                net.ipv4.nf_conntrack_max = 393216
                net.ipv4.netfilter.nf_conntrack_max = 393216
              • 方法二:
                降低 nf_conntrack timeout时间,越少就会越快的腾出空间

                vi /etc/sysctl.conf        
                net.ipv4.netfilter.nf_conntrack_tcp_timeout_established = 300             
                net.ipv4.netfilter.nf_conntrack_tcp_timeout_time_wait = 120    
                net.ipv4.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
                net.ipv4.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
    • 处理动作:-j targetname [per-target-options]

      • ACCEPT:接受
        DROP:丢弃
        REJECT:拒绝
        RETURN:返回调用链;
        REDIRECT:端口重定向;
        LOG:记录日志;
        MARK:做防火墙标记;
        DNAT:目标地址转换;
        SNAT:源地址转换;
        MASQUERADE:地址伪装;

        自定义链
      • Target:

        • ACCEPT, DROP, REJECT, RETURN
        • LOG, SNAT, DNAT, REDIRECT, MASQUERADE,…

          LOG:既不做拒绝,也不做允许,只是做日志
            --log-level level 指明日志级别
            --log-prefix prefix 日志前缀
  • 如何使用自定义链:

    • 自定义链:需要被调用才能生效;自定义链最后需要定义返回规则;

    • 返回规则使用的target叫做RETURN;

    • 被调用后的自定义链,不可再被重新引用、重新命名、删除,除非清空规则并解除引用,

      添加自定义链:
        [root@station77 ~]# iptables -N icmp
        [root@station77 ~]# iptables -L -n
        Chain icmp (0 references)
        target     prot opt source               destination 
      重命名:引用次数为0,是可以直接重命名的
        [root@station77 ~]# iptables -E icmp in-icmp
        [root@station77 ~]# iptables -L -n
        Chain in-icmp (0 references)
        target     prot opt source               destination            
      向自定义链中添加规则:
        [root@station77 ~]# iptables -A in-icmp -d 172.16.251.77 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT
        [root@station77 ~]# iptables -L -n
        Chain in-icmp (0 references)
        target     prot opt source               destination         
        ACCEPT     icmp --  0.0.0.0/0            172.16.251.77        icmptype 8 state NEW
      调用链:
        在INPUT上附加规则
            iptables -A INPUT -j in-icmp 
      如果匹配不到,返回主链
        iptables -A in-icmp -j RETURN
  • 规则的有效期限

    • 使用iptables命令定义的规则,手动删除之前,其生效期限为kernel存活期限;kernel如果不重启,其一直有效;

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

      CentOS 6:
            ~]# service  iptables  save   
            将规则保存至/etc/sysconfig/iptables文件中;如果iptables设置开机启动,则开机时会读取此文件;
      
            ~]# iptables-save  >  /PATH/TO/SOME_RULES_FILE
      
        CentOS 7:
            ~]# iptables-save  >  /PATH/TO/SOME_RULES_FILE
    • 重新载入预存规则文件中规则:

      CentOS 7:
            ~]# iptables-restore <  /PATH/FROM/SOME_RULES_FILE
      
        CentOS 6:
            ~]# service  iptables  restart
    • 自动生效规则文件中的规则:

      1. 用脚本保存各iptables命令;让此脚本开机后自动运行;

        /etc/rc.d/rc.local文件中添加脚本路径;
             /PATH/TO/SOME_SCRIPT_FILE
      2. 用规则文件保存各规则,开机时自动载入此规则文件中的规则;

        /etc/rc.d/rc.local文件添加:
              iptables-restore < /PATH/FROM/IPTABLES_RULES_FILE
    • CentOS 7:
      引入了新的iptables前端管理工具firewalld,其管理工具有:firewalld-cmd, firewalld-config
  • iptables/netfilter网络防火墙:

    1. 网关;
    2. filter表的FORWARD链;
    • 要注意的问题:

      1. 请求-响应报文均会经由FORWARD链,要注意规则的方向性;
      2. 如果要启用conntrack机制,建议将双方向的状态为ESTABLISHED的报文直接放行;
    • NAT: Network Address Translation

      • 请求报文:由管理员定义;

        • 改源地址:SNAT,MASQUERADE
          改目标地址:DNAT
      • 响应报文:由NAT的conntrack机制自动实现;
    • NAT定义在nat表;PREROUTING,INPUT,OUTPUT,POSTROUTING

      • SNAT:POSTROUTING
        DNAT:PREROUTING
        PAT
    • target:

      • SNAT:
        This target is only valid in the nat table, in the POSTROUTING and INPUT chains, and user-defined chains which are only called from those chains.

        --to-source [ipaddr[-ipaddr]]
      • DNAT:
        This target is only valid in the nat table, in the PREROUTING and OUTPUT chains, and user-defined chains which are only called from those chains.

        --to-destination [ipaddr[-ipaddr]][:port[-port]]
      • MASQUERADE
        This target is only valid in the nat table, in the POSTROUTING chain. It should only be used with dynamically assigned IP (dialup) connections: if you have a static IP address, you should use the SNAT target.

        SNAT场景中应用于POSTROUTING链上的规则实现源地址转换,但外网地址不固定时,使用此target;

      • REDIRECT
        This target is only valid in the nat table, in the PREROUTING and OUTPUT chains, and user-defined chains which are only called from those chains.

        --to-ports port[-port]

原创文章,作者:s,如若转载,请注明出处:http://www.178linux.com/77999

(0)
上一篇 2017-06-13 11:34
下一篇 2017-06-13 11:36

相关推荐

  • Linux Sysadmin–part1

    一、创建一个10G分区,并格式为ext4文件系统; 1、要求其block大小为2048,预留空间百分比为2,卷标为MYDATA,默认挂载属性包含acl; 2、挂载至/data/mydata目录,要求挂载时禁止程序自动运行,且不更新文件的访问时间戳; ###创建10G分区 ~]# fdisk /dev/sdb Command (m for help): n P…

    2017-09-04
  • linux中用ACL实现灵活的权限管理

    ACL是什么?? ACL英文原意是Access Control List(访问控制列表).它能够实现灵活的权限管理,除了文件的所有者,所属组和其他人,设置相应的权限外,ACL允许你给任何用户或是用户组设置任何文件/目录的访问权限(注意的是有些不支持数字模式的权限给定) ACL有什么用?? 作为UGO权限管理的补充,acl有GUO办不到或者是难以办到的功能 &…

    Linux干货 2016-08-05
  • mysql主从复制及zabbix监控从服务器

    Mysql备份: 备份系统的构建,要注意的要点: 第一:能容忍最多丢失多少数据; 第二:恢复数据需要在多长时间内完成; 第三:需要恢复哪些数据:备份时要考虑备份完整; (1)必须做还原测试,用于测试备份的可用性; (2)还原演练;不是一个人能够完成的; 备份类型: 完全备份:就是备份整个数据集,是从时间轴上划分的,完整数据集;; 部分备份:只备份数据子集; …

    Linux干货 2016-12-05
  • 学习Linux,记得有困难,找“男人”。

      对于Linux初学者而言,较短时间内需要涉及到几十个命令,而且每个命令还可辅以短选项、长选项…让初学者在实践时苦不堪言。   一头雾水时,请找Super"man"!  "man"的使用非常简单,命令行直接输入man COMMAND,如#man ls。此处的COMMAND均指…

    Linux干货 2016-01-15
  • 第三周作业

      1. who |cut -d ” ” -f1|uniq 2.who |head -1 3.cat /etc/passwd | cut -d: -f7|uniq -c |sort -n|tail -1|grep -o “/[[:alnum:]].*” 4. cat /etc/passwd |sort…

    2017-12-16