openwrt临时封禁ip

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把22 80端口映射到公网,发现经常被暴力破解,自己写了个临时封禁ip功能的脚本,实现5分钟内同一个ip登录密码错误10次就封禁这个ip 5分钟,并且进行邮件通知

使用步骤

openwrt为19.07.03版本,其他版本没有测试过

  1. 安装bash msmtp
  2. opkg update;opkg install bash msmtp
  3. 添加脚本/root/port-security.sh,内容参考下面附件,主要修改通知的邮箱
  4. 脚本增加执行权限
  5. chmod a+x /root/port-security.sh
  6. 添加定时任务 crontab -e,10分钟执行一次脚本,如果脚本已经在跑会自动退出当前进程
  7. /10 * * * /root/port-security.sh &
  8. 修改/etc/msmtprc 文件,内容参考下面附件,封禁ip后发送邮件通知

解释

  1. 通过logread查看日志确定被登录的错误次数并且提取要封禁的ip,ssh登录密码错误通过”Bad password attempt for”匹配,web登录密码错误通过”luci: failed login on”,具体可以根据实际修改,logread日志过多有用信息有可能被冲掉的可能,可以加大日志缓存或者修改日志等级减少日志
  2. ip封禁是通过ipset配合iptables处理,当要封禁的ip很多的时候,比直接多条iptables性能高,封禁时间由ipset来处理,不需要另外处理封禁时间
  3. 用了bash字典,脚本需要用/bin/bash,不能用/bin/sh,bash低版不支持字典
  4. 内网192.168.0.0/16加入了白名单,如果要用内网来测试,需要注释iptables -I INPUT -s 192.168.0.0/16 -j ACCEPT

/root/port-security.sh

#! /bin/bash

#允许尝试错误的次数
tryErrNum=10
#允许尝试错误在多长时间范围,单位秒,与tryErrNum一起生效
tryTimeOut=300
#需要被封禁的多个ip字符串,逗号隔开,这里为空
dropIpList=""
#logread里面标识字符串,Bad password attempt for 是ssh root登录密码错误log,luci: failed login on 是登录web错误log
errStr=("Bad password attempt for" "luci: failed login on")
#查询logread 日志的时间间隔,单位秒
timesleep=30

#从根据字符串从日志里面提取要封禁的ip,追加到 dropIpList 变量
getdropip() {
    #对过滤的日志倒叙
    lines=$(logread | grep $1 | sed -n '1!G;h;$p')
    linesNum=$(echo -n "$lines" | wc -l)
    #定义字典变量
    declare -A dict
    #
    if [ "$linesNum" -gt "$tryErrNum" ];then
        while read line;
        do
            ip=$(echo -n "$line" | awk '{print $NF}' | awk -F":" '{print $1}')
            time=$(echo -n "$line" | awk '{print $4}' | awk -F":" '{sum += $1*3600 + $2*60 + $3};END {print sum}')
            ok=${dict[$ip]}
            if [ -z $ok ];then
                dict[$ip]=1
                time=$(date | awk '{print $4}' | awk -F":" '{sum += $1*3600 + $2*60+ $3};END {print sum}')
                dict[${ip}_endtime]=$time
            else
                if [ ${dict[$ip]} -lt "$tryErrNum" ];then
                    dict[$ip]=$(expr ${dict[$ip]} + 1)
                    dict[${ip}_starttime]=$time
                fi
            fi
        done <

/etc/msmtprc 这里用的163邮箱,其他邮箱这里不列举

defaults

account 163
host smtp.163.com
port 25
from <这里填你发邮件的邮箱>
auth plain
tls on
user <这里填你发邮件的邮箱>
password <这里填你发邮件的邮箱的密码>

account default : 163
</这里填你发邮件的邮箱的密码></这里填你发邮件的邮箱></这里填你发邮件的邮箱>

怎么能没梦想呢

Original: https://www.cnblogs.com/damofeisha/p/16595953.html
Author: 大漠飞沙
Title: openwrt临时封禁ip

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/714013/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球