自动屏蔽频繁访问IP,提升服务器安全:实战脚本解析

ops/2024/12/25 23:27:45/

在当前的数字化时代,服务器安全成为了一个不可忽视的重要环节。无论是企业网站还是个人博客,都面临着来自各方的潜在威胁。其中,恶意访问和频繁登录尝试更是让管理员头疼不已。本文将为大家介绍如何通过脚本自动屏蔽频繁访问和尝试SSH登录的IP,从而提升服务器安全防护能力。

一、背景与需求分析

  • 随着互联网的快速发展,服务器面临的攻击手段也在不断演变。恶意访问和频繁登录尝试是两种常见的攻击方式。恶意访问通常是指通过大量请求来消耗服务器资源,导致服务器无法正常提供服务;而频繁登录尝试则是试图通过暴力破解的方式获取服务器的控制权限。为了应对这些威胁,管理员需要实时监控服务器的访问日志和登录状态,并采取相应的措施。手动监控和屏蔽IP显然是不现实的,因此我们需要借助脚本自动化这一过程。

二、Nginx访问日志分析与屏蔽脚本

  1. 脚本介绍

我们的第一个脚本是基于Nginx访问日志来屏蔽频繁访问的IP。Nginx是一款高性能的HTTP服务器和反向代理服务器,其访问日志记录了每个请求的详细信息,包括客户端IP、请求时间、请求URI等。

  1. 脚本代码
DATE=$(date +%d/%b/%Y:%H:%M)  
ABNORMAL_IP=$(tail -n5000 access.log |grep $DATE |awk '{a[$1]++}END{for(i in a)if(a[i]>100)print i}')  
#先tail防止文件过大,读取慢,数字可调整每分钟最大的访问量。awk不能直接过滤日志,因为包含特殊字符。for IP in $ABNORMAL_IP; doif [ $(iptables -vnL |grep -c "$IP") -eq 0 ];theniptables -I INPUT -s $IP -j DROPfi
done
  1. 脚本解析

DATE=$(date +%d/%b/%Y:%H:%M):获取当前时间的日期和时间,格式为“日/月/年:时:分”。 tail -n5000
access.log:读取Nginx访问日志的最后5000行,防止文件过大导致读取速度慢。 grep
$DATE:过滤出当前时间段的日志记录。 awk ‘{a[$1]++}END{for(i in a)if(a[i]>100)print
i}’:使用awk统计每个IP的访问次数,并输出访问次数超过100次的IP。 for IP in $ABNORMAL_IP; do …
done:遍历所有异常IP,并检查是否已经被iptables屏蔽。 iptables -I INPUT -s $IP -j
DROP:如果IP未被屏蔽,则将其加入iptables规则,直接丢弃该IP的所有请求。

  1. 使用建议

将脚本保存为nginx_block.sh,并设置定时任务(如每分钟执行一次)来实时监控和屏蔽频繁访问的IP。
根据服务器的实际情况调整tail -n5000中的数字,以确保既能及时发现问题又不会因读取过多日志而影响性能。

三、通过TCP连接数屏蔽频繁访问IP

  1. 脚本介绍

除了基于访问日志来屏蔽频繁访问的IP外,我们还可以通过监控TCP连接数来实现这一目标。这种方法不需要依赖特定的日志格式,因此更具通用性。

  1. 脚本代码
ABNORMAL_IP=$(netstat -an |awk '$4~/:80$/ && $6~/ESTABLISHED/{gsub(/:[0-9]+/,"",$5);{a[$5]++}}END{for(i in a)if(a[i]>100)print i}')  
#gsub是将第五列(客户端IP)的冒号和端口去掉  
for IP in $ABNORMAL_IP; doif [ $(iptables -vnL |grep -c "$IP") -eq 0 ]; theniptables -I INPUT -s $IP -j DROPfi
done
  1. 脚本解析

netstat -an:列出所有当前的TCP连接。 awk ‘ 4 / : 80 4~/:80 4 /:80/ &&
$6~/ESTABLISHED/{gsub(/:[0-9]+/,“”,$5);{a[$5]++}}END{for(i in
a)if(a[i]>100)print
i}’:过滤出所有目标端口为80且状态为ESTABLISHED的连接,统计每个客户端IP的连接数,并输出连接数超过100次的IP。
gsub(/:[0-9]+/,“”,$5):使用gsub函数去掉第五列(客户端IP)中的冒号和端口号。
其余部分与上一个脚本类似,遍历异常IP并加入iptables规则进行屏蔽。

  1. 使用建议

将脚本保存为tcp_block.sh,并设置定时任务来定期执行。根据服务器的实际情况调整连接数的阈值(如100次),以确保既能有效屏蔽恶意访问又不会误伤正常用户。


http://www.ppmy.cn/ops/144961.html

相关文章

ubuntu,自动休眠后,程序自动暂停。如何破?

昨天挂机想让出图,今天一看,不错,有一张。原来是机器休眠了,暂停了。 在Ubuntu系统中,当计算机进入休眠状态后,所有正在运行的应用程序都会被暂停,包括图形处理程序。为了避免这种情况&#xf…

Docker环境下数据库持久化与多实例扩展实践指南

引言 在Docker容器化技术中,数据库的持久化和多实例管理是两个关键问题。本文将详细介绍如何在Docker中实现数据库的持久化,并有效地管理多个数据库实例。 数据库持久化实现步骤 1. 创建Docker卷 Docker卷是实现数据持久化的关键。以下是创建Docker卷…

Flutter 实现全局悬浮按钮学习

Flutter 代码如何实现了一个全局悬浮按钮,当点击按钮时,会显示一个可以拖动并且通过长按可以移除的悬浮控件。 前置知识点学习 Offset Offset 是 Flutter 中的一个类,用于表示二维平面中的位置或位移。它通常用于描述坐标系中的一个点&…

《C 语言 Socket 网络编程:深入剖析与实战》

目录 一、引言 二、Socket 网络编程基础 (一)Socket 概念 (二)网络协议与 Socket 类型 (三)IP 地址与端口号 三、C 语言 Socket 编程实战步骤 (一)TCP 服务器端编程 &#x…

南海区2021年C++甲组真题第3题——Excel地址

题目描述 Excel单元格的地址表示很有趣,它使用字母来表示列号。 比如: A表示第1列, B表示第2列, Z表示第26列, AA表示第27列, AB表示第28列, BA表示第53列, ... 当然Excel的最大列…

day14-补充静态网卡配置

修改网络模式,修改静态ip,动态ip获取方式 查看当前的上网信息 1.确保你的机器,是连接的网络的,是插上了网线的。(模拟了物理服务器的软件是什么?看你的虚拟的机器(vmware)&#xf…

若依启动项目时配置为 HTTPS 协议

文章目录 1、需求提出2、应用场景3、解决思路4、注意事项5、完整代码第一步:修改 vue.config.js 文件第二步:运行项目第三步:处理浏览器警告 6、运行结果 1、需求提出 在开发本地项目时,默认启动使用的是 HTTP 协议。但在某些测试…

python1:开发环境及配置

1,win pc本地安装: 课上选用的是清华大学开源软件镜像站 主要是python解释器,除了上面的anaconda数据科学套件, 我课上还推荐学生使用vscode或pycharm 2,如果是在linux系统服务器上: 配置就更加简单了 vs…