From 560b9e441ed86460abf519382f6164d1dc048c7c Mon Sep 17 00:00:00 2001 From: spiritlhl <103393591+spiritLHLS@users.noreply.github.com> Date: Sun, 6 Apr 2025 10:24:44 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0IPV6=E5=89=8D?= =?UTF-8?q?=E7=BC=80=E5=88=A4=E6=96=AD=E7=9A=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build.yml | 48 +++++++++++++++++++++ bk/ipv6_asn.go | 84 ++++++++++++++++++++++--------------- 2 files changed, 99 insertions(+), 33 deletions(-) create mode 100644 .github/workflows/build.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..f19d38e --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,48 @@ +name: 创建IPv6检测的前缀 + +on: + workflow_dispatch: + schedule: + - cron: '0 0 * * 0' + +jobs: + fetch-ipv6-prefixes: + runs-on: ubuntu-latest + steps: + - name: 检出代码 + uses: actions/checkout@v3 + with: + token: ${{ secrets.GITHUB_TOKEN }} + + - name: 获取并处理多个ASN的IPv6前缀 + run: | + mkdir -p bk/prefix/ + for asn in AS4809 AS4134 AS9929 AS4837 AS58807 AS9808 AS58453 AS23764; do + echo "处理 $asn..." + curl -s -A "Mozilla/5.0" \ + "https://bgp.he.net/$asn" > "${asn}.html" + grep -oE '[0-9a-f:]+::/[0-9]+' "${asn}.html" | sort -u > tmp_prefixes.txt + { + while read prefix; do + ip_part=$(echo "$prefix" | cut -d/ -f1) + prefix_len=$(echo "$prefix" | cut -d/ -f2) + keep_segments=$((prefix_len / 16)) + segments=$(echo "$ip_part" | tr ':' '\n' | grep -v '^$') + kept=$(echo "$segments" | head -n "$keep_segments" | tr '\n' ':' | sed 's/:$//') + echo "$kept" + done < tmp_prefixes.txt + } | sort -u > "bk/prefix/${asn,,}.txt" + rm -f "${asn}.html" tmp_prefixes.txt + done + + - name: 提交更新到仓库 + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + git add bk/prefix/*.txt + if git diff --cached --quiet; then + echo "无变更,跳过提交。" + else + git commit -m "chore: 更新多个 ASN 的 IPv6 前缀" + git push + fi diff --git a/bk/ipv6_asn.go b/bk/ipv6_asn.go index 74f3252..be693e4 100644 --- a/bk/ipv6_asn.go +++ b/bk/ipv6_asn.go @@ -4,37 +4,55 @@ import ( "strings" ) -// 识别IPv6地址的ASN -func ipv6Asn(ip string) string { - switch { - // 电信CN2GIA - case strings.HasPrefix(ip, "2408:80"): - return "AS4809a" - // 电信CN2GT - case strings.HasPrefix(ip, "2408:8000"): - return "AS4809b" - // 电信163 - case strings.HasPrefix(ip, "240e:") || strings.HasPrefix(ip, "2408:8"): - return "AS4134" - // 联通9929 - case strings.HasPrefix(ip, "2408:8026:"): - return "AS9929" - // 联通4837 - case strings.HasPrefix(ip, "2408:8000:"): - return "AS4837" - // 移动CMIN2 - case strings.HasPrefix(ip, "2409:8880:"): - return "AS58807" - // 移动CMI - case strings.HasPrefix(ip, "2409:8000:") || strings.HasPrefix(ip, "2409:"): - return "AS9808" - // 移动CMI - case strings.HasPrefix(ip, "2407:") || strings.HasPrefix(ip, "2401:"): - return "AS58453" - // 电信CTGNET - case strings.HasPrefix(ip, "2402:0:") || strings.HasPrefix(ip, "2400:8:"): - return "AS23764" - default: - return "" - } +//go:embed bk/prefix/as4809.txt +var as4809Data string + +//go:embed bk/prefix/as4134.txt +var as4134Data string + +//go:embed bk/prefix/as9929.txt +var as9929Data string + +//go:embed bk/prefix/as4837.txt +var as4837Data string + +//go:embed bk/prefix/as58807.txt +var as58807Data string + +//go:embed bk/prefix/as9808.txt +var as9808Data string + +//go:embed bk/prefix/as58453.txt +var as58453Data string + +//go:embed bk/prefix/as23764.txt +var as23764Data string + +// ASN -> Prefix strings +var asnPrefixes = map[string][]string{ + "AS4809": strings.Split(as4809Data, "\n"), // 电信 CN2 GT/GIA + "AS4134": strings.Split(as4134Data, "\n"), // 电信 163 骨干网 + "AS9929": strings.Split(as9929Data, "\n"), // 联通 9929 优质国际线路 + "AS4837": strings.Split(as4837Data, "\n"), // 联通 AS4837 普通国际线路 + "AS58807": strings.Split(as58807Data, "\n"), // 移动 CMIN2 国际精品网 + "AS9808": strings.Split(as9808Data, "\n"), // 移动 CMI(中国移动国际公司) + "AS58453": strings.Split(as58453Data, "\n"), // 移动国际互联网(CMI/HK) + "AS23764": strings.Split(as23764Data, "\n"), // 电信 CTGNET/国际出口(可能是CN2-B) } + +// 判断 IPv6 地址是否匹配 ASN 中的某个前缀 +func ipv6Asn(ip string) string { + ip = strings.ToLower(ip) + for asn, prefixes := range asnPrefixes { + for _, prefix := range prefixes { + prefix = strings.TrimSpace(prefix) + if prefix == "" { + continue + } + if strings.HasPrefix(ip, prefix) { + return asn + } + } + } + return "" +} \ No newline at end of file