我的网站被攻击了,运维大佬给了我自动封禁ip的脚本。
创始人
2024-03-05 23:47:12
0

我的网站被攻击了,发现友圈最近出现这种情况的还不少,真是神奇了,这事也能扎堆发生。

分享出来给大家,万一以后用得着呢~

故事背景

我的一个小网站最近总是收到云监控报警,一个部署在4核8G单机上的小网站。

查了log发现,我是被流量攻击了。

我招谁惹谁了呀,烦死了。昨天半夜11点收到报警短信,搞到了半夜12点,太耽误我睡觉了。

调研了一下云平台的安全服务,还挺贵,弃疗了。

我还是自己写吧,不是为了提升技术水平,单纯的为了省钱!

实现思路

首先,我的小网站访问量不高,如果某位大哥一天访问超过10次我就觉得有鬼了。

除非你是在爬我的数据~

还是你就是吃饱撑的!

有些ip定位是酱婶的,你可控制住自己,别太自由喽~

综上分析,我的实现思路如下:

  1. 监测log日志,分析访问ip。
  2. 每天ip的访问次数超过100就果断封掉。(为了避免误伤,我暂时把这个阈值设置成100,后面看情况动态调整。)

功能拆解

  1. 编写脚本,按日期拆分access.log(之前犯懒没做日志拆分,只是定时删除了访问日志)
  2. 编写定时任务,每天0点拆分访问日志
  3. 编写脚本,分析access.log访问日志,封禁当天访问次数超过100的ip
  4. 编写定时任务,每10分钟执行一次封禁ip脚本

思路是如此的清晰,奈何我并不擅长编写shell脚本,于是请教了群里的大佬,最终的实现如下:

具体实现

1. 日志拆分脚本

已经清楚的写了注释

其中LOG_PATHPID换成你自己的路径

# 每天0点执行日志按日期分隔脚本 0 0 * * * cd /www/Home/ && ./log_cut.sh
#!/bin/bash
#此脚本⽤于⾃动分割Nginx的⽇志,包括access.log
#每天00:00执⾏此脚本将前⼀天的access.log重命名为access-xxxx-xx-xx.log格式,并重新打开⽇志⽂件
#Nginx⽇志⽂件所在⽬录 todo 换成你自己的
LOG_PATH=/data/logs/nginx/
#获取昨天的⽇期
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)
#获取pid⽂件路径 todo 换成你自己的
PID=/var/run/nginx.pid
#分割⽇志
mv ${LOG_PATH}access.log ${LOG_PATH}access-${YESTERDAY}.log
#向Nginx主进程发送USR1信号,重新打开⽇志⽂件
kill -USR1 `cat ${PID}`

2. 编写定时任务

# 每天0点执行日志按日期分隔脚本 
0 0 * * * cd /www/Home/ && ./log_cut.sh
  • # 代表注释
  • && 表示将两个命令连接在一起,前面的先执行,后面的再执行
  • 如果你不知道crontab的定时任务怎么编写,强烈建议你使用这个工具:
    crontab时间计算

使用效果如下:


简直不要太好用!

3. 编写封禁ip脚本

注释写的很清楚了:

  • logdir替换成你自己的地址
  • /tmp/nginx_deny.log 也可以设置成你自己的地址,或者用这个地址也可以。
# 每十分钟执行一次封禁ip脚本 */10 * * * * cd /www/Home/ && ./blackip.sh
#!/bin/bash
logdir=/data/logs/nginx/access.log #nginx访问日志文件路径
port=443
#循环遍历日志文件取出访问量大于100的ip(忽略自己本地ip)
for drop_ip in $(cat $logdir | grep -v '127.0.0.1' | awk '{print $1}' | sort | uniq -c | sort -rn | awk '{if ($1>100) print $2}'); do# 避免重复添加num=$(grep ${drop_ip} /tmp/nginx_deny.log | wc -l)if [ $num -ge 1 ]; thencontinuefi# shellcheck disable=SC2154iptables -I INPUT -p tcp --dport ${port} -s ${drop_ip} -j DROPecho ">>>>> $(date '+%Y-%m-%d %H%M%S') - 发现攻击源地址 ->  ${drop_ip} " >>/tmp/nginx_deny.log #记录log
done

4. 编写封禁ip定时任务

# 每十分钟执行一次封禁ip脚本 
*/10 * * * * cd /www/Home/ && ./blackip.sh

封禁效果

好了,妈妈再也不用担心我被莫名其妙的攻击了。

思考

如果自己人的ip不小心被封了怎么办呢?

别担心,可以用下面的命令:

#清空屏蔽IP
iptables -t filter -D INPUT -s 1.2.3.4 -j DROP#一键清空所有规则
iptables -F

附上大佬给的iptablse常用命令,先收藏,慢慢学。

iptablse常用命令

1.清除iptables(常用)

iptables -F

2. 备份iptables(常用)

iptables-save > iptables.txt

3. 导入iptables(常用)

iptables-restore < iptables.txt

4. 机器重启自动生效(常用)

service iptables save

5. 清空某条规则:

