批量屏蔽符合条件的IP地址,支持添加白名单,IP段,增量

大概的思路是利用sh,从日志中提取出来对应的IP地址,然后再交由python进行对比,判断,最终将需要添加至iptables列表中的IP写入到一个文件中,然后再由sh进行写入到iptables中

#!/bin/sh

tmpmaillog="/usr/local/*/test/tmpmaillog"
sortiptmp="/usr/local/*/test/sortiptmp"
iptableslist="/usr/local/*/test/iptableslist"
ipbankip="/usr/local/*/test/ipbank"
ipwhite="/usr/local/*/test/ipwhite" #printlog 函数说明
#两个参数,一,是否打印日志,二,日志内容
#一可选,0,1,0表示不打印日志内容出来,1表示打印日志内容出来
LOGFILE_PATH="/var/log/ipbanklog"
NOWTIME=`date "+%Y-%m-%d %H:%M:%S"`
function printlog()
{
    LOG_CONTENT="$NOWTIME $2"
    #echo $LOG_CONTENT
    if [ $1 -ne 0 ]; then
        echo $LOG_CONTENT
        echo $LOG_CONTENT>>$LOGFILE_PATH
    else
        echo $LOG_CONTENT>>$LOGFILE_PATH
    fi  
} #检查上一条命令执行是否正常,不正常退出
check_error_exit()
{
    #echo $?"+++++++++++"
    RUSELT=$?
    if [ ${RUSELT} -ne 0 ]; then
        printlog 1 "#[ERROR] >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
        printlog 1 "#[ERROR] 恭喜,光荣而伟大的报错了 : "$1
        printlog 1 "#[ERROR] <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"
        exit 1
    fi  
} #输出颜色字体
function echo_colour()
{
    if [ $1 -eq 0 ]; then
        echo -e "\033[41;37m ${2} \033[0m"
        return 0
    fi     if [ $1 -eq 1 ]; then
        echo -e "\033[43;37m ${2} \033[0m"
        return 0
    fi     if [ $1 -eq 2 ]; then
        echo -e "\033[47;30m ${2} \033[0m"
        return 0
    fi
} #输出使用方法
output_usage()
{
    echo "-----------处理机制----------------"
    echo "#1.shell根据条件提取指定日志中内容"
    echo "#2.python进行对比iptables与白名单文件"
    echo "#3.shell进行添加至ip防火墙中"
    echo "--------------------------------"
    echo -e "\n"
    echo "-----------使用步骤-----------"
    echo "#在/usr/local/*/目录中建一个test的目录,然后将ipbank.py与ipbank.sh的文件进到test的目录中"
    echo -e "\033[41;37m#找到start_run函数中备注的需要编辑下面的这条语句,编辑为你自已需要提取的日志内容 \033[0m"
    echo "#然后可以再手动运行一下#sh ipbank.sh即可"
    echo "#如果需要自动运行的话,可以添加至crontab中,格式如下:"
    echo "#*/5 * * * * /bin/sh /usr/local/*/test/ipbank.sh start"
    echo "------------------------------"
    echo -e "\n"
    echo "------------使用参数--------------"
    echo "#sh ipbank.sh start     -----运行"
    echo "#sh ipbank.sh help      -----打印帮助"
    echo "----------------------------------"
} #打印结束符
print_end()
{
    printlog 1 "<<<<<<<<<<<<<<<<<<<<<<END<<<<<<<<<<<<<<<<<<<<<<<<<<"
} start_run()
{
    printlog 1 ">>>>>>>>>>>>>>>>>>>>>>>>>>Start>>>>>>>>>>>>>>>>>>>>>>>>>>"     #需要编辑下面的这条语句
    #############################
    cat /usr/local/*/app/log/authenticator.log|grep 'none'>${tmpmaillog}
    #############################     check_error_exit "提取日志异常,请检查上面的提取日志命令是否正常"     ip_regex="[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}"
    cat ${tmpmaillog}| egrep -o $ip_regex|sort|uniq -c>${sortiptmp}
    /sbin/iptables -L -n|grep 'DROP'|awk '{print $4}'>${iptableslist}     /usr/local/*/app/engine/bin/python /usr/local/*/test/ipbank.py 3 $ipwhite $sortiptmp $iptableslist $ipbankip     printlog 0 "Start_IP_to_iptables_DROP"
    for ipone in `cat $ipbankip`
    do
        #echo $ipone
        printlog 0 $ipone
        /sbin/iptables -I INPUT -s $ipone -j DROP
    done
    printlog 0 "Success Add `wc -l $ipbankip` IP Iptables."
    print_end
} _RET_VAL=0
case "$1" in
    "start")
        start_run ;
        ;;
    "help")
        output_usage ;
        _RET_VAL=$? ;
        ;;
    *)
        output_usage ;
        _RET_VAL=1 ;
        ;;
esac exit $_RET_VAL
#coding: utf-8

import sys

def ipban(num,ipWhiteFile,sortiptmpfile,iptableslistfile,ipbankipfile):
try:
num=int(num)
addiplist=[]
whiteiplist=[]
whitenetworklist=[]
iptableslist=[]
white_dict = {} #读取白名单文件,生成需要屏蔽的IP列表与网段列表
for ln in file(ipWhiteFile,"r"):
(value,key)=ln.strip().split()
white_dict[key] = value for k,v in white_dict.items():
#print k,v
if v in "ip":
whiteiplist.append(k)
#whiteiplist.extend(white_dict[k])
#print k
else:
whitenetworklist.append(k) #根据排序好的IP列表,过滤少于多少次的IP,并且排除白名单IP,最终生成需要添加的IP地址
fsort=open(sortiptmpfile,"r")
for line in fsort.readlines():
linelist=line.split()
if int(linelist[0])>num:
if linelist[1] not in whiteiplist:
addiplist.append(linelist[1])
fsort.close() #删除指定的IP段IP
endlist=[]
for addone in addiplist:
for whitenetworkone in whitenetworklist:
if whitenetworkone in addone:
endlist.append(addone)
break
addip=list(set(addiplist).difference(set(endlist))) #读取现有的iptables屏蔽的IP,生成列表
for iptabone in file(iptableslistfile,"r"):
iptableslist.extend(iptabone.strip().split()) #将iptables屏蔽的IP,从排序好的IP列表中删除掉
addip=list(set(addip).difference(set(iptableslist)))
#将最终需要屏蔽的IP列表写到白名单文件列表中
writeipadd=file(ipbankipfile,"w")
for ipone in addip:
writeipadd.write(ipone)
writeipadd.write("\n")
writeipadd.close() print "Success:%s" %(len(addip))
except:
print "Error"
help() def help():
print "-"*30+"Help"+"-"*30
print sys.argv[0]+"\t[num]"+"\t[ipWhiteFile]"+"\t[sortiptmp]"+"\t[iptableslist]"+"\t[ipbankip]"
print "\n"
print "##num:\t\t---跳过少于多少次的IP连接"
print "##ipWhiteFile:\t---IP白名单列表,一行一个"
print "##sortiptmp:\t---排序后的IP地址列表"
print "##iptableslist:\t---IP防火墙已经屏蔽的IP地址列表,不需要排序"
print "##ipbankip:\t---最终生成的屏蔽IP地址列表"
print "-"*30+"Help"+"-"*30 if __name__ == "__main__":
try:
#print sys.argv
print "Strat"
num = sys.argv[1]
ipWhiteFile = sys.argv[2]
sortiptmpfile = sys.argv[3]
iptableslistfile = sys.argv[4]
ipbankipfile = sys.argv[5]
ipban(num,ipWhiteFile,sortiptmpfile,iptableslistfile,ipbankipfile)
except:
help()
else:
print "Not Main"
print sys.argv

批量屏蔽符合条件的IP地址,支持添加白名单,IP段,增量,大于指定次数的IP的更多相关文章

  1. 批量屏蔽符合条件的IP地址《目前仅测Centos 6 版本》

    使用办法:可以将下面的sh保存到一个单独的文件中,比如ipad.sh,然后再编辑获取IP地址列表中的那段.最终的结果是需要直接获取到IP地址,一行一个,可以有多个文件,一行一个,进行重定向到指定的IP ...

  2. 无法在web服务器上启动调试,此项目在使用一个被配置为使用特定IP地址的网站。请在项目URL中指定计算机名称。

    解决方案:IIS服务器管理-default web site 绑定-选择使用的IP-编辑-IP地址:全部未匹配

  3. 【转】Asp.Net Core2.0获取客户IP地址,及解决发布到Ubuntu服务器获取不到正确IP解决办法

    1.获取客户端IP地址实现方法(扩展类) using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc.ModelBinding; u ...

  4. Asp.Net Core2.0获取客户IP地址,及解决发布到Ubuntu服务器获取不到正确IP解决办法

    1.获取客户端IP地址实现方法(扩展类) using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc.ModelBinding; u ...

  5. Laravel 5 如何实现网站在维护模式下允许指定 IP 用户访问(白名单)

    为了测试需要,有时候需要在网站处于维护模式下允许特定IP访问网站,在 Laravel 中,这可以通过为维护模式编写自定义中间件来实现. 默认情况下,Laravel 使用 CheckForMainten ...

  6. mssql数据库游标批量改动符合条件的记录

    //需求:因为项目刚上传,没有票数,为了表现出一定的人气,须要在一開始把各项目的票数赋一个值 , 但每一个项目不能一样,否则easy看出问题,呵呵 . DECLARE @Id varchar(50) ...

  7. Java IP白名单相关工具类

    关于设置IP白名单相关的一些方法,整理,记录了一下. package com.tools.iptool; import java.util.ArrayList; import java.util.Ha ...

  8. Java代码中对IP进行白名单验证

    来自:https://www.cnblogs.com/shinubi/p/6723003.html public class ipUtil { // IP的正则,这个正则不能验证第一组数字为0的情况 ...

  9. Oracle根据符合条件的数据循环批量更新

    --批量对符合条件的表记录进行更新 --aa代表查询出的符合条件数据的别名 --aa后的表示需要符合的条件 --loop后开始写更新操作 begin for aa in (select a.objec ...

随机推荐

  1. oracle linux 6.8 安装

    ' 测试环境vm虚拟机 硬盘大小50G 内存2G CPU 4 选择install or upgrade an existing system 选择skip跳过内存检查 Next 选择语言,Next 选 ...

  2. [UE4]字体材质

    一.准备好一个字体文件,直接拖放到内容浏览器 二.创建一个名为testFontMaterial的UserWidget,添加一个TextBlock到默认的CanvasPanel.Font Family: ...

  3. PowerDesiger 生成C#实体类,字段转变成大小写方法

    1.打开编辑生成C#实体类的PD脚本 2..L:  表示全部转小写,.U: 表示全部转成大写.

  4. C#控制台程序点击后暂停工作

    C#控制台应用程序,点击后就会暂停运行,但是我想让它运行不受点击的干扰.下面是程序演示: public void Test() { ThreadOut(); } private void Thread ...

  5. spring cloud gateway - RequestRateLimiter

    1. Official website 5.7 RequestRateLimiter GatewayFilter Factory The RequestRateLimiter GatewayFilte ...

  6. Linux运维人员最常用166个命令汇总

    引用自“菜鸟博客” 命令 功能说明 线上查询.帮助命令(2个) man 查看命令帮助,命令词典,更复杂还有info,但不常用. help 查看Linux内置命令的帮助,比如cd等命令. 文件.目录操作 ...

  7. k8s学习笔记之四:资源清单定义入门

    第一章.k8s中的资源 1.什么叫资源? k8s中所有的内容都抽象为资源, 资源实例化之后,叫做对象 2.在k8s中有哪些资源? 工作负载型资源(workload): Pod ReplicaSet D ...

  8. XSY contest1586 proB

    题目 现在一圈n个花坛, 每次随机往一个花盆里种花, 一个花盆可以种多颗花, 假如一个花盆两边的花盆都有花, 那么他也将被种上花 问期望种满所有花盆要种几次 首先定义f(i)为放置了i个物品后完全覆盖 ...

  9. java泛型的作用及实现原理

    一.泛型的介绍 泛型是Java 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方法. Ja ...

  10. leetcode301

    class Solution { public List<String> removeInvalidParentheses(String s) { List<String> a ...