新闻详情

新闻详情

首页 / 资讯中心 / 详情

ExternalDNS 配置 NAT64 DNS 记录:让 AAAA 自动生成 NAT64 转换的 A 记录

发布时间:2026/9/25 5:23:09来源:尧图网络
ExternalDNS 配置 NAT64 DNS 记录:让 AAAA 自动生成 NAT64 转换的 A 记录
云原生【免费下载链接】external-dnsConfigure external DNS servers dynamically from Kubernetes resources项目地址https://gitcode.com/gh_mirrors/ex/external-dns点击查看免费下载本篇指南聚焦 external-dns 的--nat64-networks高级配置当集群采用 NAT64 与 SIIT无状态 IP/ICMP 转换方案、IPv6 地址可映射到 IPv4 时如何让 ExternalDNS 为 AAAA 记录自动生成对应的 A 记录实现纯 IPv6 节点同时被 IPv4 网络访问。读完本文你将掌握 NAT64 前缀的规划方法、/96网络的硬性约束、多前缀配置语法以及该功能在源码中的完整实现链路与测试验证方式。NAT64 场景概述为什么 ExternalDNS 需要生成 A 记录在部分 NAT64 部署中DNS 转换完全发生在 Kubernetes 集群之外集群节点只有 IPv6 地址但通过外部 NAT64 网关与 SIIT 设备可以访问 IPv4 地址也能被 IPv4 网络访问。此时 Kubernetes 本身对与 IPv6 地址关联的 IPv4 地址一无所知——集群内的 Ingress、Service 等资源暴露的只有 IPv6 地址。而 Kubernetes 外的 IPv4 客户端要访问这些服务就必须在 DNS 中拿到一个可被 NAT64 网关翻译回 IPv6 的 IPv4 地址。这正是 ExternalDNS 的 NAT64 功能要解决的问题让 ExternalDNS 为落在指定 NAT64 前缀内的每个 AAAA 记录额外生成一个指向 NAT64 转换后 IPv4 地址的 A 记录。这里有一个关键点需要提前澄清nat64source.go中封装了完整的转换逻辑源文档描述的是 create A records for IPv4 addresses而 NAT64 官方文档 中的核心语义是在nat64-networks前缀内的 AAAA 目标会被翻译成对应的 IPv4并额外发布一条 A 记录。功能启用的前提是前缀必须为/96这也是 NAT64 地址嵌入 IPv4 的标准做法RFC 6052 推荐的 Well-Known Prefix 64:ff9b::/96 即为 /96 前缀。配置方法--nat64-networks参数NAT64 功能通过一个命令行参数开启该参数直接传给 external-dns 二进制--nat64-networks2001:db8:96::/96参数说明必须为/96网络该前缀必须是/96不能是/64或其他掩码长度。原因在于 NAT64 将 IPv4 地址嵌入 IPv6 地址的低 32 位一个/96前缀恰好提供了 32 位的嵌入空间与一个/24IPv4 网络容量相同。支持多个网络对于更复杂的拓扑例如多出口、多 NAT64 网关可以使用逗号分隔传入多个前缀--nat64-networks2001:db8:96::/96,64:ff9b::/96参数可重复flag 定义使用b.StringsVar见 pkg/apis/externaldns/types.go也支持在命令行中重复传入该参数每传一次追加一个前缀。未配置时无副作用该参数默认值为空defaultConfig.NAT64Networks为[]string{}见 pkg/apis/externaldns/types.go不配置则不影响任何现有行为A 记录不会被生成。参数帮助文本为Adding an A record for each AAAA record in NAT64-enabled networks; specify multiple times for multiple possible nets (optional)见 docs/flags.md。该参数从命令行解析后会进入配置结构体Config.NAT64Networks类型[]string见 pkg/apis/externaldns/types.go再通过source.NewSourceConfig传递到source.Config见 source/store.go 与 source/store.go最终由 source wrapper 构建器消费。工作机制NAT64 前缀下的地址翻译原理配置生效后ExternalDNS 会在收集到的 endpoints 上执行以下逻辑可对照 source/wrappers/nat64source.go 源码只处理 AAAA 记录nat64Source.Endpoints()遍历上游 source 返回的所有 endpointRecordType不是 AAAA 的直接跳过。检查目标是否落在 NAT64 前缀内将 AAAA 记录的每个目标IPv6 地址与所有已配置的 NAT64 前缀逐一比对只要命中任意一个前缀就认为该记录需要做 NAT64 翻译。提取嵌入的 IPv4 地址取出 IPv6 地址的 16 字节二进制表示ip.As16()截取低 4 字节ipBytes[12:16]这 32 位正是 NAT64 嵌入的 IPv4 地址再将其还原为点分十进制字符串。生成新的 A endpoint深拷贝原 endpointep.DeepCopy()将Targets替换为提取出的 IPv4 地址RecordType改为 A追加到返回列表中。原 AAAA 记录保留原始 AAAA endpoint 不受影响最终返回的 endpoints 同时包含 AAAA 与原 A 记录交由下游 plan 与 provider 处理。前缀解析与硬性校验NewNAT64Source在构造阶段就会对每个传入前缀做严格校验见 source/wrappers/nat64source.go使用netip.ParsePrefix解析非法 CIDR 直接返回错误前缀长度不是 96 时返回错误NAT64 prefixes need to be /96 prefixes测试用例还覆盖了 IPv4 地址作为前缀192.0.2.0/24必须失败的情况见 source/wrappers/nat64source_test.go。因此如果误传/64前缀或非 CIDR 字符串external-dns 启动时就会报错退出而不是静默忽略。在 wrapper 流水线中的位置NAT64 是 ExternalDNS source 流水线中的一个 wrapper中间件其构建逻辑位于 source/wrappers/build.go 与 source/wrappers/types.goMultiSource聚合多个 source → DedupSource去重 → NAT64Source仅当配置了 nat64-networks 时挂载 → TargetFilterSource目标网段过滤可选 → PTRSource反向记录可选 → PostProcessorTTL、alias 等后处理wrapSources中只有当len(opts.nat64Networks) 0时才会创建NAT64Source并登记 wrapper 名为nat64用于可观测性。也就是说NAT64 翻译发生在去重之后、目标过滤与后处理之前生成的 A 记录会继续经过后续 wrapper 的统一处理如 TTL 归一化、provider 特定属性的过滤。配置示例SIIT NAT64 混合网络的完整设置以下示例来自 官方文档完整展示了推荐的拓扑。网络拓扑集群外部署 NAT64 解析器与 SIIT无状态 IP/ICMP 转换节点只有 IPv6 地址但既能访问 IPv4 地址也能被 IPv4 网络访问出站连接经典 NAT64 模式所有 IPv6 地址被翻译到一个较小的 IPv4 地址池入站连接映射到另一个独立的 IPv4 池例如198.51.100.0/24与 IPv6 地址一一对应翻译。地址规划为入站翻译专门划分一个/96网络例如2001:db8:96::/96198.51.100.0/24这个 IPv4 段可以一一映射到2001:db8:96::c633:6400/120注意/120IPv6 网络包含的地址数量与/24IPv4 网络完全相同都是 256 个地址/120提供 8 位后缀/24提供 8 位主机位这是一一映射能够成立的前提。地址对应关系以198.51.100.10为例两种等价的表示方式2001:0DB8:96::198.51.100.10点分十进制嵌入形式2001:db8:96::c633:640a十六进制形式198c6513310064100aNAT64 网关与 SIIT 设备都能识别这一映射关系将2001:db8:96::c633:640a翻译为198.51.100.10。ExternalDNS 配置将整个/96网络配置为nat64-networks--nat64-networks2001:db8:96::/96当任何 sourceIngress、Service、Gateway、CRD 等产生指向2001:db8:96::c633:640a的 AAAA 记录时ExternalDNS 会默认生成一条 AAAA 记录目标为2001:db8:96::c633:640a同时生成一条 A 记录目标为翻译后的198.51.100.10。结果就是IPv4 网络中的客户端通过查询 A 记录获得198.51.100.10将流量发送到该地址NAT64/SIIT 设备再将其翻译为2001:db8:96::c633:640a送达集群内的 IPv6-only 服务。整个过程对 Kubernetes 是透明的集群不需要感知 IPv4 的存在。源码验证转换逻辑与测试用例转换算法核心代码地址翻译的关键代码段位于 source/wrappers/nat64source.gofor _, target : range ep.Targets { ip, err : netip.ParseAddr(target) if err ! nil { return nil, err } var sPrefix *netip.Prefix for _, cPrefix : range s.nat64Prefixes { if cPrefix.Contains(ip) { sPrefix cPrefix } } // 如果目标不在任何 NAT64 前缀内跳过该记录 if sPrefix nil { continue } ipBytes : ip.As16() v4AddrBytes : ipBytes[12:16] // 提取低 32 位即嵌入的 IPv4 地址 v4Addr, ok : addrFromSlice(v4AddrBytes) ... v4Targets append(v4Targets, v4Addr.String()) }测试用例覆盖的行为source/wrappers/nat64source_test.go 中的测试验证了以下行为场景输入预期输出非 NAT64 前缀内的 IPv6AAAA2001:db8:1::1仅保留原 AAAA不生成 A 记录NAT64 前缀内的 IPv6点分十进制嵌入AAAA2001:db8::192.0.2.42AAAA 保留 A 记录192.0.2.42NAT64 前缀内的 IPv6十六进制嵌入AAAA2001:db8::c000:22aAAAA 保留 A 记录192.0.2.42c000:22a192.0.2.42非 AAAA 记录A10.10.10.11原样返回不处理非法 IPv6 目标AAAAnot-an-ip返回解析错误错误前缀2001:db8::/64、192.0.2.0/24、invalid-prefix构造 NAT64 source 时返回错误此外 source/wrappers/build_test.go 验证了在NAT64Networks配置为合法/96前缀时 wrapper 流水线能正常构建而非法 CIDRnot-a-cidr会导致构建失败见 source/wrappers/build_test.go。这些测试同时印证了转换逻辑只对 AAAA 生效、A 记录是附加生成的、错误配置会被严格拒绝。与其他高级配置的协同与限制与目标过滤target-net-filter的配合NAT64 wrapper 位于TargetFilterSource之前见 source/wrappers/types.go因此新生成的 A 记录目标同样会接受后续的目标网段包含/排除过滤--target-net-filter/--exclude-target-net。如果希望对生成的 A 记录做进一步筛选可以组合使用这些参数。与 PTR 记录的配合PTRSource在 NAT64 wrapper 之后挂载source/wrappers/types.go意味着生成的 A 记录同样可能触发反向 PTR 记录生成在--create-ptr或相应注解开启的前提下。已知限制仅 AAAA → A 单向转换该功能只处理 AAAA 记录并追加 A 记录不会反向为 A 记录生成 AAAA必须是/96前缀长度校验是硬性的不符合会在启动时报错不改变原始记录原始 AAAA endpoint 始终保留A 记录是额外追加而非替换目标必须是合法 IPv6 地址如果 AAAA 记录的目标字符串无法解析为 IP整个Endpoints()调用会返回错误这一点与测试用例中的行为一致。参考资源NAT64 配置文档本文的核心依据NAT64 source wrapper 实现转换算法与前缀校验源码NAT64 wrapper 测试行为与边界用例验证Wrapper 构建逻辑 与 wrapSources 实现wrapper 流水线编排参数定义--nat64-networksflag 解析参数速查flags 文档中的参数说明Source wrappers 综述wrapper 架构的完整背景赞分享云原生【免费下载链接】external-dnsConfigure external DNS servers dynamically from Kubernetes resources项目地址https://gitcode.com/gh_mirrors/ex/external-dns点击查看免费下载相关推荐Lucky DNS记录类型详解A/AAAA/CNAME/MXDDNS配置正确姿势Lucky DNS记录类型详解A/AAAA/CNAME/MXDDNS配置正确姿势 你是否还在为家庭网络中动态IP导致服务访问困难而烦恼是否在配置DNS记录后端网络通信终极DNS记录类型解析指南从A到AAAA全掌握轻松理解DNS工作原理终极DNS记录类型解析指南从A到AAAA全掌握轻松理解DNS工作原理 DNS域名系统是互联网的核心基础设施负责将人类可读的域名转换为计算机可理解的IP教程示例工程上一篇Maka Agent开发者指南如何为这款本地AI助手开发自定义技能下一篇从零到部署基于next-forge构建高性能电商平台实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

