Code Monkey home page Code Monkey logo

geoip2-cn's Introduction

GeoIP2 · CN

🇨🇳 小巧精悍、准确、实用 GeoIP2 数据库 🇨🇳

🔖 项目背景

目前市面上绝大多数的代理工具都依赖于 GeoIP2 数据库判断地址所属地。它们的规则结尾部分一般都会有一条类似 GEOIP, CN,用来查询目的 IP 地址是否属于**大陆,从而判断是否直连。

这些代理工具通常使用的 GeoIP2 数据库是来自于 MaxMind 的 GeoLite2 免费数据库。这个数据库目前存在一下几个问题:

  • 获取不便:从 2019 年 12 月 30 日起,必须注册后才能下载
  • 数据量大:数据库庞大,包含全球的 IP 地址段,约 4 MB
  • 准确度低:对**大陆的 IP 地址判定不准,如:香港阿里云的 IP 被判定为新加坡、**大陆等

新的政策要求注册才能下载会增加时间成本,而且会让自动化下载的难度大大增加。

庞大的数据量无可厚非,但是对于大多数**大陆的用户来说,仅需要去判断 IP 的地理位置是否属于**大陆境内,其他国家的 IP 一律代理。过多的数据量会增加载入时间,降低查询效率;

而最致命的问题就是准确度低,这会导致代理工具查询后得到错误,做出错误的分流判定,最终导致用户体验不佳,如:网站无法访问、访问缓慢等问题。

🥳 项目优势

👓 准确度高

项目选取更新较为频繁、广受好评、准确度高的 ipip.net纯真 IP 数据库的**大陆 IP 地址段信息进行合并、去重、整理操作,最终生成仅含有**大陆 IP 信息的 GeoIP2 数据库。准确度高、用户使用体验好。

⚛️ 实用精悍

GeoIP2 数据库的大小仅为 100 KB 左右,对比原来庞大的数据库,显得非常小巧实用,加载时间极短、查询效率极高。

项目仅包含大陆用户需要的** IP 地址段,无需获取多余的其他国家或地区的 IP 地址,完美贴合使用需求。

🌍 CDN 分发

项目直接托管于 GitHub,并使用 CDN 全球分发,瞬间即可完成数据库的下载和加载,在较差的网络环境下也较容易完成数据库的更新。

🤖️ 自动化更新

项目每隔 3 天通过全自动化部署自动更新,时刻保持最佳体验,无需人工干预。

📥 下载链接

📦 项目 📃 文件 🐙 GitHub RAW 🚀 CDN 加速 🔧 适用范围
IP-CIDR 列表 CN-ip-cidr.txt 点我下载 点我起飞 防火墙、较老的代理工具等
GeoIP2 数据库 Country.mmdb 点我下载 点我起飞 Surge, Shadowrocket,
QuantumultX, Clash
等较新的代理工具

对于网络状况良好、无污染的环境下,建议选择 GitHub RAW 的方式下载,因为可以第一获取到最新的资源,因为服务器在境外,可能下载响应时间和速度稍长,但因为文件小,所以通常问题不大。

对于网络状况不好,存在污染的环境下,建议选择 CDN 加速的方式下载,速度非常快。但是可能存在缓存未更新的情况,很可能下载到旧的资源。

📲️ 配置方式

请参考项目 Wiki 提供的文档教程,在各个工具中自定义 GeoIP2 数据库。

目前 Wiki 中已经添加了如下工具的配置教程,欢迎大家在 Issues 中补充:

⚠️ 注意事项

  1. 禁用或删除**大陆 IP 地址段 相关的规则或规则集

    RULE-SET, https://handsome.hackl0us.com/China-IP.list, DIRECT # 禁用或删除类似规则
    GEOIP, CN, DIRECT # 与上一条类似的规则与本条规则不可共存
  2. GEOIP-CN 查询规则建议紧随最终规则之上,以避免域名规则被忽略导致判断错误。

    # ... 省略其他规则 ...
    GEOIP, CN, DIRECT # 👀 建议在这里使用规则
    FINAL, PROXY # ⬇️ 最终规则
  3. 规则中不可以存在其他国家或地区的 GEOIP 查询规则,因为项目提供的数据库中仅包含**大陆地区的 IP 地址段记录

    GEOIP, US, PROXY # ❌ 错误,无法查询到相关记录
    GEOIP, AU, PROXY # ❌ 错误,无法查询到相关记录
    GEOIP, HK, PROXY # ❌ 错误,无法查询到相关记录
    GEOIP, CN, DIRECT # ✅ 正确

