Opti Hosts:不止 Cloudflare,根据延迟优选 IP

这几天搓了一个 小而美的 小工具,用于对付一些刁钻的 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,大概像这样:

1
2
3
4
5
6
7
8
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(逃

使用 Hugo 构建
主题 StackJimmy 设计