前语
在线查询 IP 地址的网站好像处处都有,在线网络测速的网站也非常的多。但是假如考虑开源版本的话,网络测速有 librespeed/speedtest ,IP 地址查询似乎并没有对应的项目,是没有这个需求吗?
至少咱们有这个需求,大概在2012年开端,咱们就在校园内部供给在线的IP地址查询服务,首要满意这几个方面:
- 面向用户的互联网 IP 地址查询 —— 查询界面
- 面向用户的 myip 地址查询,也便是看自己的IP —— 查询界面
- 校园领域的IP地址区分,也便是通过IP查询服务器区分“内网”,“外网”。校园有好多公网IP的。
- 面向物联网终端的 myip 地址查询 —— myip 的接口
- 面向第三方使用的 IP 地址查询 —— ip 查询接口
- 要支撑 IPv6
10年后,咱们把这块的事务代码进行了重构,并且开源了 —— ECNU/open-geoip 。
快速体会
体会 Open-GeoIP 非常简略,下载咱们打包好的 Releases ,解压直接运行即可
tar -zxvf open-geoip-0.1.0-linux-amd64.tar.gz
cd open-geoip/
./control start
此刻访问服务器的 80 端口应该就能够看到服务。
Release 中使用了内置的数据库文件来自于ipdb-go所供给的city.free.ipdb
。它仅供测验,不能保障数据的准确性。假如想要尝试最新的 ipdb
试用数据,能够在www.ipip.net/product/cli… 下载更新的试用版,但留意不能够用于正式商业用途。
出产环境
考虑出产环境,咱们需要一个能够继续更新的 IP 地理信息数据库。Open-GeoIP 能够支撑 maxmind 的 GeoLite2 数据库并且支撑主动更新,因而咱们只需要在注册一个maxmind
的账号,取得一个LicenseKey,并将他装备到cfg.json
中的AutoDownload.MaxmindLicenseKey
中,或许装备到系统环境变量MAXMIND_LICENSE_KEY
中即可。
修正装备文件的这部分,开启 autoDownload
的 enbaled
选项,并装备好你的 licenseKey
。将数据源替换为 maxmind
。由于咱们采纳主动更新获取 maxmind
的数据库,因而 db
部分不需要装备了。
"db": {
"maxmind": "",
"qqzengip": "",
"ipdb":""
},
"source": {
"ipv4": "maxmind",
"ipv6": "maxmind"
},
"autoDownload":{
"enabled":true,
"MaxmindLicenseKey":"your-license-key",
"targetFilePath":"",
"timeout":3,
"interval":24
},
重启服务,此刻应该会主动下载 GeoLite2-City.mmdb
并每 24 小时查看一次更新。
./control restart
systemctl 保管
在出产环境中,咱们最好使用 systemctl
来保管服务,项目仓库内已经写好了一个参阅的装备文件。假定项目布置在/opt/open-geoip
目录下,假如布置在其他目录修正open-geoip.service
中的WorkingDirectory
和ExecStart
两个字段即可。
cp open-geoip.service /etc/systemd/system/
systemctl daemon-reload
systemctl enable open-geoip
systemctl start open-geoip
更多数据库支撑
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 格式化两种风格接口。
# curl http://localhost/myip
# 192.168.0.100
# curl http://localhost/myip/format
# {"errCode":0,"errMsg":"success","requestId":"0f40823e-04ce-4def-9af2-71e7e1403ec8","data":{"ip":"192.168.0.100"}}
openapi
openapi 接口面向第三方使用,供给了一个 IP 地址的查询接口,通过 X-API-KEY 进行授权校验。
在咱们的实践环境李,咱们通过 API 网关做进一步的代理封装,然后授权分发给不同的租户。
- request
curl -H "X-API-KEY: this-is-key" http://localhost/api/v1/network/ip?ip=2001:da8:8005:a405:250:56ff:feaf:8c28
- response
{
"errCode": 0,
"errMsg": "success",
"requestId": "7ead62f7-3f15-4822-ad1e-cf7915a8299f",
"data": {
"ip": "2001:da8:8005:a405:250:56ff:feaf:8c28",
"continent": "亚洲",
"country": "中国",
"province": "上海",
"city": "上海",
"district": "",
"isp": "",
"areaCode": "",
"countryEnglish": "China",
"countryCode": "CN",
"longitude": "121.458100",
"latitude": "31.222200"
}
}
benchmark
根据maxmind
数据库进行的 web
服务功能测验
# go test -bench=. -benchmem
goos: linux
goarch: amd64
pkg: github.com/ECNU/open-geoip
cpu: Intel(R) Xeon(R) Platinum 8369B CPU @ 2.70GHz
BenchmarkIndex-2 244190 4271 ns/op 10000 B/op 15 allocs/op
BenchmarkSeachAPIForIPv4-2 782768 1741 ns/op 1904 B/op 15 allocs/op
BenchmarkSeachAPIForIPv6-2 818250 1744 ns/op 1904 B/op 15 allocs/op
BenchmarkOpenAPIForIPv4-2 394813 3383 ns/op 2592 B/op 23 allocs/op
BenchmarkOpenAPIForIPv6-2 391868 3378 ns/op 2592 B/op 23 allocs/op
PASS
ok github.com/ECNU/open-geoip 7.044s
鸣谢
本项目的一些首要功能使用了以下开源项目,更多的依靠详见“open-geoip/go.mod 文件。
感谢他们的开源精神。
-
web
服务 ——gin -
maxmind
解析 ——geoip2-golang -
maxming
主动更新 ——go-geoip -
ipdb
解析 ——ipdb-go -
qqzengip
解析 ——qqzeng-ip
原文链接:【xie.infoq.cn/article/302…】。
本文遵守【CC BY-SA】协议,转载请保留原文出处及本版权声明。