🏅 版权声明

本项目 Fork 自 JMVoid/ipip2mmdb 项目,并由 Hackl0us 加以调整和修改。

项目中所使用的 IP 地址信息来自于 17mon/china_ip_list(基于 ipip.net)和 metowolf/iplist (基于 纯真 IP)。

GeoIP® 商标版权归 MaxMind 公司所有。

项目的 Soial Preview 图片来源于 Wikimedia Commons,其版权信息为 CC BY-SA 4.0

geoip2-cn's People

Contributors

hackl0us avatar jmvoid avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

geoip2-cn's Issues

建议修改README中ClashX (Pro)相关描述

README中提到

ClashX 和 ClashX Pro

工具开发者 @yicheng 表示后续会考虑支持自定义 GeoIP 库,目前需要使用手动替换的方式来使用项目中提供的数据库。

配置方式:点击状态栏的 ClashX 图标,选择「配置」> 「选择打开本地配置文件夹」,用本项目提供的 Country.mmdb 数据库替换弹出窗口中的同名文件 > 重新启动工具

⚠️ 请勿使用 「配置」> 「实验性功能」> 「更新 IP 数据库」这一功能,否则 IP 数据库会被还原回 MaxMind 的数据库。

该问题在ClashX (Pro)后续Releases中似乎已经修复 commit(https://github.com/yichengchen/clashX/commit/16167b15d2b871b90df293af0871ebf38ff3fc1e)

Clash DNS fallback-filter 失效

使用clash作为抗污染DNS服务器时可以基于geoip对查询结果进行过滤,只有IP地址属于CN才返回默认结果,否则返回fallback结果。
但使用本项目的数据库之后fallback会失效,不管查询什么内容都只返回可能被污染的默认结果。
个人猜测是因为clash对IP查询失败之后就继续采用默认结果造成的。不知道能不能增加一个兜底IP结果,将非CN的IP结果返回一个不存在的国家码,从而触发clash的fallback

希望提供除 Country.mmdb 和 IP-CIDR 段的其他支持

由于 Clash 的 Country.mmdb 并不能实现自动更新,只能手动替换;而geoip-cn.txt 又不被大部分软件直接接受,因此能否烦请作者同时提供以下格式的内容?

在此先谢过先!

Clash Rule-Provider YAML

Clash Rule-Provider 文档: https://lancellc.gitbook.io/clash/clash-config-file/rule-provider#example-of-a-rule-provider-file
样例文件:https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/Providers/ChinaIp.yaml
使用方法:

rule-providers:
  ChinaIP:
    type: http
    behavior: ipcidr
    path: ./profiles/rule-providers/ChinaIp.yaml
    url: https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/Providers/ChinaIp.yaml #由于Clash不支持通过代理更新,需要做镜像/CDN
    interval: 86400

rules:
  - RULE-SET,ChinaIP,DIRECT

Quantumult X Remote Filter / Clash 配置片段

样例文件:https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/ChinaIp.list
使用方法:

[filter_remote]
https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/ChinaIp.list, tag=国内 IP 段, force-policy=DIRECT, update-interval=86400, opt-parser=true, enabled=true

Surge Rule Set

样例文件:https://raw.githubusercontent.com/DivineEngine/Profiles/master/Surge/Ruleset/Extra/ChinaIP.list
使用方法:

[Rule]
RULE-SET,https://raw.githubusercontent.com/DivineEngine/Profiles/master/Surge/Ruleset/Extra/ChinaIP.list,DIRECT

国内网站识别问题

北邮人网站 byr.pt 没有被识别成国内网站,最后走了“漏网之鱼”规则
MaxMind的数据库里面byr.pt是放在国内网站里的,可以走direct规则

Vulnerabilities in YAML.V2 Lib

go.sum (gomod)
==============
Total: 3 (UNKNOWN: 2, LOW: 0, MEDIUM: 1, HIGH: 0, CRITICAL: 0)

+------------------+------------------+----------+-------------------+---------------+---------------------------------------+
|     LIBRARY      | VULNERABILITY ID | SEVERITY | INSTALLED VERSION | FIXED VERSION |                 TITLE                 |
+------------------+------------------+----------+-------------------+---------------+---------------------------------------+
| gopkg.in/yaml.v2 | CVE-2019-11254   | MEDIUM   | 2.2.2             | 2.2.8         | kubernetes: Denial of                 |
|                  |                  |          |                   |               | service in API server via             |
|                  |                  |          |                   |               | crafted YAML payloads by...           |
|                  |                  |          |                   |               | -->avd.aquasec.com/nvd/cve-2019-11254 |
+                  +------------------+----------+                   +---------------+---------------------------------------+
|                  | GMS-2019-2       | UNKNOWN  |                   | v2.2.3        | XML Entity Expansion                  |
+                  +------------------+          +                   +---------------+---------------------------------------+
|                  | GO-2021-0061     |          |                   | 2.2.3         | Due to unbounded alias                |
|                  |                  |          |                   |               | chasing, a maliciously crafted        |
|                  |                  |          |                   |               | YAML file can cause the...            |
+------------------+------------------+----------+-------------------+---------------+---------------------------------------+

部分ip段出错

202.165.96.0/21
202.165.104.0/22
202.165.110.0/23
所包含的ip为海外ip

云闪付部分IP识别错误

wallet.95516.com
foundation.95516.com
ads.95516.com
open.95516.com
其他的95516.com的网址是可以正常识别为direct规则的

可以将相邻的ip范围合并到一起,减小文件内容

我之前用的是https://ftp.apnic.net/stats/apnic/delegated-apnic-latest这上面的结果,当时我就发现了里面好多相邻的ip范围是可以合并在一起的。所以当我看到这个项目时,我也试了下,确实很多ip范围是可以合并到一起的。

这里是项目的文件,有91800

image

下面是我按照代码合并后的结果,只有8401行,有10倍的压缩效率,我觉得可以在自动化部署里面加上以下逻辑

image

package main

import (
	"bufio"
	"math/big"
	"net/http"
	"net/netip"
	"os"
	"strconv"
)

func main() {
	err := test()
	if err != nil {
		panic(err)
	}
}

func test() error {
	u := "https://github.com/Hackl0us/GeoIP2-CN/raw/release/CN-ip-cidr.txt"
	req, err := http.NewRequest(http.MethodGet, u, nil)
	if err != nil {
		return err
	}

	c := &http.Client{
		// Transport: &http.Transport{
		// 	Proxy: func(r *http.Request) (*url.URL, error) {
		// 		return url.Parse("http://127.0.0.1:1080")
		// 	},
		// },
	}

	resp, err := c.Do(req)
	if err != nil {
		return err
	}
	defer resp.Body.Close()

	var (
		cidr, ipv4Cidr, ipv6Cidr []string

		br      = bufio.NewScanner(resp.Body)
		rangeIp = []*big.Int{{}, {}, big.NewInt(1)}
		lastV4  = []*big.Int{{}, {}}
		lastV6  = []*big.Int{{}, {}}
		fillBuf = make([]byte, 16)
	)
	for br.Scan() {
		ip, err := netip.ParsePrefix(br.Text())
		if err != nil {
			continue
		}

		// rangeIp[0] 当前行起始ip地址
		rangeIp[0].SetBytes(ip.Addr().AsSlice())
		rangeIp[1].Set(rangeIp[0])

		last, tmp, ipCidr, setBit := lastV4, fillBuf[:4], &ipv4Cidr, 31
		if ip.Addr().Is6() {
			last, tmp, ipCidr, setBit = lastV6, fillBuf, &ipv6Cidr, 127
		}

		for i := setBit - ip.Bits(); i >= 0; i-- {
			rangeIp[1].SetBit(rangeIp[1], i, 1)
		}
		rangeIp[1].Add(rangeIp[1], rangeIp[2])

		if last[1].Cmp(rangeIp[0]) == 0 {
			// 本行起始ip是上一行结束ip+1,可以组成连续ip范围
			last[1].Set(rangeIp[1])
		} else {
			if last[1].BitLen() > 0 {
				cidr = ipRangeToCIDR(cidr[:0], tmp, last[0], last[1].Sub(last[1], rangeIp[2]))
				*ipCidr = append(*ipCidr, cidr...) // 根据ip起止范围计算CIDR表达式
			}
			last[0].Set(rangeIp[0])
			last[1].Set(rangeIp[1])
		}
	}
	err = br.Err()
	if err != nil {
		return err
	}

	if lastV4[1].BitLen() > 0 {
		cidr = ipRangeToCIDR(cidr[:0], fillBuf[:4], lastV4[0], lastV4[1].Sub(lastV4[1], rangeIp[2]))
		ipv4Cidr = append(ipv4Cidr, cidr...)
	}
	if lastV6[1].BitLen() > 0 {
		cidr = ipRangeToCIDR(cidr[:0], fillBuf, lastV6[0], lastV6[1].Sub(lastV6[1], rangeIp[2]))
		ipv6Cidr = append(ipv6Cidr, cidr...)
	}

	fwCidr := func(name string, cidr []string) error {
		fw, err := os.Create(name)
		if err != nil {
			return err
		}
		defer fw.Close()
		for _, v := range cidr {
			fw.WriteString(v + "\n")
		}
		return nil
	}

	err = fwCidr("ipv4.txt", ipv4Cidr)
	if err != nil {
		return err
	}
	err = fwCidr("ipv6.txt", ipv6Cidr)
	if err != nil {
		return err
	}
	return nil
}

func ipRangeToCIDR(cidr []string, buf []byte, ipsInt, ipeInt *big.Int) []string {
	var (
		tmpInt = new(big.Int)
		mask   = new(big.Int)
		one    = big.NewInt(1)
		bits   uint
		maxBit = uint(len(buf) * 8)
	)
	for {
		bits = 1
		mask.SetUint64(1)
		for bits < maxBit {
			if (tmpInt.Or(ipsInt, mask).Cmp(ipeInt) > 0) ||
				(tmpInt.Lsh(tmpInt.Rsh(ipsInt, bits), bits).Cmp(ipsInt) != 0) {
				bits--
				mask.Rsh(mask, 1)
				break
			}
			bits++
			mask.Add(mask.Lsh(mask, 1), one)
		}

		addr, _ := netip.AddrFromSlice(ipsInt.FillBytes(buf))
		cidr = append(cidr, addr.String()+"/"+strconv.FormatUint(uint64(maxBit-bits), 10))

		if tmpInt.Or(ipsInt, mask); tmpInt.Cmp(ipeInt) >= 0 {
			break
		}
		ipsInt.Add(tmpInt, one)
	}
	return cidr
}

电视盒子哔哩哔哩识别问题

电视盒子:Apple TV

软路由:R4S

翻墙插件:SSRP

软件:Miao Project(商店版)

问题:
通过Miao Project观看哔哩哔哩无法播放番剧,显示区域限制。更换为openclash插件后可以正常播放,后台查看到播放时有两个链接在通过代理节点下载流量并没有走直连,分别是******.bilivideo.com和api.bilibili.com. 邮件询问过Miao Project的开发者,对方表示挂上代理后网络情况较复杂,和软件无关,需要调试规则才能解决。

解决方法:
我返回ssrp插件,在访问控制-直连域名中将bilivideo.com和bilibili.com加入直连列表。翻墙模式依旧选择绕过大陆IP模式,此时番剧可正常播放,不再显示区域限制。

分析:
猜测可能是您的大陆IP列表里面没有bilivideo.com和bilibili.com域名导致的Apple TV通过Miao Project看哔哩哔哩走代理。请大佬检查下是否列表名单内缺失域名,感谢。

希望增加对iptables geoip的支持

目前服务器防火墙使用iptables 里面的geoip模块
希望楼主增加对geoip的支持,相关文件为CN.iv4

相关文件供参考
/usr/share/xt_geoip/CN.iv4
/usr/lib/xtables-addons/iv4/CN.iv4
脚本
/usr/lib/xtables-addons/xt_geoip_dl
/usr/lib/xtables-addons/xt_geoip_build
APT包文件
xtables-addons-common xtables-addons-dkms

b站域名走代理

dataflow.biliapi.com、api.bilibili.com、app.bilibili.com、passport.bilibili.com

Quantumult X 中 Facebook 相關網址被識別為GeoIP CN

配置Quantumult X 時,添加了神機規則中的許多lists,但是發現訪問Facebook時無法刷新內容。通過查看Qx的紀錄發現Facebook默認識別為GeoIP CN,嘗試切換了默認的GeoIP和該項目中的GeoIP,但都是訪問過程中都是直連。最後的解決方法是重新添加Facebook單項策略,手動調整為Proxy。

能否提供html格式

酸酸乳+的订阅列表貌似支持的是html格式的。直接订阅txt无法生效。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.