Kubernetes中保留客户端源IP,实现TCP服务暴力攻击防护
适用于Kubernetes环境、支持保留真实客户端IP的TCP代理方案(适配暴力攻击封禁需求)
针对Kubernetes环境下TCP服务因SNAT无法获取真实客户端IP的问题,以下是几种能满足暴力攻击封禁需求的TCP代理方案:
1. NGINX Ingress Controller(TCP模式)
- 支持TCP代理配置,可通过
proxy_protocol将真实客户端IP传递至后端服务,也能直接在Ingress层面实现访问控制与失败次数统计封禁。 - 配置要点:在Ingress的ConfigMap中声明TCP监听端口,给后端Service添加
nginx.ingress.kubernetes.io/enable-proxy-protocol: "true"注解,确保后端能拿到真实IP。配合limit_req模块或第三方WAF插件,即可实现基于失败次数的IP封禁。 - 注意:若前端是云厂商负载均衡,需先开启Proxy Protocol支持,否则Ingress获取的仍是SNAT后的IP。
2. Envoy(Sidecar/独立代理)
- 原生支持TCP代理,可通过
PROXY protocol提取真实客户端IP(需上游代理传递该信息)。你可以在Envoy配置中添加自定义过滤器,直接实现基于失败次数的IP封禁逻辑,也能集成外部IP黑名单服务。 - 部署方式:作为Sidecar时,每个服务实例旁的Envoy直接处理入站TCP请求,能精准获取真实IP;作为独立边缘代理时,需确保前端负载均衡已配置传递真实IP。
3. HAProxy
- 成熟的TCP代理工具,支持通过
option proxy-protocol传递真实客户端IP,同时内置stick-table和tcp-request content reject规则,可直接在HAProxy层面配置基于失败次数的封禁策略——比如统计指定时间内的失败连接数,达到阈值即封禁对应IP。 - Kubernetes部署:可部署为DaemonSet或Deployment,通过Service暴露,利用ConfigMap管理封禁规则。
4. Traefik(TCP路由模式)
- 支持TCP路由配置,启用
proxyProtocol后可从上游代理获取真实客户端IP。借助Traefik的插件生态或自定义逻辑,能快速实现基于失败次数的IP封禁。 - 配置时需在TCP路由规则中开启Proxy Protocol支持,确保Traefik能正确拿到真实客户端IP。
通用注意事项
- 所有方案的前提是上游SNAT设备(如云负载均衡、K8s NodePort)支持传递真实客户端IP,TCP场景下主要依赖Proxy Protocol实现。
- 封禁逻辑可选择在代理层直接实现,也可将真实IP传递给后端服务,由后端统计失败次数后,通过API动态更新代理的黑名单配置。
内容的提问来源于stack exchange,提问作者Ali Rezvani
相关产品推荐
相关产品推荐

