• DNS服务器安全之通过ipset对DNS异常解析流量的源IP地址进行管控


    ipset介绍

    ipset是iptables的扩展,它允许你创建 匹配整个地址集合的规则。而不像普通的iptables链只能单IP匹配, ip集合存储在带索引的数据结构中,这种结构即时集合比较大也可以进行高效的查找,除了一些常用的情况,比如阻止一些危险主机访问本机,从而减少系统资源占用或网络拥塞,IPsets也具备一些新防火墙设计方法,并简化了配置.官网:http://ipset.netfilter.org/

    ipset配置步骤

    一、安装ipset

    yum -y install ipset
    

    二、创建ipset规则

    ipset create blacklist hash:net
    ipset create whitelist hash:net
    

    三、添加黑/白名单IP

    ipset add blacklist 192.168.0.1
    ipset add whitelist 192.168.0.2
    ipset add blacklist 192.168.0.0/24
    

    四、ipset默认存储位置,以及保存

    /etc/sysconfig/ipset
    

    如果需要保存到其他路径,使用如下命令

    ipset save -f /opt/ipset.conf
    

    五、关联ipset和iptables

    iptables -I INPUT -m set --match-set blacklist src -j DROP -m comment --comment "Reject from blacklist"
    iptables -I INPUT -m set --match-set whitelist src -j ACCEPT -m comment --comment "Allow from whitelist"
    

    六、保存iptables规则

    service iptables save
    

    实现自动化的添加ip黑名单

    通过脚本自动化的从query.log筛选出异常的IP地址并加入到ipset的blacklist中

    #!/bin/bash
    # query log location
    query_location='/var/named/data/query.log'
    # Get the time 2s before the current time.
    date_time=$(date +%H:%M:%S -d '-2 Seconds')
    printf "The IP traffic statistics time point is %s\n" $date_time
    # Get the ip access count list at the current time in the dns query log, and display the corresponding information, such as: total number, ip number, maximum access ip.
    num_list=`grep $date_time $query_location | awk -F '[ #]' '{print $5}' | sort | uniq -c | awk '{print $1}' | sort -n`
    total_num=0
    for n in $num_list
    do
      total_num=`echo "$total_num+$n" | bc`
    done
    printf "The total number of queries in 1 second is %s\n" $total_num
    max_num=`echo $num_list | awk '{print $NF}' -`
    max_num_ip=`grep $date_time $query_location | awk -F '[ #]' '{print $5}' | sort | uniq -c | grep $max_num | awk '{print $2}'`
    printf "The highest queried IP is:\n%s\nThe total amount of queries is: %s\n" "$max_num_ip" $max_num
    if [ "$max_num" -lt "100" ]
    then
      echo "There is no ip address for the exception query!"
    else
      ipset list
      for l in $num_list
      do
        if [ "$l" -ge "100" ]
        then
          ip_stop=`grep $date_time $query_location | awk -F '[ #]'  '{print $5}' | sort | uniq -c | grep $l | awk '{print $2}'`
          echo $ip_stop
          ipset add blacklist $ip_stop
        fi
      done
      ipset list
      echo "IPs with more than 100 ips have been blacklisted!"
    fi
    

    再添加cron任务即可。

    至此,DNS异常IP的ipset配置已经完成。

    本文来自博客园,作者:sunnydoy,转载请注明原文链接:https://www.cnblogs.com/sunnydou/p/15062618.html

  • 相关阅读:
    oracle 数据库、实例、服务名、SID
    查看oracle数据库服务器的名字
    oracle表复制
    Oracle 备份、恢复单表或多表数据步骤
    如何查询一个表中有哪些列全为空
    mysql当查询某字段结果为空并赋值
    NoSQL初探之人人都爱Redis:(1)Redis简介与简单安装
    《大型网站技术架构》读书笔记四:瞬时响应之网站的高性能架构
    《大型网站技术架构》读书笔记三:大型网站核心架构要素
    《大型网站技术架构》读书笔记二:大型网站架构模式
  • 原文地址:https://www.cnblogs.com/sunnydou/p/15062618.html
Copyright © 2020-2023  润新知