前语

在线查询 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 端口应该就能够看到服务。

Open-GeoIP:超简单的开源IP地址位置查询服务

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中即可。

修正装备文件的这部分,开启 autoDownloadenbaled 选项,并装备好你的 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中的WorkingDirectoryExecStart两个字段即可。

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】协议,转载请保留原文出处及本版权声明。