使用 ipset 结合 iptables 拦截 SSH 字典攻击

前言

自用的OpenWRT软路由, 由于使用需要, 设置了公网访问
最近查看系统日志时, 发现了一堆形如auth.info sshd ... Connection closed的信息
这些都是别人在尝试暴力破解我们的软路由账号/密码
之前我已经使用openwrt 处理 ssh 暴力破解来进行的处理
由于目前输出无用日志太多, 于是改用本文描述的处理方式

实际配置

ipset部分

ipset

使用它也是在恩山论坛看到有坛友提及它的效率要高于iptables
使用如下命令创建一个ipset即可, 稍后我们会在脚本及iptables中引用它

ipset create myset hash:net
#####
# myset为该集合名字, 取你喜欢的即可
# 后续通过如下命令可以向该ipset中添加IP
# ipset add myset 14.144.0.0/12
#####

脚本

该脚本由前言文章中使用的脚本修改而来, 里面有些内容为冗余, 之后再改吧
保存文件并跟它附上执行权限

#!/bin/ash

## 日志关键字,每个关键字可以用"|"号隔开,支持grep的正则表达式
## 注: SSH 攻击可以大量出现四种关键字:Invalid user/Failed password for/Received disconnect from/Disconnected from authenticating
##     Luci 攻击可以出现"luci: failed login on / for root from xx.xx.xx.xx"
LOG_KEY_WORD="auth\.info\s+sshd.*(Failed password for|Unable to negotiate|Disconnected from authenticating)|luci:\s+failed\s+        login|auth\.info.*sshd.*Connection closed by.*port.*preauth"

## 白名单IP可以用"|"号隔开,支持grep的正则表达式
exclude_ip="192.168.1.|127.0.0.1"
  
## 失败次数
Failed_times=3

## 日志时间
LOG_DT=`date "+%Y-%m-%d %H:%M:%S"`

## 实际处理流程
DenyIPLIst=`logread \
  | awk '/'"$LOG_KEY_WORD"'/ {for(i=1;i<=NF;i++) \
  if($i~/^(([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/) \
  print $i}' \
  | grep -E -v "${exclude_ip}" \
  | sort | uniq -c \
  | awk '{print $2}'`

IPList_sum=`echo "${DenyIPLIst}" | wc -l`
if [[ $IPList_sum -ne 0 ]];then
  for i in ${DenyIPLIst}
    do
    ipset list banlist | grep -q $i
    [[ $? -ne 0 ]] && ipset add banlist $i && echo "[$LOG_DT] add $i" >> /root/banlist
    done
fi

⚠注意:iptables中应用该ipset

之前忘了加了...
不在iptables中应用应该没效果才对
iptables -I INPUT 3 -i eth0 -m set --match-set banlist src -p tcp --dport 22 -j DROP -m comment --comment "block ipset BANLIST"

cron

我选择每3小时让它执行一次
1 */3 * * * sh /root/ipset_block.sh

iptables部分

本来上文已经可以拦截攻击和阻止日志输出了, 由于日志阻止是基于关键字来的, 所以难免还会有漏网之鱼
于是我又参考iptables:阻止SSH字典攻击做了个加固
直接放配置代码吧, 原文的内容我也稍做了更改其实就是把规则的顺序改了下

iptables -I INPUT -i eth0 -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --set --name SSH -m comment --comment "SSH Attack list"
iptables -I INPUT 2 -i eth0 -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --update --seconds 180 --hitcount 3 --name SSH -j DROP  -m comment --comment "Prevent SSH Attack"
iptables -A INPUT -p tcp -m conntrack --ctstate NEW --dport 22 -j ACCEPT -m comment --comment "Enable Normal SSH Connection"

端口eth0根据自己的实际情况来, 其它可以不动
这里的配置大致就是3分钟内(180s)检测到新来的ssh访问失败次数达到3次, 直接IP记到列表中同时把它ban了

效果

看看最近两天的日志输出量

Sun Feb 20 09:46:59 2022 auth.err
Sun Feb 20 09:46:59 2022 auth.info
Sun Feb 20 11:56:56 2022 auth.info
Sun Feb 20 12:00:33 2022 auth.info
Sun Feb 20 12:01:00 2022 cron.err
Sun Feb 20 12:01:35 2022 auth.info
Sun Feb 20 13:18:33 2022 auth.err
Sun Feb 20 13:18:33 2022 auth.info
Sun Feb 20 13:24:31 2022 auth.info
Sun Feb 20 13:24:31 2022 auth.info
Sun Feb 20 14:10:40 2022 auth.err
Sun Feb 20 14:10:40 2022 auth.info
Sun Feb 20 15:01:00 2022 cron.err
Sun Feb 20 17:28:35 2022 auth.err
Sun Feb 20 17:28:35 2022 auth.info
Sun Feb 20 18:01:00 2022 cron.err
Sun Feb 20 18:52:29 2022 auth.err
Sun Feb 20 18:52:30 2022 auth.info
Sun Feb 20 21:01:00 2022 cron.err
Sun Feb 20 23:10:11 2022 auth.err
Sun Feb 20 23:10:11 2022 auth.info
Sun Feb 20 23:22:55 2022 auth.info
Sun Feb 20 23:22:57 2022 auth.info
Mon Feb 21 00:01:00 2022 cron.err
Mon Feb 21 02:00:00 2022 cron.err
Mon Feb 21 02:00:32 2022 cron.err
Mon Feb 21 02:00:59 2022 cron.err
Mon Feb 21 02:27:24 2022 auth.err
Mon Feb 21 02:27:24 2022 auth.info
Mon Feb 21 03:00:00 2022 cron.err
Mon Feb 21 03:00:06 2022 cron.err
Mon Feb 21 03:00:32 2022 cron.err
Mon Feb 21 03:01:00 2022 cron.err
Mon Feb 21 03:14:17 2022 auth.err
Mon Feb 21 03:14:17 2022 auth.info
Mon Feb 21 03:32:53 2022 auth.info
Mon Feb 21 03:32:57 2022 auth.info
Mon Feb 21 05:00:00 2022 cron.err
Mon Feb 21 05:00:06 2022 cron.err
Mon Feb 21 05:00:33 2022 cron.err
Mon Feb 21 06:01:00 2022 cron.err
Mon Feb 21 09:01:00 2022 cron.err
Mon Feb 21 09:09:32 2022 auth.err
Mon Feb 21 09:09:32 2022 auth.info
Mon Feb 21 09:12:21 2022 auth.info
Mon Feb 21 10:18:56 2022 auth.err
Mon Feb 21 10:18:56 2022 auth.info
Mon Feb 21 10:21:27 2022 auth.err
Mon Feb 21 10:21:27 2022 auth.info

整个世界清静了!


2022年3月16日 更新
脚本的记录显示, 本月3日后再无新的黑名单IP

posted @ 2022-02-21 11:36  tfel-ypoc  阅读(474)  评论(0编辑  收藏  举报