iptables -t filter -D INPUT -s 1.2.3.4 -j DROP

6. 禁止某个ip(下面用$ip表示)访问本机:

iptables -I INPUT -s $ip -j DROP

7. 禁止某个ip段(下面用ip/ip/ip/mask表示,其中$mask是掩码)访问本机:

iptables -I INPUT -s $ip/$mask -j DROP

8. 禁止本机访问某个ip(下面用$ip表示):

iptables -A OUTPUT -d $ip -j DROP

9. 禁止某个ip(下面用$ip表示)访问本机的80端口的tcp服务:

iptables -I INPUT -p tcp –dport 80 -s $ip -j DROP

10. 禁止所有ip访问本机的80端口的tcp服务:

iptables -A INPUT -p tcp --dport 80 -j DROP

11. 禁止所有ip访问本机的所有端口:

iptables -A INPUT -j DROP

12. 禁止除了某个ip(下面用$ip表示)之外其他ip都无法访问本机的3306端口(常用):

(1)首先 禁止所有

iptables -I INPUT -p tcp --dport 3306 -j DROP

(2)然后 开放个别

iptables -I INPUT -s $ip -p tcp --dport 3306 -j ACCEPT

总结

我之前的思路是配置nginx的黑名单,每次填加新的黑名单之后,还要重启Nginx。

大佬告诉我,不用这么麻烦:直接用Linux的iptables防火墙,既高效又简单。连403都不要那些坏人看到!

如果你也碰到类似的问题,欢迎复刻我的经验。

如果你有更好的方案,欢迎赐教我这个“被攻击的萌新”。

一起学习

感谢我群大佬,真是卧虎藏龙。

我们搞了一个有门槛的学编程专属群,大家一起学习打卡,互相督促,欢迎加入我们:

点这里—>加入高质量学编程专属群👏👏👏

相关内容

热门资讯

勤俭节约作文600字 关于勤俭节约作文600字(通用54篇)  在日常生活或是工作学习中,大家最不陌生的就是作文了吧,借助...
我的六一儿童节作文500字 【热门】我的六一儿童节作文500字四篇  在现实生活或工作学习中,大家总免不了要接触或使用作文吧,作...
什么时候立冬 2021什么时候立冬  立冬是二十四节气之一,那么2021年立冬是什么时候呢?2021立冬节气又是哪...
端午节作文300字 端午节作文300字精选7篇  在日常学习、工作抑或是生活中,大家都接触过作文吧,作文是经过人的思想考...
粽子的来历与传说故事 粽子的来历与传说故事(通用7篇)  端午节马上要来了,说到端午节小编想到的就是粽子了,中国饮食文化是...
国庆趣事作文400字 国庆趣事作文400字(精选38篇)  在平日的学习、工作和生活里,许多人都有过写作文的经历,对作文都...
植树节的作文700字 【热门】植树节的作文700字汇编9篇  在日常学习、工作或生活中,许多人都有过写作文的经历,对作文都...
小学三年级作文 小学三年级作文(通用48篇)  在教学工作者开展教学活动前,通常会被要求编写,是备课向课堂教学转化的...
我的十一假期作文300字 我的十一假期作文300字  这个假期爸爸妈妈都很忙,但还是抽出了一天的时间和我去植物园。  清晨,我...
小学作文牵牛花 小学作文牵牛花  1牵牛花  每天早上,我在上学的路上,总看见一种花,在围墙上生长——牵牛花,又叫喇...
做手工作文 做手工作文做手工“六一”儿童节学校要举行“手工比一比”所以每个同学都要自己动手做。今天妈妈要准备把手...
春雨 春雨  “轰隆隆”一声闷雷,一阵春雨随之而来,这预示着美好的春天终于降临了。    “好雨知时节,当...
小猫吃鱼作文 小猫吃鱼作文(15篇)  在日常学习、工作和生活中,大家或多或少都会接触过作文吧,借助作文可以宣泄心...
小学五年级母爱的作文600字 【精选】小学五年级母爱的作文600字三篇  在平凡的学习、工作、生活中,大家都尝试过写作文吧,借助作...
环境描写的五个经典作文开头 环境描写的五个经典作文开头  自然环境是指自然界的景物,如季节变化、风霜雨雪、山川湖海、森林原野等。...
暑假打谷作文 暑假打谷作文  无论是在学校还是在社会中,大家都不可避免地会接触到作文吧,作文是从内部言语向外部言语...
一睁眼就碰到了快乐初一作文 一睁眼就碰到了快乐初一作文  在平日的学习、工作和生活里,许多人都写过作文吧,借助作文可以宣泄心中的...
学做春节美食作文 学做春节美食作文(精选11篇)  在日复一日的学习、工作或生活中,大家都经常看到作文的身影吧,作文可...
暑假里难忘的一件事 暑假里难忘的一件事暑假里难忘的一件事1夏汪政宇还记得那一次,我和哥哥一起去感受了夏.那天,有风,但分...
中秋节小学优秀作文 中秋节小学优秀作文(精选35篇)  在平时的学习、工作或生活中,说到作文,大家肯定都不陌生吧,作文是...