【Linux】自动拒绝恶意IP远程登录服务器的定时脚本

    服务经常被攻击,于是在增加了服务器访问黑名单Nginx访问黑名单的同时,增加了SSH访问黑名单,脚本如下。

    1、将以下代码写入脚本文件/root/scripts/auto_deny_login.sh;脚本已更新2016-6-11,增加了日志、防重复记录规则和按需重启服务



    #!/bin/sh
    #auto deny ssh failed IP address
    #maplnan 2016-6-12
    #定义变量
    SEC_FILE=/var/log/secure
    #定义脚本日志文件
    SCRIPT_FILE_NAME=`basename $0`
    SCRIPT_DIR_NAME=`dirname $0`
    SCRIPT_LOG_FILE=${SCRIPT_DIR_NAME}/log/${SCRIPT_FILE_NAME}.log
    #IP白名单文件
    WHITELIST_FILE=${SCRIPT_DIR_NAME}/ip_whitelist.conf
    #如下为截取secure文件恶意ip 远程登录22端口,大于等于8次就写入防火墙,禁止以后再登录服务器的22端口
    IP_ADDR=`tail -n 1000 ${SEC_FILE} |grep "Failed password"|grep -v 'git'|awk '{print $11}'|grep "\." |sort |uniq -c |sort -nr|awk ' $1>=8 {print $2}'`
    IPTABLE_CONF=/etc/sysconfig/iptables
    echo
    cat <<EOF
    ++++++++++++++welcome to use auto deny ssh failed IP address++++++++++
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    ++++++++++++++++------------------------------------++++++++++++++++++
    EOF
    
    #打印动态滚动条,参照老男孩博客-数组分析文章
    #echo -n "请等待5秒后开始执行 "
    #for ((j=0;j<=4;j++)) ;do echo -n "----------";sleep 1 ;done
    echo
    
    RESTART_FLAG=0
    
    for i in `echo $IP_ADDR`
    do
    #查看iptables配置文件是否含有提取的IP信息
    RULE="-A INPUT -s $i -m state --state NEW -m tcp -p tcp --dport 22 -j DROP"
    RULE_COUNT=`cat $IPTABLE_CONF |grep -e "$RULE" -c`
    WHITE_IP_COUNT=`cat $WHITELIST_FILE | grep -e "$i" -c`
    if [ $WHITE_IP_COUNT -ne 0 ];then
    echo  "$i exists in white list."
    elif [ $RULE_COUNT -eq 0 ];then
    #判断iptables配置文件里面是否存在已拒绝的ip,如何不存在就不再添加相应条目
    sed -i "/Add/a $RULE" $IPTABLE_CONF
    RESTART_FLAG=1
    #记录日志
    echo `date "+%Y-%m-%d %H:%M:%S"`" 发现非法访问IP ${i},增加iptables规则:${RULE}" >> ${SCRIPT_LOG_FILE}
    echo `tail -n 1000 ${SEC_FILE} |grep -e "$i" -m 1` >> ${SCRIPT_LOG_FILE}
    echo `tail -n 1000 ${SEC_FILE} |sort -r|grep -e "$i" -m 1` >> ${SCRIPT_LOG_FILE}
    echo "" >> ${SCRIPT_LOG_FILE}
    else
    #如何存在的话,就打印提示信息即可
    echo  "$i has existed in iptables."
    fi
    done
    
    echo
    
    #最后重启iptables生效
    if [ $RESTART_FLAG -eq 1 ];then
    /etc/init.d/iptables restart
    fi

    2016/6/12更新

    1. 增加IP白名单防止误伤,脚本同级目录下增加ip_whitelist.conf文件,每行一个白名单IP

    2、在/etc/sysconfig/iptables文件的COMMIT一行上方增加一行

    # Add deny rule list

    如果/etc/sysconfig/iptables文件不存在,则随便写一条iptables命令配置个防火墙规则如:

    iptables -P OUTPUT ACCEPT

    然后用命令:service iptables save进行保存,默认就保存到/etc/sysconfig/iptables文件里。

    3、运行contab -e,增加以下代码

    */5 * * * * /root/scripts/auto_deny_login.sh

     

    参考文章

    1. 自动拒绝恶意IP远程登录Linux服务器脚本(修改了该文章中的脚本以更稳健)
    2. linux下IPTABLES配置详解
    3. linux的/etc/sysconfig/下找不到iptables文件


    本博客所有文章如无特别注明均为原创。
    复制或转载请以超链接形式注明转自枫芸志,原文地址《【Linux】自动拒绝恶意IP远程登录服务器的定时脚本
    标签:
    分享:

已经有2 条评论抢在你前面了~

  1. 沙发
    quange 2016年12月23日 上午2:46

    这个脚本我在虚拟机里实验了很长时间,没有弄成功求大神帮解决,他不拦截

    [回复]

    晴枫

    晴枫 回复:

    @quange, 开头多了一行代码,删掉了,你再试试;还有有日志的看看有没有

    [回复]

无觅相关文章插件,快速提升流量