Open-GeoIP:超简单的开源 IP 地址位置查询服务
前言
在线查询 IP 地址的网站好像到处都有,在线网络测速的网站也非常的多。然而如果考虑开源版本的话,网络测速有 librespeed/speedtest ,IP 地址查询似乎并没有对应的项目,是没有这个需求吗?
至少我们有这个需求,大概在 2012 年开始,我们就在学校内部提供在线的 IP 地址查询服务,主要满足这几个方面:
面向用户的互联网 IP 地址查询 —— 查询界面
面向用户的 myip 地址查询,也就是看自己的 IP —— 查询界面
学校范畴的 IP 地址区分,也就是通过 IP 查询服务器区分“内网”,“外网”。学校有好多公网 IP 的。
面向物联网终端的 myip 地址查询 —— myip 的接口
面向第三方应用的 IP 地址查询 —— ip 查询接口
要支持 IPv6
10 年后,我们把这块的业务代码进行了重构,并且开源了 —— ECNU/open-geoip 。
快速体验
体验 Open-GeoIP 非常简单,下载我们打包好的 Releases ,解压直接运行即可
此时访问服务器的 80 端口应该就可以看到服务。
Release 中使用了内置的数据库文件来自于 ipdb-go 所提供的 city.free.ipdb
。它仅供测试,不能保障数据的准确性。如果想要尝试最新的 ipdb
试用数据,可以在https://www.ipip.net/product/client.html 下载更新的试用版,但注意不可以用于正式商业用途。
生产环境
考虑生产环境,我们需要一个可以持续更新的 IP 地理信息数据库。Open-GeoIP 可以支持 maxmind 的 GeoLite2 数据库并且支持自动更新,因此我们只需要在注册一个 maxmind
的账号,获得一个 LicenseKey ,并将他配置到 cfg.json
中的 AutoDownload.MaxmindLicenseKey
中,或者配置到系统环境变量 MAXMIND_LICENSE_KEY
中即可。
修改配置文件的这部分,开启 autoDownload
的 enbaled
选项,并配置好你的 licenseKey
。将数据源替换为 maxmind
。由于我们采取自动更新获取 maxmind
的数据库,因此 db
部分不需要配置了。
重启服务,此时应该会自动下载 GeoLite2-City.mmdb
并每 24 小时检查一次更新。
systemctl 托管
在生产环境中,我们最好使用 systemctl
来托管服务,项目仓库内已经写好了一个参考的配置文件。假定项目部署在 /opt/open-geoip
目录下,如果部署在其他目录修改 open-geoip.service
中的 WorkingDirectory
和 ExecStart
两个字段即可。
更多数据库支持
maxmind 的数据库虽然很好而且免费,然而它在大陆地区的精度确实不敢恭维,最大的优势可能就是支持 ipv6 了。如果我们采购了商业的 IP 地址库资源,例如 www.ipip.net
或者 https://www.qqzeng.com
,那么可以将对应的 source
源修改为 ipdb
或者 qqzengip
,并在 db
内配置对应的数据库文件路径。Open-GeoIP 就会将对应的请求通过该数据库来查询。
更多数据库的支持,欢迎在 [Feature]更多数据源支持 · Issue #7 中反馈。
API 接口
除了直接面向用户的界面查询之外,Open-GeoIP 设计了一系列的接口来更好为各类物联网终端,第三方应用提供支持。
myip
myip 的接口用于返回请求者的 IP 地址,对于一些无浏览器的终端,可以使用这个接口方便的获取自身的 IP 地址信息(特别是 nat 后的)。
它也可以被配置了 CORS 的网站通过前端调用, 提供了简单字符串与 json 格式化两种风格接口。
openapi
openapi 接口面向第三方应用,提供了一个 IP 地址的查询接口,通过 X-API-KEY 进行授权校验。
在我们的实际环境李,我们通过 API 网关做进一步的代理封装,从而授权分发给不同的租户。
request
response
brenchmark
基于 maxmind
数据库进行的 web
服务性能测试
鸣谢
本项目的一些主要功能使用了以下开源项目,更多的依赖详见 open-geoip/go.mod 文件。
感谢他们的开源精神。
web
服务 —— ginmaxmind
解析 —— geoip2-golangmaxming
自动更新 —— go-geoipipdb
解析 —— ipdb-goqqzengip
解析 —— qqzeng-ip
版权声明: 本文为 InfoQ 作者【冯骐】的原创文章。
原文链接:【http://xie.infoq.cn/article/302561070f44f28496f9c0937】。
本文遵守【CC BY-SA】协议,转载请保留原文出处及本版权声明。
评论