当前位置: 首页 > news >正文

用 Go 写个极简反向代理,把 CC 攻击挡在业务容器之外

最近容器化改造,所有业务都跑在 K8s 里。某天 3 点 15 分,Prometheus 疯狂告警:某个业务 Pod CPU 飙到 200%,原因是 /api/search 接口被刷。传统的 WAF 在集群外,流量已经压到 Ingress 上了,再往上加规则来不及。于是干脆在业务前面再插一层 Go 写的「微型网关」,在流量进容器之前就把它丢掉。

1. 项目结构

tiny-guard/
├── main.go
├── limiter.go
├── go.mod

2. 核心代码

main.go(不到 120 行,可直接 go run):

package mainimport ("log""net/http""net/http/httputil""net/url""sync""time"
)// 滑动窗口计数器
type window struct {mu        sync.RWMutexcounter   intresetTime int64
}var store = make(map[string]*window)func getIP(r *http.Request) string {// 简单取 X-Forwarded-For 第一个ip := r.Header.Get("X-Forwarded-For")if ip == "" {ip = r.RemoteAddr}return ip
}func allow(ip string) bool {w, ok := store[ip]if !ok {w = &window{}store[ip] = w}w.mu.Lock()defer w.mu.Unlock()now := time.Now().Unix()if now-w.resetTime > 60 {w.counter, w.resetTime = 0, now}w.counter++return w.counter <= 100 // 每分钟 100 次
}func main() {target, _ := url.Parse("http://127.0.0.1:8080 ")proxy := httputil.NewSingleHostReverseProxy(target)http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {ip := getIP(r)if !allow(ip) {http.Error(w, "too fast", http.StatusTooManyRequests)return}proxy.ServeHTTP(w, r)})log.Println("listening :9000")log.Fatal(http.ListenAndServe(":9000", nil))
}

3. 运行测试

go run .
# 另开窗口
ab -n 1000 -c 50 http://localhost:9000/api/search

观察日志,大量 429 Too Many Requests,后端 Pod CPU 立刻降回正常水位。

4. 进阶玩法

  • store 换成 Redis + TTL,就能在多个网关实例间共享。
  • 需要更高并发量?把限流逻辑换成令牌桶即可,代码量不超过 20 行。
  • 如果你不想自己维护网关镜像,直接给集群前面挂一个 高防 IP,厂商已经帮你把滑动窗口、令牌桶、人机验证都封装好了,剩下的就是配几条规则、喝杯咖啡等告警解除。

5. 一行部署

docker build -t tiny-guard .
kubectl apply -f k8s/deployment.yaml
http://www.dtcms.com/a/321715.html

相关文章:

  • 深入浅出:掌握银河麒麟桌面操作系统的防火墙管理艺术
  • 3- Python 网络爬虫 — 如何抓取动态加载数据?Ajax 原理与实战全解析
  • Redis:集群(Cluster)
  • eNSP 模拟器安装教程
  • 深入理解模板方法模式:框架设计的“骨架”艺术
  • [激光原理与应用-180]:测量仪器 - 频谱型 - 干涉仪的定义、功能、原理、组成
  • 目标检测数据集 - 番茄叶病虫害检测数据集下载「包含VOC、COCO、YOLO三种格式
  • LeetCode盛最多水的容器
  • 线程死锁相关知识点
  • Pygame音频播放的最简框架代码示例
  • C#中LINQ to DataSet操作及DataTable与LINQ相互转换
  • 【问题解决】Mysql连接报错:1130-host ... is not allowed to connect to this MySql server
  • 快速入门flask应用(从入门到实战)
  • CPO-SVM分类预测+特征贡献SHAP分析,通过特征贡献分析增强模型透明度,Matlab代码实现,引入SHAP方法打破黑箱限制,提供全局及局部双重解释视角
  • Uber的MySQL实践(一)——学习笔记
  • Xiphos Q8 SDR DOCK子板 AD9361 宽带收发器的 SDR 模块。
  • 【AI论文】高效智能体:在降低成本的同时构建高效能智能体
  • latex基础
  • GPT-5 不仅是版本升级,它标志着 推理能力的商业化 和 Agent操作系统 的崛起,开启了 AI革命时代。
  • 二、RuoYi-Cloud-Plus 拉取到本地的准备和注意事项
  • wordpress的wp-config.php文件的详解
  • 虚幻GAS底层原理解剖九 (内存管理)
  • Jetpack Compose 主题系统全解析:从基础配置到动态切换
  • 商品、股指、ETF期权五档Tick分时历史行情数据解析
  • 数据库设计简述
  • Trae SOLO+ Holopix AI → “虚假广告“-鸠摩智转[特殊字符]割草小游戏
  • 【Unity3D实例-功能-跳跃】角色跳跃
  • Wan2.1-14B-T2V-FusionX-VACE本地部署教程:融合前沿技术,轻松掌握逼真物理模拟!
  • JAVA基础-NIO
  • 面向真实场景的定制化图像降质模型设计方案