升级 Cilium 后 MySQL 突然拒绝连接?全网 5.3 万人围观过的 Masquerading 大坑
升级 Cilium 后 MySQL 突然拒绝连接全网 5.3 万人围观过的 Masquerading 大坑【免费下载链接】ciliumeBPF-based Networking, Security, and Observability项目地址: https://gitcode.com/GitHub_Trending/ci/cilium深夜升级集群helm upgrade cilium一切绿灯第二天业务方报障应用 Pod 连不上 MySQL报Access denied for user授权错误。明明代码没改、账号没删、密码没换数据库日志里显示的却是一个陌生的 client IP——不是你业务 Pod 的地址。这是 2022 年在 Cilium 社区被 5.3 万人围观过的真实事故juejin 上 5.3 万浏览量它的根因正是 Cilium 的Masquerading源地址伪装行为在版本升级后发生了静默改变。本文结合官方文档与仓库源码把这条链路完整拆开表象、根因、排查手段以及升级前必须核对的那几个开关。事故复现升级后 MySQL 授权报错的表象事故的典型场景是这样的集群原本运行 Cilium v1.8.x某个业务 PodIP 如10.244.1.15访问集群外或同 VPC 内的 MySQL 实例升级到 Cilium v1.11.x 后业务 Pod 突然报 MySQL 授权失败ERROR 1045 (28000): Access denied for user app10.0.0.5检查 MySQL 侧的授权表app10.244.1.15是存在的但 MySQL 收到的来源 IP 却变成了节点 IP10.0.0.5于是按新来源 IP匹配授权规则直接拒绝。MySQL 会基于 client IP 做主机维度授权这是最常见的中招点同理任何依赖源 IP 做鉴权/白名单/风控的服务Redis ACL、对象存储桶策略、防火墙规则、审计系统都可能出现类似症状。表象千奇百怪本质只有一个升级前后到达 MySQL 的数据包源地址变了。定位clientIP 被 Masquerading 伪装的根因Cilium 为什么要做 MasqueradingPod 的 IPv4 地址通常从 RFC1918 私网段分配默认不可公网路由。Cilium 会把离开集群的所有流量的源 IP 自动伪装成节点 IP因为节点 IP 在网络上是可路由的。官方文档对默认行为描述得很直接见 Documentation/network/concepts/masquerading.rstCilium will automatically masquerade the source IP address of all traffic that is leaving the cluster to the IPv4 address of the node。换句话说Pod → 集群外 MySQL 的连接源地址被换成节点 IP是 Cilium 的默认设计不是 bug。问题出在什么算集群外/什么算集群内的判定边界在升级后变了。判定边界的两个关键 CIDRCilium 判定是否需要伪装的核心是看目的地址是否落在SNAT 排除 CIDR内。仓库源码pkg/datapath/iptables/iptables.go中remoteSNATDstAddrExclusionCIDR的逻辑非常直白func (m *manager) remoteSNATDstAddrExclusionCIDR(nativeRoutingCIDR, allocCIDR netip.Prefix) netip.Prefix { if nativeRoutingCIDR.IsValid() { // ip{v4,v6}-native-routing-cidr is set, so use it return nativeRoutingCIDR } return allocCIDR }也就是说如果配置了ipv4-native-routing-cidr排除 CIDR 就是它目的地址落在该 CIDR 内的流量不做SNATPod 源 IP 原样送达如果没有配置则退回到本节点 Pod 分配 CIDRallocCIDR。iptables 模式下最终下发的规则链是cilium masquerade non-cluster见同一文件中的allEgressMasqueradeCmds-t nat -A CILIUM_POST_nat -! -d snatDstExclusionCIDR -s allocRange ! -o cilium_ -j MASQUERADE翻译成人话只要目的地址不在排除 CIDR 里且来源是 Pod 地址、出口不是 cilium_ 隧道口一律 MASQUERADE 成节点 IP。升级为什么会让 MySQL 中招结合 v1.8 → v1.11 这个具体区间升级前后最容易踩的坑有三个ipv4-native-routing-cidr未显式配置老版本里原生路由/排除伪装的判定依赖集群 Pod CIDR 等默认推断升级后推断逻辑、IPAM 模式如从 cluster-pool 切换为 ENI/Azure IPAM或节点 CIDR 划分发生变化导致原本被当作集群内可直达、不伪装的 MySQL 地址在新版本里被划到了需要伪装的一侧。于是 Pod 源 IP 消失MySQL 收到的是节点 IP。BPF Masquerading 与 iptables 模式的判定差异文档明确警告见 Documentation/network/concepts/masquerading.rst 与 kubeproxy-free.rsteBPF 实现与 iptables 实现存在行为差异。典型例子是Pod → 节点 External IP 的流量在 eBPF masquerading 下不会被伪装而 iptables 模式会伪装反过来eBPF 模式下 pod-to-remote-node 在 overlay 路由里默认要伪装代码注释里专门提到了 cilium/cilium#12624 这个坑见bpf/lib/nat.h。升级时如果顺手把bpf.masqueradetrue打开了伪装判定边界就整体换了实现行为自然漂移。enable-remote-node-masquerade默认值变化该选项控制发往远端节点地址的流量是否伪装。升级后若被显式/隐式打开Pod → 节点 InternalIP 的流量也会被 SNAT。官方文档还特别提示这会削弱对 Pod → Node 流量的 ingress host firewall 管控建议默认关闭、谨慎开启。BPF 数据路径的判定顺序在bpf/lib/nat.h的__snat_v4_needs_masquerade里写得很清楚先看是否是回包回包不 SNAT→ 看是否命中 egress gateway 策略 → 再看目的地址是否落在ipv4_snat_exclusionCIDR 内命中则放行不 SNAT→ 再看是否命中 ip-masq-agent 的cilium_ipmasq_v4表 → 再判断远端节点/overlay 场景。任何一个边界条件在升级前后的配置差异都可能改变 MySQL 连接最终呈现的源 IP。规避方案与升级前检查清单现场快速止血确认是伪装导致的授权失败后最快的止血手段是在 MySQL/目标服务侧把节点 IP 也加入授权白名单——但这只是临时方案会引入来源不可信的安全问题必须尽快回到正轨。更根本的止血显式配置ipv4-native-routing-cidr把 MySQL 所在网段纳入原生路由、不做伪装的 CIDR。文档给出的语义是ipv4-native-routing-cidr: 10.0.0.0/8或 IPv6 用ipv6-native-routing-cidr该 CIDR 内的所有目的地址不会被伪装。配置后 Pod 源 IP 会原样到达 MySQL授权表无需改动。注意原生路由 CIDR 意味着 Cilium 依赖底层网络栈直接路由这些包需要确保节点间路由/云 VPC 路由真的可达自建集群需配合auto-direct-node-routes或手工路由。利用 ip-masq-agent 做精细豁免如果不想全局放宽native-routing-cidrCilium 还内置了 eBPF 版 ip-masq-agentHelm 选项ipMasqAgent.enabledtrue可以按目的 CIDR 白名单豁免伪装。仓库自带示例 examples/kubernetes-ip-masq-agent/rfc1918.yamlapiVersion: v1 kind: ConfigMap metadata: name: ip-masq-agent data: config: | nonMasqueradeCIDRs: - 10.0.0.0/8 - 172.16.0.0/12 - 192.168.0.0/16 masqLinkLocal: true默认空配置时agent 会内置 RFC1918 全段、100.64.0.0/10、192.0.0.0/24等一批非伪装 CIDR。把 MySQL 网段加进nonMasqueradeCIDRs就能在不改变整体伪装策略的前提下恢复源 IP。下发后可用cilium-dbg bpf ipmasq list验证豁免表是否生效。升级前检查清单把这次事故沉淀成清单升级 Cilium 前逐项核对记录升级前基线先跑cilium-dbg status | grep Masquerading记下当前 Masquerading 模式BPF 还是 iptables、生效设备与排除 CIDR升级后对比同一输出。命令行参考见 Documentation/network/concepts/masquerading.rst。锁定 masquerading 相关配置在 Helm values 里显式写明bpf.masquerade、enableIPv4Masquerade、enableIPv6Masquerade、ipv4NativeRoutingCIDR、enableRemoteNodeMasquerade、egress-masquerade-interfaces不要依赖默认值漂移。相关选项定义可查 pkg/option/config.go。核对 IPAM 模式与 CIDR升级常伴随 IPAM 模式调整cluster-pool / ENI / Azure / GKE确认ipv4NativeRoutingCIDR与云厂商 VPC CIDR 一致。云环境下若不配置Cilium 会自动探测 VPC CIDR 作为原生路由范围见 masquerading 文档务必确认探测结果符合预期。盘点依赖源 IP 鉴权的服务升级前梳理所有按 client IP 做授权的目标MySQL、Redis、云数据库白名单、防火墙、审计在升级窗口内对它们的连接做抓包对比tcpdump -n host mysql-ip and port 3306即可看到源 IP 是否被替换。灰度与回滚预案先在非核心节点灰度升级用上述抓包/cilium-dbg bpf ipmasq list验证 Pod 源 IP 是否原样到达目标服务保留上一版本 Helm values 快照便于快速回滚或 diff。写在最后这次事故的本质不是 Cilium坏了而是伪装边界的默认判定在版本演进中发生了变化而大多数集群没有显式锁定这些配置导致升级这个动作本身成了变量。Masquerading 是 Cilium 面向公网出口的必要设计但对集群内/同 VPC 内的伪公网流量如云数据库它反而会改写源 IP、破坏基于 IP 的授权模型。升级 Cilium 之前把ipv4-native-routing-cidr、bpf.masquerade、enable-remote-node-masquerade这几个开关逐一显式化比事后在 MySQL 里加一百条白名单更省心——毕竟下一个被 5 万人围观的可能是你的集群。【免费下载链接】ciliumeBPF-based Networking, Security, and Observability项目地址: https://gitcode.com/GitHub_Trending/ci/cilium创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

