使用 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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端