mirror of
https://github.com/oneclickvirt/backtrace.git
synced 2025-04-22 04:02:07 +08:00
feat: 添加IPV6前缀判断的逻辑
This commit is contained in:
parent
5b416aa419
commit
560b9e441e
48
.github/workflows/build.yml
vendored
Normal file
48
.github/workflows/build.yml
vendored
Normal 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
|
@ -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 ""
|
||||
}
|
Loading…
Reference in New Issue
Block a user