判断 IP 是否为境内,有什么推荐的方案

2023-04-30 14:00:50 +08:00
 myqoo

要考虑两点,第一是网段的准确性 /实时性,第二是判断性能。

简单搜了下公开的数据,发现 github 有个 china_ip_list 的项目:

https://github.com/17mon/china_ip_list/blob/master/china_ip_list.txt

不过实时性好像不是很高(写着季度更新),不知质量如何。是否还有其他更好的推荐?


第二个是判断性能。之前用过 nodejs 自带的 BlockList,虽然用起来很简单,但后来发现性能并不好,看了下源码才知道它居然是逐条匹配的,没有任何算法优化。

之前也有人反馈过这个问题: https://github.com/nodejs/node/issues/46070

看来目前还是得用 C 写一个 node addon 扩展。

此外,这个算法只用于查询,并没有增删改,并且 CIDR 的范围也是 2 的次方数,是否可进一步优化?

6880 次点击
所在节点    程序员
43 条回复
Actrace
2023-04-30 19:19:44 +08:00
jsq2627
2023-04-30 21:47:18 +08:00
如果只是想要判断境内,不需要更详细的地理位置,可以用 APNIC 公开的数据,免费,准确,实时
http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest

关于性能,可以尝试自己用:
https://github.com/metowolf/ipdb-packer/blob/master/index.js
把上面数据打包成 ipdb 格式,用 https://www.npmjs.com/package/ipdb 解析
kernelpanic
2023-04-30 21:49:01 +08:00
ipv4 早就分配完了,已经分给哪个国家的就是哪个国家了,没有实时性一说
chinafeng
2023-04-30 21:56:03 +08:00
@kernelpanic #23 IP 地址虽然在 RIR 那几乎分配完毕,但是在二级市场的交易和租用相当活跃
zelin44913
2023-04-30 22:32:50 +08:00
http://ip.bczs.net/country/CN
一直用的这里的数据,实时性挺高的
benedict00
2023-04-30 23:17:49 +08:00
realpg
2023-05-01 00:26:32 +08:00
世界加钱可及
JensenQian
2023-05-01 07:22:53 +08:00
https://ispip.clang.cn/
这个试下
每日更新
sora2blue
2023-05-01 08:26:18 +08:00
xw
2023-05-01 09:57:38 +08:00
alamak76
2023-05-01 09:59:05 +08:00
myqoo
2023-05-01 11:05:43 +08:00
@pagxir
@jsq2627 这个不错!有点不明白的是既然 APNIC 都提供数据了,为什么还有 china_ip_list 这样的项目,不知这类项目有什么特殊的地方,还有这么多人用。
myqoo
2023-05-01 11:10:59 +08:00
@pagxir 上一条回复 @错了。本来想说你这个代码还可以精简下,把_net_list 变成一个 uint32array + uint8array 看起来可以美观些,初始化和运行性能也可以高一点点。
Kinnice
2023-05-01 11:33:34 +08:00
@myqoo 更准
Kinnice
2023-05-01 11:35:22 +08:00
eg: 202.95.9.1 实际为 hkip ,你看有多少个 ip 库将其识别为内地 ip
Greatshu
2023-05-01 13:08:00 +08:00
判断能否访问大,纪,元,这个比谷歌更准确
jsq2627
2023-05-01 13:16:13 +08:00
@myqoo APNIC 只是按照属地原则分配了 IP 所属国家,比如楼上提到的 202.95.9.1 按照 APNIC 是分配到了 SG ,SGNIC 再分配到本地一家 ISP ,但是这家 ISP 在 HK 也有数据中心,把这个 IP 实际用在了 HK 。再比如 Apple 拥有整个 17.0.0.0/8 段,服务器遍布全球各地,但是这段 IP 都不在 APNIC 的分配列表里,因为它都不属于 APNIC 管辖。

但是如果你的需求只是判断大陆 IP ,用 APNIC 的列表是相对准确的,因为 CNNIC 强制要求各大 ISP 只能广播 CNNIC 分配的 IP 。
SteveLi77
2023-05-01 13:30:59 +08:00
所有套了 cloudflare 的网站都可以在 hostname/cdn-cgi/trace 中找到 loc
rozbo
2023-05-01 16:25:19 +08:00
套个 cloudflare ,可以直接 block area ,如果还想更细粒度的控制,就开启下 addon header ,不但能获取到国家,城市,连经纬度都可以获取。
miaomiao888
2023-05-01 16:30:03 +08:00
@xw 点进去看到 CF 的中文名原来叫“科赋锐”...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/936578

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX