关于GZCTF反向代理配置不当导致平台在高并发下崩溃
环境
GZCTF单实例部署在172.20.14.20
、172.20.14.110
、172.20.14.111
三台机器的K8s集群上,使用LoadBalancer
对外暴露服务,LoadBalancer IP
由MetalLB
分得:172.20.14.118
问题描述
2024年11月16日,2024 Redrock CTF开赛,这次比赛使用了新的比赛平台GZ::CTF - GZ::CTF Docs。
由于反向代理配置不当,导致平台在刚开赛时就因为高并发而立即崩溃,报错显示错误代码429,并且平台响应很慢,无法正常刷新。
排查过程
在遇到429问题后,首先是检查了配置文件中和访问限制有关的参数配置,都适当的调大,发现并没有什么改善,没有解决问题。
GZCTF是单实例部署的,为了让流量分流,我将Pod扩容,但是单实例部署与多实例部署存在差别,并且据官方介绍单实例已经能满足大部分的一般比赛(满足2000人200题),并且是官方最为推荐的部署方式。多实例部署需要配置对象存储,否则会导致数据不一致的问题。
最后在咨询开发者以及在检查日志的过程中发现了问题:
配置文件中的ForwardedOptions
的TrustedNetworks
和TrustedProxies
字段使用的是默认值,反向代理并没有生效,logs里客户端的ip全是一致的,大量的相同ip可能超过了平台的访问阈值,最后平台很容易就崩溃了。
[24-11-16 08:14:30.307 DBG] RequestLoggingMiddleware: [200] 7.10ms HTTP GET /api/account/profile @ ::ffff:172.20.14.20 |
解决
注意将ForwardedOptions
的
TrustedNetworks
值为172.20.14.20/24TrustedProxies
值为172.20.14.118,即GZCTF的LoadBalancer IP
整个proxy chain
172.20.14.2(网关机)-> 172.20.14.118(LoadBalancer) -> 172.20.14.20 (master1) |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Yiiong's Blog!