open-geoip

IP 地址地理信息查询服务
授权协议 Apache
开发语言 Google Go
所属分类 管理和监控、 无线网络工具
软件类型 开源软件
地区 国产
投 递 者 潘宸
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

Open-GeoIP 是一个简单且高性能的 IP 地址地理信息查询服务

安装运行

二进制直接运行

release 中下载最新的 [release] 包,解压后直接运行即可。

注意:release 中内置的数据库文件来自于 ipdb-go 中的 city.free.ipdb,仅供测试使用,不保证数据的准确性。

如应用于生产环境,请获取商用授权,或者注册 maxmind 的账号后,获取免费版的 GeoLite2-City.mmdb 数据库文件,并更新配置文件替换数据源为 maxmind

tar -zxvf open-geoip-0.1.0-linux-amd64.tar.gz
cd open-geoip/
./control start

访问你服务器的 80 端口即可使用。

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

如果需要自动更新 mmdb 数据库,只需要在注册一个 maxmind 的账号,获得一个 LicenseKey ,并将他配置到 cfg.json 中的 AutoDownload.MaxmindLicenseKey 中,或者配置到系统环境变量 MAXMIND_LICENSE_KEY 中即可。

编译打包

git clone https://github.com/ECNU/open-geoip.git
cd open-geoip/
chmod +x control
./control pack

定制页面

修改 templates 目录下的 index.html 即可,相关资源文件在 assets 目录下。

配置说明

根据 cfg.json.example 文件,创建 cfg.json 文件,再进一步根据自己的需要修改配置。

{
    "logger": {
        "dir": "logs/",
        "level": "DEBUG",
        "keepHours": 24
    },
    "campus": {
        "continent": "亚洲",
        "country": "中国",
        "province": "上海",
        "city": "上海",
        "district": "华东师范大学",
        "isp": "校园网",
        "areaCode": "310000",
        "countryEnglish": "China",
        "countryCode": "CN",
        "longitude": "",
        "latitude": "",
        "ips": [
            "10.0.0.0/8",
            "192.168.0.0/16",
            "172.16.0.0/12"
        ]
    },
    "db": {
        "maxmind": "GeoLite2-City.mmdb",
        "qqzengip": "",
        "ipdb":""
    },
    "source": {
        "ipv4": "maxmind",
        "ipv6": "maxmind"
    },
    "autoDownload":{
        "enabled":false,
        "MaxmindLicenseKey":"",
        "targetFilePath":"",
        "timeout":3,
        "interval":24
    },
    "http": {
        "listen": "0.0.0.0:80",
        "trustProxy": ["127.0.0.1", "::1"],
        "cors":["http://localhost"],
        "x-api-key": "this-is-key"
    }
}
配置项 类型 说明
logger object 一个包含日志设置的部分
logger.dir string 存储日志文件的目录
logger.level string 日志的级别,比如DEBUG, INFO, WARN, 或ERROR
logger.keepHours number 保留日志文件的小时数,之后删除
campus object 一个包含园区内网信息的部分
campus.continent string 园区所在的洲
campus.country string 园区所在的国家
campus.province string 园区所在的省份
campus.city string 园区所在的城市
campus.district string 园区所在的区县(行政区)
campus.isp string 园区的ISP运营商
campus.areaCode string 园区所在的行政区划代(国内部分)
campus.countryEnglish string 园区所在国家的英文名
campus.countryCode string 园区所在国家的国家代码
campus.longitude string 园区的经度
campus.latitude string 园区的纬度
campus.ips array 属于该园区的IP范围的数组,命中这部分的IP地址,将使用配置文件中的内容进行返回
db object 一个包含数据库设置的部分
db.maxmind string MaxMind GeoLite2数据库的文件的路径,如果 autDownload 配置为 true,那么这里的配置不会生效
db.qqzengip string qqzengip数据库的文件的路径
db.ipdb string ipip.net数据库的文件的路径
source object 一个包含IP信息来源设置的部分
source.ipv4 string IPv4信息的来源,可配置为 maxmind/qqzengip/ipdb
source.ipv6 string IPv6信息的来源,可配置为 maxmind/qqzengip/ipdb
autoDownload object 一个包含自动更新数据库的设置的部分
autoDownload.enabled bool 是否启用自动更新数据库
autoDownload.MaxmindLicenseKey string MaxMind License Key,用于自动更新 MaxMind GeoLite2 数据库,也可以配置在环境变量 MAXMIND_LICENSE_KEY 中。如果都没有配置,那么 maxmind 的自动更新会报错
autoDownload.targetFilePath string 自动更新数据库的目标文件路径,如果不配置此参数,默认值是 ./,自动更新数据库会下载到这个目录
autoDownload.timeout number 自动更新数据库的超时时间,单位是 second,如果不配置此参数,默认值是 3
autoDownload.interval number 自动更新数据库的间隔时间,单位是 hour,如果不配置此参数,默认值是24
http object 一个包含HTTP服务器设置的部分
http.listen string HTTP服务器监听的地址和端口
http.trustProxy array 被信任的代理的IP地址的数组,当服务被发布在反向代理后时必须正确配置,否则无法正确获取到 xff 的地址。
http.cors array 允许跨域访问的域名列表,配置内的域名可以跨域访问 /myip/myip/format 接口
http.x-api-key string 访问 openapi 接口所需的 API 密钥

