这几天搓了一个 小而美的 小工具,用于对付一些刁钻的 CDN 域名分区解析策略,大概是通过调 Globalping 的 API 得到域名在其他区域的解析结果,然后选择 ICMP 延迟最低的 IP 写入本地 hosts 文件
代码:Zhousiru/opti-hosts,中文 README.md
预构建的二进制可以在 Releases 下载
Why
家里电视连海外的某 Emby 媒体服务器,Emby 域名本身配置了分区解析到 HK 和 US 的 CDN 节点,但是线路依旧不太行,晚高峰 QoS 很严重,又不舍得用机场的流量,就在 HK VPS 上搞了个反代,经隧道连到境内的 VPS 中转,再隧道回家。
结果发现在境内 Emby 的域名解析到了 HK 的节点(~60 ms),而在 HK VPS 上却解析到了 US 的节点(~150 ms)Σヽ(゚Д ゚; )ノ
不知道是不是故意这么配置的。。我就在反代配置中直接写了 HK CDN 节点的 IP,手动加上 Host header,一开始很好用,不过后来结果也在预料之中:IP 失效,只能手动换 IP,这种定时维护也太麻烦了。
所以就搓了这么一个小工具来自动测量 IP 和延迟,更新 hosts。类似于“Cloudflare 优选”,但这个工具不局限于套 CF 的域名,也不内置 CF 的 CIDR,是靠 Globalping 测量各地的解析结果。
有趣的小细节
开脑洞把工具的配置结合到了现有的 hosts 文件里面,试着用 pest 定义了一个小小的 DSL,称为 hosts directive,大概像这样:
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
# OPTI-HOSTS example.com [Beijing, HK * 2, AS6939]
23.192.228.84 example.com
# 👆 这是生成的 hosts 记录
不需要额外的配置文件,直接运行一下 opti-hosts 就更新好了,是不是很简洁呢(x
(虽然用正则解析也完全 OK,但就是想试试 parser generator 233)
一些局限
Globalping 在不登陆的情况下限制每个 IP 一小时内最多创建 250 次查询,登陆后带上 token 可以提升到 500 次(虽然现在的版本没有提供设置 token 的选项 233333)
另外,虽然提到了 Cloudflare 优选,但是和它的原理不同,Opti Hosts 选择 IP 的依据仅仅是 ping 测得的延迟,没有考虑 TCP 延迟和带宽等等因素(也没法考虑),不过大部分情况下应该没有问题,够用
目前只提供 AMD64 & ARM64 架构 Linux 的预构建版本,Windows 和 macOS 需要自己 build(逃