ESP8266红外万能遥控器接入Home Assistant实战 2026/9/25 6:40:53

ESP8266红外万能遥控器接入Home Assistant实战

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

阅读更多 →
Ubuntu自动休眠禁用全链路指南:DPMS/GNOME/systemd三层配置 2026/9/25 6:40:53

Ubuntu自动休眠禁用全链路指南:DPMS/GNOME/systemd三层配置

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

阅读更多 →
基于ROS2的SLAM算法对比仿真:环境搭建与轨迹误差分析 2026/9/25 6:40:53

基于ROS2的SLAM算法对比仿真:环境搭建与轨迹误差分析

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

阅读更多 →
Vue 实现上一题下一题问答功能:数据驱动与边界处理实战 2026/9/25 6:40:53

Vue 实现上一题下一题问答功能:数据驱动与边界处理实战

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

阅读更多 →
2026年度天津防水材料行情盘点:好工匠TPO卷材性能优势与泳池、隧道工程案例 2026/9/25 6:40:53

2026年度天津防水材料行情盘点:好工匠TPO卷材性能优势与泳池、隧道工程案例

天津防水材料行业基础科普防水材料是建筑工程的隐形防护衣,主要作用是阻隔水的渗透,避免建筑结构被水侵蚀,保障建筑使用空间与结构寿命。按产品形态划分,当前市场主流防水材料可分为几大类: 防水涂料:分为柔…

阅读更多 →
5个IO驱动20灯的硬件边界与工程实现 2026/9/25 6:40:34

5个IO驱动20灯的硬件边界与工程实现

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

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