TMS与WMTS到底啥区别?从瓦片寻址原理到天地图接入实战

TMS与WMTS到底啥区别?从瓦片寻址原理到天地图接入实战

搞 WebGIS 的同行,最近群里被问得最多的问题之一就是“TMS 和 WMTS 到底啥区别,项目里到底该用哪个”。这俩名字看着像兄弟,实际出身、行为习惯、接口细节差别挺大。直接给结论:TMS 是社区里的“土办法”,WMTS 是 OGC …

2026/10/11 15:49:18 阅读更多 →
PCA9422与TM4C1299嵌入式电源管理实战:低功耗系统设计要点

PCA9422与TM4C1299嵌入式电源管理实战:低功耗系统设计要点

1. 项目整体设计与芯片选型思路1.1 为什么要做这个电源管理系统这两年我一直在做便携式嵌入式设备相关的东西,从数据采集终端到带屏幕的手持仪器都碰过。设备越做越小,功耗要求却越来越高,尤其是电池供电的场景,一颗电芯要兼顾常规…

2026/10/11 9:09:26 阅读更多 →
高效学习CSS:从属性到方案的进阶路径

高效学习CSS:从属性到方案的进阶路径

很多人学CSS,上来就照着教程敲一遍属性,敲完感觉全会,一写页面全废。我自己刚入行那会儿也是这个状态,后来带过不少前端新人,发现大家卡住的点其实高度一致:不是记不住属性,而是不知道怎么把属性…

