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

用 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.xdnf.cn/news/17222.html

相关文章:

  • 设计模式(二)——策略模式
  • ABP VNext + Fody AOP:编译期织入与性能监控
  • JDK、eclipse的安装,配置JDK、Tomcat并使用eclipse创建项目
  • 为什么提升模型尺度可以提升模型的CoT能力
  • 人工智能基础知识笔记十五:文本分块(Chunk)
  • React+TypeScript代码注释规范指南
  • 【JMeter】调试取样器的使用
  • 【性能测试】-2- JMeter工具的使用
  • c++注意点(15)----设计模式(桥接模式与适配器模式)
  • 深入理解VideoToolbox:iOS/macOS视频硬编解码实战指南
  • TDSQL GTS文件说明
  • cAdvisor 容器监控软件学习
  • Pygame音频播放的最简框架代码示例
  • Java选手如何看待Golang
  • 质子试验:守护芯片安全的关键防线
  • Java 大视界 -- 基于 Java 的大数据分布式计算在气象灾害数值模拟与预警中的应用(388)
  • 基于Go的抗封禁爬虫引擎设计
  • 一文可视化分析2025年6月计算机视觉顶刊IJCV前沿热点
  • Java 大视界 -- Java 大数据机器学习模型在金融风险传染路径模拟与防控策略制定中的应用(387)
  • 十三、抽象队列同步器AQS
  • JAVA基础-I/O
  • el-image-viewer组件在el-table使用时层级异常问题解决
  • Vue3 基本语法
  • 【Android笔记】Android 自定义 TextView 实现垂直渐变字体颜色(支持 XML 配置)
  • 【密码学】6. 消息认证和哈希函数
  • latex in overleaf快速通关论文排版
  • vue3 el-select 加载触发
  • list类
  • 设计模式中的行为模式
  • 【Unity输入系统】自定义与双击不冲突的单击Interaction