EDNS 与 bufsize 是什么
传统 DNS 规定 UDP 响应不超过 512 字节,超出只能置 TC 标志让客户端改用 TCP 重查。EDNS(0)(RFC 6891)允许双方在 OPT 段协商更大的 UDP 载荷,常用的安全上限是 1232 字节,可以避免在路径 MTU 较小的链路上被分片丢弃。『小域名正常、记录多的域名间歇失败』往往就是大 UDP 响应被中间设备拦掉。
基本信息
| 适用平台 | 所有 DNS 客户端与服务器;dig 提供 +bufsize 与 +noedns |
|---|---|
| 传统上限 | 512 字节,超出置 TC 标志改用 TCP |
| 推荐值 | 1232 字节,规避路径 MTU 导致的分片问题 |
| 关键标志 | OPT 段(EDNS 协商)、tc 标志(响应被截断) |
典型使用场景
- 部分域名解析失败而其他正常:用不同 bufsize 对比确认是否为大包被拦
- DNSSEC 环境解析异常:签名字段显著增大响应体积,更容易触发分片问题
- TXT 记录较多的域名:记录集合越大,超过 512 字节的概率越高
- 老旧设备兼容性验证:用 +noedns 做对照,确认设备是否对 EDNS 处理异常
缓冲区与 EDNS 测试
缓冲区与 EDNS 测试
# 强制小缓冲:出现 tc 标志说明响应已超限
dig +bufsize=512 example.com
# 常用安全值,避免路径分片
dig +bufsize=1232 example.com
# 关闭 EDNS 做对照,观察中间设备行为差异
dig +noedns example.com
# 直接观察 OPT 段是否存在
dig +bufsize=1232 example.com | grep -A2 OPT关键元素判读
| 元素 | 含义 | 异常指向 |
|---|---|---|
| OPT 段 | EDNS 协商信息:版本、UDP 大小、DO 位 | 缺失说明对端未启用 EDNS,可能回退到 512 |
| tc 标志 | 响应被截断,需要 TCP 重查 | 频繁出现说明链路限制了 UDP 大包 |
| 1232 | 主流推荐的 UDP 载荷上限 | 设得更大在部分链路上更易被丢弃 |
| DO 位 | 请求 DNSSEC 相关记录 | DNSSEC 排查时需要显式关注 |
判断大包是否被拦的对照法:对同一域名分别用 +bufsize=512 与默认值查询。512 成功而默认失败,基本可以确认中间设备丢弃了较大的 UDP 响应。
把 bufsize 一味设大(如 4096)并不更稳:响应更容易超过路径 MTU 而被分片或丢弃,实践中 1232 是兼顾兼容性与体积的通用折中值。