DNS LOC 资源记录(Resource Record,RR 类型 29)提供了一种标准化方式,将精确的地理坐标直接嵌入域名系统中,实现自托管的位置解析。这避免了对外部 geo-IP 数据库的依赖,尤其适用于需要高精度位置信息的场景,如网络管理可视化、应急服务路由或自建 CDN 节点定位。相较于常见的 A/AAAA 记录结合 geo-IP 查询,LOC RR 将 lat/long/alt 等信息原生存储在 zone 文件中,支持秒级精度和米级误差半径,解析效率更高且数据一致性强。
LOC RR 的核心在于其紧凑的二进制编码和人类可读的 zone 文件格式。根据 RFC 1876,该记录固定 16 字节:VERSION(必须为 0)、SIZE(包围球直径,XeY cm)、HORIZ PRE(水平精度,直径 XeY cm)、VERT PRE(垂直精度,总误差 XeY cm)、LATITUDE/LONGITUDE(32 位整数,thousandths of arcsecond,自赤道/本初子午线起正北/东)、ALTITUDE(cm,从 WGS-84 椭球 -100km 基准起)。
在 zone 文件中,LOC 使用 DMS(度分秒)格式书写,便于直接编辑。语法为:<owner> <TTL> <class> LOC ( d1 [m1 [s1]] {N|S} d2 [m2 [s2]] {E|W} alt[m] [siz[m]] [hp[m]] [vp[m]] )。省略部分使用默认值:m/s=0、siz=1m、hp=10000m(邮编级)、vp=10m。这些默认值模拟典型区域大小,确保兼容性。
要从十进制度(decimal degrees)转换为 DMS,首先计算总弧秒:纬度弧秒 = lat * 3600 * 1000,经度同理(范围 lat ±90,经度 ±180)。然后:deg = floor(total / 3600000),min = floor((total % 3600000) / 60000),sec = (total % 60000) / 1000。方向:lat>0 N else S,经度>0 E else W。举例,北京 (39.9042° N, 116.4074° E):纬度总弧秒 = 39.9042 * 3600000 ≈ 143654880,deg=39, min=54, sec=15.12 → 39 54 15.120 N;经度类似 116 24 26.640 E。海拔约 30m,size=100m(hp/vp 默认)。
实际 zone 文件示例:
beijing.example.com. 3600 IN LOC 39 54 15.120 N 116 24 26.640 E 30m 100m 100m 10m
这里 size=100m 表示包围球直径 100m,hp=100m(水平圆误差直径),vp=10m(垂直总误差)。XeY 编码规则:值 cm = base * 10^exp,base/exP 各 4bit (0-9),如 100m=10000cm=1*10^4 → 0x14。BIND 等解析器自动转换,无需手动十六进制。
配置落地清单:
- 坐标准备:使用工具如 dnsloc.net 或脚本转换 decimal → DMS。脚本示例(Python):
def dms(deg):
sign = 'N' if deg >= 0 else 'S'
deg = abs(deg)
d = int(deg)
m = int((deg - d) * 60)
s = ((deg - d - m/60) * 3600) * 1000 / 1000
return f"{d} {m:02d} {s:06.3f} {sign}"
lat_dms = dms(39.9042)
lon_dms = dms(116.4074)
print(f"LOC {lat_dms} {lon_dms} 30m 100m")
- zone 文件编辑:在 BIND/NSD 等权威服务器 zone 中添加 LOC RR,重载配置(rndc reload)。
- 验证:
dig beijing.example.com LOC 或 host -t LOC,确认输出 DMS 格式。工具如 dnsloc.net 可视化解析。
- 精度参数调优:
| 参数 |
含义 |
示例值 |
XeY 码 |
| size |
包围球直径 |
1m / 1km |
0x12 / 0x16 |
| hp |
水平误差直径 |
10m / 100m |
0x13 / 0x14 |
| vp |
垂直总误差 |
1m / 10m |
0x12 / 0x13 |
| 选择依据:GPS 民用 ~10m,建筑物级 1m;全球默认 0x29 (20,000km)。 |
|
|
|
- 监控与回滚:Prometheus + dig 监控 LOC TTL/解析成功率;风险:高精度泄露位置,建议结合 ACL 限制查询;回滚:移除 LOC,回落 geo-IP。
应用场景:网络拓扑可视化(visual traceroute),用 LOC 生成地图路径;边缘计算节点定位,自建 geoDNS 无需 MaxMind 等订阅。相比 geo-IP,LOC 零延迟、精确到 cm、无隐私争议(可选不公布)。
局限:支持率低(BIND/dig 支持好,浏览器少);未加密,建议 DNSSEC 签名。未来 IPv6/HTTP3 场景,或成标配。
资料来源:
(本文约 1200 字)