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

devtools/2024/12/29 8:25:21/

在当前的数字化时代,服务器安全成为了一个不可忽视的重要环节。无论是企业网站还是个人博客,都面临着来自各方的潜在威胁。其中,恶意访问和频繁登录尝试更是让管理员头疼不已。本文将为大家介绍如何通过脚本自动屏蔽频繁访问和尝试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/devtools/145959.html

相关文章

QT调用Sqlite数据库

QT设计UI界面,后台访问数据库,实现数据库数据的增删改查。 零售商店系统 数据库表: 分别是顾客表,订单详情表,订单表,商品表 表内字段详情如下: 在QT的Pro文件中添加sql,然后添加头…

ElementUI 的 form 表单校验

文章目录 需求分析 需求 分析 <el-form:model"form"status-icon:rules"rules"ref"formRef"label-width"150px"class"customForm"size"small"><el-form-itemlabel"姓名&#xff1a;"prop"…

Kibana安装教程——Linux

Kibana安装教程——Linux 一、安装 下载安装包&#xff1a; 官网下载地址&#xff1a;https://www.elastic.co/cn/downloads/kibana 上传包到linux 切换到安装目录下 解压&#xff1a;tar -zxvf kibana-7.17.1-linux-x86_64.tar.gz 重命名安装文件夹 mv kibana-7.17.1-linux-x…

云原生周刊:利用 eBPF 增强 K8s

开源项目推荐 Slurm-operator Slurm-operator 是一个高效可扩展的框架&#xff0c;用于在 K8s 环境中部署和运行 Slurm 工作负载。 它结合了 Slurm 的可靠性和 Kubernetes 的灵活性&#xff0c;支持快速部署 Slurm 集群、动态扩展 HPC 工作负载&#xff0c;并提供高度灵活的定…

【每日学点鸿蒙知识】长时任务、profiler allocation、事件订阅、getTagInfo、NativeWindow

1、HarmonyOS长时任务报错&#xff1f; 按照官方文档开启长时任务&#xff1a; startContinuousTask() {let wantAgentInfo: wantAgent.WantAgentInfo {// 点击通知后&#xff0c;将要执行的动作列表// 添加需要被拉起应用的bundleName和abilityNamewants: [{bundleName: &q…

[工具]GitHub Copilot 直接提供免费额度了

有福了&#xff01; GitHub Copilot 直接提供免费额度——每个月享 2000个代码提示完成额度&#xff08;每个工作日大约80个&#xff09;&#xff0c;以及 50个聊天请求。后台是访问 GPT-4o 和 Claude 3.5 Sonnet 模型。 插件支持VS Code、VS 2022、JetBrains、... 这下 Curs…

AI新书推荐:深度学习和大模型原理与实践(清华社)

本书简介 在这个信息爆炸、技术革新日新月异的时代&#xff0c;深度学习作为人工智能领域的重要分支&#xff0c;正引领着新一轮的技术革命。《深度学习和大模型原理与实践》一书&#xff0c;旨在为读者提供深度学习及其大模型技术的全面知识和实践应用的指南。 本书特色在于…

arcgis server ip修改后服务异常解决方案

1、停止arcgisserver ./home/geoscene/geoscene/server/stopserver.sh 2、修改数据库注册文件 a、进入目录&#xff1a;/home/geoscene/geoscene/server/usr/config-store/data/enterpriseDatabases/sde b、修改文件dataItem.json&#xff1a;将所有IP修改为最新IP 3…