判断网站访问者 IP 地址是否来源于中国
赛博菩萨 Cloudflare 的 R2 存储外出流量不要钱,还有免费的 10GB 存储空间,所以我很早就把存储搬到国外了。但是我在国内实际测试发现 R2 访问不稳定,所以为了区别加速,就需要判断访问者的 IP 地址是否来源于中国。如果是,就走国内的对象存储;如果不是,通通走 R2。
在不借助外部工具、服务的情况下,可以自己从 亚太互联网络信息中心(Asia-Pacific Network Information Centre,APNIC) 找到所有分配给中国的地址段,然后判断目标 IP 地址是否在范围内即可。(部分群体对这个数据库应该非常熟悉)
纯文本数据库地址:http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest。
这个数据库表格的数据始终是最新的。数据格式大概长这样:
1 2 3 4 5 6 7 |
|
过滤出包含“|CN|ipv4|”的行就能得到中国所有的 IPv4 地址网段(CIDR)。
CIDR(即 IPv4 ➕️ Prefix length)一共是 5️⃣ 个字节,为了节省空间,我把它们直接用二进制方式写到文件中了,而不是用 ASCII 一行一个的方式。
文件最终的大小是 40KB,足够小巧到可以无压力地直接嵌入到程序二进制内。远小于网上找到的各种什么 geoip 地址库(比如:GeoLite.mmdb)。当然,我这种做法仅限于判断 IP 所属国家是否是中国,更不含具体的省市等信息。但是对于我的需求来说,足够了,而且数据还是精确的。
判断 IP 地址是否在 CIDR 集合内有很多现成的高效的实现,比如最常用的:前缀树/基数树/Trie。