最近在捣鼓一个需求,找出访问海外的业务。我第一反应就是从流量里捞取目标地址,然后检查IP是否为海外。
那么如何知道一个IP地址的归属地呢?我们可以通过ip138.com查询,但挨个查显然不现实,我也没钱买他们的付费服务。
于是,聪明的我从GitHub上找了一个免费的、可升级的数据库做本地离线查询。
下载地址:
https://github.com/hezhizheng/go-ip2region
启动起来是这个样子:
./go-ip2region_windows_amd64.exe -h
Usage of D:\go-ip2region\go-ip2region_windows_amd64.exe:
-d string
仅用于下载最新的ip地址库,保存在当前目录 (default "0")
-p string
本地监听的端口 (default "9090")
// 没有IP地址库会自动下载,保存在当前目录
./go-ip2region_windows_amd64.exe
// 没有指定IP会获取当前客户端IP
curl http://127.0.0.1:9090
curl http://127.0.0.1:9090?ip=59.42.37.186
// 返回数据格式
{
"code": 200,
"msg": "",
"data": {
"ip": "59.42.37.186",
"country": "中国",
"province": "广东",
"city": "广州",
"county": "",
"region": "亚洲",
"isp": "电信"
}
}
有了这个好东西之后,我们就能够直接开搞了。我写了一段Demo。
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
)
//定义json结构
type IPinfo struct {
Code int `json:"code"`
Msg string `json:"msg"`
Data struct {
IP string `json:"ip"`
Country string `json:"country"`
Province string `json:"province"`
City string `json:"city"`
County string `json:"county"`
Region string `json:"region"`
Isp string `json:"isp"`
} `json:"data"`
}
func main() {
ipquery := "42.193.103.52" //要查询的IP地址
url := "http://localhost:9090?ip="
response, err := http.Get(url + ipquery)
if err != nil {
fmt.Println("The site is down")
}
body, _ := ioutil.ReadAll(response.Body)
var IP_Info IPinfo
err = json.Unmarshal(body, &IP_Info)
if err != nil{
fmt.Printf("The error is %+v \n", err)
}
fmt.Printf("The IP %v is from %v \n\n", IP_Info.Data.IP, IP_Info.Data.Country)
}
最终运行效果如下:
后来,又增加了去重、排序等功能,让程序能读更大的流量日志文件,这样就能得到自己最想要的结果了。
示例如下:
全文完,笔芯❤️
作者:阿飞,十余年来一直混迹于信息安全行业,扛过设备,卖过服务,做过审计,查过黑客,反过欺诈,岁月神偷带走了我的苹果肌,留下了一肚子的瘫软,貌似我将要成为一个油腻的中年男人,不过依然对世界充满好奇。