2026/10/11 7:23:01 阅读更多 →

最新新闻

YashanDB单机部署实操:从环境准备到实例启动的完整指南

YashanDB单机部署实操:从环境准备到实例启动的完整指南

数据库这玩意儿,平时看着没啥存在感,可真到要部署的时候,环境、依赖、权限、端口、内核参数,哪一个拎出来都能把人折腾得没脾气。最近一段时间,因为项目选型,我在几台机器上反复部署过YashanDB——一款国产…

2026/10/11 20:34:21 阅读更多 →
基于卷积神经网络的农作物病虫害识别系统实战:从数据集到部署

基于卷积神经网络的农作物病虫害识别系统实战:从数据集到部署

简介:这份资源是面向计算机相关专业毕业设计与项目实战学习者的农作物病虫害识别检测系统,基于深度学习卷积神经网络实现,涵盖从模型训练到Web端部署的完整链路。项目经导师指导并通过评审,源码均经本地编译调试可运行&#xff0c…

2026/10/11 20:34:21 阅读更多 →
基于动态分时电价的电动汽车有序充放电实时优化调度系统详解

基于动态分时电价的电动汽车有序充放电实时优化调度系统详解

做电动汽车充放电调度这个方向,算起来也有不短时间了。从最早单纯追求“充得便宜”,到后来加上V2G反向放电,再到把动态分时电价引入优化过程,每一步都踩过不少坑。今天趁项目收尾,把这套基于动态分时电价的电动汽车有序…

2026/10/11 20:34:21 阅读更多 →
从Excel到ERP:小微商家数字化转型的真实痛点与破局路径(附ROI测算)

从Excel到ERP:小微商家数字化转型的真实痛点与破局路径(附ROI测算)

写在前面网上管家婆成立于1993年,30余年服务超过80万中小客户。在对373家电商客户的调研中,52%的客户属于"初创型"——在引入系统之前只用过打单软件甚至纯靠Excel管理。以下内容从这些客户的真实痛点出发,分析从表格到ERP的转型难…

2026/10/11 20:34:21 阅读更多 →
MySQL中trx_mysql_thread_id为0的真相:XA事务与锁等待排查指南

MySQL中trx_mysql_thread_id为0的真相:XA事务与锁等待排查指南

1. 从一次诡异的锁等待说起 先讲个真实场景。某天中午,线上业务突然出现大量锁等待超时,监控面板上一片红色。当时我第一时间看了 information_schema.innodb_trx ,发现有一条事务状态为 RUNNING ,已经跑了快二十分钟&#xf…

2026/10/11 20:34:21 阅读更多 →
医院六大医疗信息系统集成实战:HIS、LIS、PACS、EMR、RIS、CDR数据流与接口详解

医院六大医疗信息系统集成实战:HIS、LIS、PACS、EMR、RIS、CDR数据流与接口详解

简介:本资源是一份面向医院信息科人员、医疗IT从业者及卫生信息管理专业学习者的系统性入门资料,全面梳理当前主流医疗信息化系统的核心定位、功能模块与协同关系,助力快速建立行业知识框架并支撑系统选型、实施或运维工作。文档为单文件Word…

2026/10/11 20:33:20 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →