feat: 添加IPV6前缀判断的逻辑

This commit is contained in:
spiritlhl 2025-04-06 10:24:44 +00:00
parent 5b416aa419
commit 560b9e441e
2 changed files with 99 additions and 33 deletions

48
.github/workflows/build.yml vendored Normal file
View File

@ -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

View File

@ -4,37 +4,55 @@ import (
"strings" "strings"
) )
// 识别IPv6地址的ASN //go:embed bk/prefix/as4809.txt
func ipv6Asn(ip string) string { var as4809Data string
switch {
// 电信CN2GIA //go:embed bk/prefix/as4134.txt
case strings.HasPrefix(ip, "2408:80"): var as4134Data string
return "AS4809a"
// 电信CN2GT //go:embed bk/prefix/as9929.txt
case strings.HasPrefix(ip, "2408:8000"): var as9929Data string
return "AS4809b"
// 电信163 //go:embed bk/prefix/as4837.txt
case strings.HasPrefix(ip, "240e:") || strings.HasPrefix(ip, "2408:8"): var as4837Data string
return "AS4134"
// 联通9929 //go:embed bk/prefix/as58807.txt
case strings.HasPrefix(ip, "2408:8026:"): var as58807Data string
return "AS9929"
// 联通4837 //go:embed bk/prefix/as9808.txt
case strings.HasPrefix(ip, "2408:8000:"): var as9808Data string
return "AS4837"
// 移动CMIN2 //go:embed bk/prefix/as58453.txt
case strings.HasPrefix(ip, "2409:8880:"): var as58453Data string
return "AS58807"
// 移动CMI //go:embed bk/prefix/as23764.txt
case strings.HasPrefix(ip, "2409:8000:") || strings.HasPrefix(ip, "2409:"): var as23764Data string
return "AS9808"
// 移动CMI // ASN -> Prefix strings
case strings.HasPrefix(ip, "2407:") || strings.HasPrefix(ip, "2401:"): var asnPrefixes = map[string][]string{
return "AS58453" "AS4809": strings.Split(as4809Data, "\n"), // 电信 CN2 GT/GIA
// 电信CTGNET "AS4134": strings.Split(as4134Data, "\n"), // 电信 163 骨干网
case strings.HasPrefix(ip, "2402:0:") || strings.HasPrefix(ip, "2400:8:"): "AS9929": strings.Split(as9929Data, "\n"), // 联通 9929 优质国际线路
return "AS23764" "AS4837": strings.Split(as4837Data, "\n"), // 联通 AS4837 普通国际线路
default: "AS58807": strings.Split(as58807Data, "\n"), // 移动 CMIN2 国际精品网
return "" "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 ""
} }