API

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"}}

searchapi

searchapi 接口面向浏览器,提供了一个 IP 地址的查询接口,并输出转换好的字符串以简化前端解析。

这个接口受验证码和限流措施的保护,以防范可能的恶意爬虫(ToDo)

他访问的路径是 http://localhost/ip

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

鸣谢

本项目的一些主要功能使用了以下开源项目,更多的依赖详见 go.mod

感谢他们的开源精神。

  • GeoIP库主要用来做 IP 地域解析,目前用的多的有淘宝 IP, IP2Region, GeoIP ,GeoIP 质量上乘,产品多语言支持,用起来很方便,目前 GeoLite免费,GeoIP2 收费,GeoLite 博主发现存在解析不精准的问题,还看到其他人吐槽 GeoLite 对国内地区支持不是很友好,反正博主要开始用了,因为项目定死了要用它。 集成过程如下 pom.xml文件 <depend

  • EPEL源 http://fedoraproject.org/wiki/EPEL BIND源码 http://ftp.isc.org/isc/bind9/ bind-geoip源码 http://code.google.com/p/bind-geoip/downloads/list 1.安装EPEL源   [root@localhost ~]# wget http://ftp.jaist.ac.j

  • https://pypi.python.org/pypi/GeoIP/ Requirements Python 2.5+ or 3.3+ GeoIP C Library 1.4.7 or greater Installation With pip: $ pip install GeoIP From source: $ python setup.py build$ python setup.py i

  • GeoIP介绍:什么是GepIP ? 所谓GeoIP,就是通过来访者的IP, 定位他的经纬度,国家/地区,省市,甚至街道等位置信息。这里面的技术不算难题,关键在于有个精准 的数据库。有了准确的数据源就奇货可居赚点小钱,可是发扬合作精神,集体贡献众人享用是我们追求的。 GeoIP如何使用?首先我们需要数据信息,所以先获取一个免费的数据库:GeoIP.dat.gz ,接着解压得到:GeoIP.dat,

  • 通过js 接收了用户的ip,我们需要通过ip得到用户的国家,可以通过一个库包来实现,下面是详细: 1.下载geoip的数据库: cd geoip/ wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz gzip -d GeoIP.dat.gz ls GeoLiteCity.dat 其他

  • 为了实现业务系统针对不同地区IP访问,展示包含不同地区信息的业务交互界面。很多情况下系统需要根据用户访问的IP信息,判断用户可能的访问区域,针对不同的区域提供个性化的服务内容。本方案在CentOS7.x环境下基于高性能的Openresty1.13.6.2来实现。 方案介绍 要通过IP地址确认归属地,通常可以使用一些在线查询服务来实现,比如https://blog.csdn.net/XinTeng2

  • 3.2.2  利用GeoIP数据库及API进行地理定位查询 地理定位查询主要可分为两个步骤:***,获取待查询的IP;第二,利用MaxMind? API进行查询并返回查询结果。本例中数据比较简单,因此可以把查询结果直接以Javascript字符串的形式返回给客户端,用eval调用即可。下面将详细介绍上述步骤。 1.获取待查询的IP 首先,在文件开始的部分引入MaxMind? API的库文件。<?p

  • 问题 在使用geoip2模块去解析ip地址是出现了错误:InvalidDatabaseError: Invalid node in search tree (venv) [hilqiqi0@izbp1a3rsiacm6nu3bfnyuz ~]$ ipython Python 3.6.8 (default, Jan 17 2019, 16:30:37) Type 'copyright', 'cred

  • 使用pip安装django-iprestrict[geoip]: ➜ ~ sudo pip3 install django-iprestrict\[geoip\] ...此处省略好多行 Running setup.py bdist_wheel for GeoIP ... error Complete output from command /usr/bin/python3 -u -c "

  • GeoIP介绍: 什么是GepIP ? 所谓GeoIP,就是通过来访者的IP, 定位他的经纬度,国家/地区,省市,甚至街道等位置信息。这里面的技术不算难题,关键在于有个精准 的数据库。有了准确的数据源就奇货可居赚点小钱,可是发扬合作精神,集体贡献众人享用是我们追求的。   GeoIP如 何使用? 首先我们需要数据信息,所以先获取一个免费的数据库://sjolzy.cn/php/GeoIP/bak/

  • 注:阅读本文需要有一定Linux知识的技术人员,写的不好,小白可能看不懂,十分抱歉哈。 1、系统环境 CentOS 7.x   Nginx 1.18.0 及Nginx1.20.0,其他版本未测试,以上两个版本均正常使用。 2.安装依赖 安装Geoip2依赖: $ cd /data $ wget https://github.com/maxmind/libmaxminddb/releases/dow

  • php使用GeoIP库实例 需要注意的是maxmind是geoip数据库的提供方,就跟随百分网小编一起去了解下吧,想了解更多相关信息请持续关注我们应届毕业生考试网!同时也提供了很多语言的sample和api说明文档。 比如php,和php的.geoip库是有很大区别的,包含使用方式,接口函数。 php官方的geoip需要配置php环境,加载geoip.dll库,并在php.ini中指定GEOIP库

  • GeoIP + PHP的使用 方法一: 下载 GeoIP 的 PHP 文件geoip.inc,保存为 geoip.inc.php http://sjolzy.cn/php/GeoIP/bak/geoip.inc php使用代码 <?php include("geoip.inc.php"); $gi = geoip_open("GeoIP.dat",GEOIP_STANDARD); $country

  • GeoIP2 是一个强大的离线数据库,该数据库内定义并记录了目前所有主机的IP地址和所在位置,通过传入某个IP地址,即可精确的定位到主机的位置,再结合谷歌地图可完美的画出坐标。 IP地址精准识别: 通过wireshark抓取pcap数据包,然后使用geoip2模块实现对IP地址的精准解析。 模块下载地址: https://github.com/maxmind/GeoIP2-python 离线数据库

  • CentOS 7下使用pip安装GeoIP包时报如下错误,提示缺少GeoIP.h头文件 [root@master-60-5 python]# pip3 install geoip Looking in indexes: https://pypi.doubanio.com/simple/ Collecting geoip Downloading https://pypi.doubanio.com

 相关资料
  • GeoJSON MongoDB 支持以下类型的 GeoJSON 对象类型: 点(Point) 线(LineString) 多边形(Polygon) 多点(MultiPoint) 多线 多个多边形 几何集合

  • GeoIP 是最常见的免费 IP 地址归类查询库,同时也有收费版可以采购。GeoIP 库可以根据 IP 地址提供对应的地域信息,包括国别,省市,经纬度等,对于可视化地图和区域统计非常有用。 配置示例 filter { geoip { source => "message" } } 运行结果 { "message" => "183.60.92.253"

  • 本文向大家介绍python实现查询IP地址所在地,包括了python实现查询IP地址所在地的使用技巧和注意事项,需要的朋友参考一下 使方法一、用IP138数据库查询域名或IP地址对应的地理位置。 方法二、本来想调用阿里的ip接口查询ip归属地。结果发现阿里的接口非常不给力,主要是不准确,不过是免费的且有地区和ISP的信息。以下是实现代码 但是多次查询发现ip归属地不准确,于是使用17mon的ip查

  • demo import java.io.IOException; import java.net.*; /**  * 查找IP地址  */ public class TestFindDNS {   public static void main(String[] args) throws IOException {     //     String href = "http://

  • 我对KML很陌生。我有一个excel电子表格,其中包含一系列(大约2000个)地址。它不包含横向/纵向坐标。地址的每一部分都在一个单独的列中。地址/地址2/城市/州/邮编。。。等 使用谷歌地图引擎,我能够生成一张上面有一堆标记的地图。我通过谷歌地图引擎中的链接将我的地图导出到KML。这导致了如下所示的地方标记数据: 信息窗口包含了地址,一切看起来都很好。 然后,我尝试将页面上的KML文件与goog

  • 地区管理 商家可以在后台添加地址,完善地址库,包括全国省市区等。 添加子地区 商家地址 填写商家的收获地址、收件人地址、电话、邮编等信息,用于买家退货邮寄地址。

  •        批量地址查询(地理编码),指现有大量地址信息存储于Excel内,需要获取地址对应的坐标,甚至转换成KML文件。        点击批量地址查询:        选择要进行处理的Excel文件:        Excel加载完成后,配置对应的数据开始行、详细地址列、地图KEY:        点击查询,设置输出文件地址:        即可快速进行批量查询:        查询完成后,

  • 说明 查询对账单下载地址SDK。 官方文档:https://docs.open.alipay.com/api_15/alipay.data.dataservice.bill.downloadurl.query 类 请求参数类 请求参数 类名:\Yurun\PaySDK\AlipayApp\Params\DownloadBill\Request 属性 名称 类型 说明 $method string