130 lines
4.4 KiB
Bash
130 lines
4.4 KiB
Bash
#!/bin/sh
|
||
set -e # 如果任何命令失败则退出
|
||
|
||
# 获取脚本所在目录
|
||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||
TMPDIR=$(mktemp -d)
|
||
trap 'rm -rf "$TMPDIR"' EXIT # 确保脚本退出时删除临时目录
|
||
|
||
# 创建必要的目录
|
||
mkdir -p "$SCRIPT_DIR/geo"
|
||
mkdir -p "$SCRIPT_DIR/geosite"
|
||
mkdir -p "$SCRIPT_DIR/geoip"
|
||
mkdir -p "$SCRIPT_DIR/config"
|
||
|
||
# 下载 geoip 和 geosite 数据文件到 geo 目录
|
||
download_geodata() {
|
||
echo "正在下载 geoip.dat..."
|
||
curl --connect-timeout 5 -m 60 -kfSL -o "$SCRIPT_DIR/geo/geoip.dat" "https://cdn.jsdelivr.net/gh/Loyalsoldier/geoip@release/geoip.dat"
|
||
|
||
echo "正在下载 geosite.dat..."
|
||
curl --connect-timeout 5 -m 60 -kfSL -o "$SCRIPT_DIR/geo/geosite.dat" "https://cdn.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/geosite.dat"
|
||
|
||
echo "正在下载 CN-ip-cidr.txt"
|
||
curl --connect-timeout 5 -m 60 -kfSL -o "$SCRIPT_DIR/config/CN-ip-cidr.txt" "https://raw.githubusercontent.com/Hackl0us/GeoIP2-CN/release/CN-ip-cidr.txt"
|
||
|
||
echo "下载完成"
|
||
}
|
||
|
||
# 下载 v2dat 工具(如果不存在)
|
||
download_v2dat() {
|
||
if [ ! -f "$SCRIPT_DIR/v2dat" ]; then
|
||
echo "正在下载 v2dat 工具..."
|
||
curl -fSL -o "$SCRIPT_DIR/v2dat" "https://raw.githubusercontent.com/xukecheng/scripts/main/v2dat"
|
||
chmod +x "$SCRIPT_DIR/v2dat"
|
||
echo "v2dat 工具下载完成"
|
||
else
|
||
echo "v2dat 工具已存在"
|
||
fi
|
||
}
|
||
|
||
# 过滤 IPv4 地址(去掉 IPv6)
|
||
filter_ipv4_only() {
|
||
local input_file="$1"
|
||
local output_file="$2"
|
||
|
||
if [ ! -f "$input_file" ]; then
|
||
echo "警告: 文件 $input_file 不存在,跳过过滤"
|
||
return 1
|
||
fi
|
||
|
||
echo "正在过滤 IPv4 地址(去掉 IPv6)..."
|
||
echo "输入文件: $input_file"
|
||
echo "输出文件: $output_file"
|
||
|
||
# 统计原始行数
|
||
original_count=$(wc -l < "$input_file" 2>/dev/null || echo "0")
|
||
|
||
# 过滤 IPv4 地址:
|
||
# 1. 匹配 IPv4 CIDR 格式 (x.x.x.x/xx)
|
||
# 2. 排除包含冒号的 IPv6 地址
|
||
# 3. 排除空行和注释行
|
||
grep -E '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}(/[0-9]{1,2})?$' "$input_file" > "$output_file" 2>/dev/null || {
|
||
echo "错误: 过滤 IPv4 地址失败"
|
||
return 1
|
||
}
|
||
|
||
# 统计过滤后行数
|
||
filtered_count=$(wc -l < "$output_file" 2>/dev/null || echo "0")
|
||
removed_count=$((original_count - filtered_count))
|
||
|
||
echo "过滤完成:"
|
||
echo " 原始条目: $original_count"
|
||
echo " IPv4 条目: $filtered_count"
|
||
echo " 移除条目: $removed_count (IPv6 和无效条目)"
|
||
|
||
return 0
|
||
}
|
||
|
||
# 使用 v2dat 工具解包数据
|
||
unpack_geodata() {
|
||
echo "正在解包 geosite.dat..."
|
||
"$SCRIPT_DIR/v2dat" unpack geosite "$SCRIPT_DIR/geo/geosite.dat" -o "$SCRIPT_DIR/geosite"
|
||
|
||
echo "正在解包 geoip.dat CN 数据..."
|
||
"$SCRIPT_DIR/v2dat" unpack geoip "$SCRIPT_DIR/geo/geoip.dat" -o "$SCRIPT_DIR/geoip" -f cn
|
||
|
||
# 🆕 新增:过滤 IPv4 地址,去掉 IPv6
|
||
local geoip_cn_file="$SCRIPT_DIR/geoip/geoip_cn.txt"
|
||
local geoip_cn_ipv4_file="$SCRIPT_DIR/config/cn.txt"
|
||
|
||
if [ -f "$geoip_cn_file" ]; then
|
||
echo ""
|
||
echo "🔄 正在处理 CN IP 数据..."
|
||
filter_ipv4_only "$geoip_cn_file" "$geoip_cn_ipv4_file"
|
||
|
||
if [ $? -eq 0 ]; then
|
||
echo "✅ CN IPv4 地址列表已生成: $geoip_cn_ipv4_file"
|
||
echo " 该文件可直接用于 MosDNS 配置中的 geoip_cn"
|
||
else
|
||
echo "❌ 处理 CN IP 数据失败"
|
||
fi
|
||
else
|
||
echo "⚠️ 警告: 未找到 $geoip_cn_file 文件"
|
||
fi
|
||
|
||
echo ""
|
||
echo "解包完成"
|
||
}
|
||
|
||
# 主流程
|
||
echo "开始处理..."
|
||
download_geodata
|
||
download_v2dat
|
||
unpack_geodata
|
||
|
||
echo ""
|
||
echo "🎉 所有操作完成!"
|
||
echo ""
|
||
echo "📁 生成的文件:"
|
||
echo " ├── geo/geoip.dat (原始 geoip 数据)"
|
||
echo " ├── geo/geosite.dat (原始 geosite 数据)"
|
||
echo " ├── geoip/geoip_cn.txt (解包的 CN IP 数据,包含 IPv6)"
|
||
echo " ├── config/cn.txt (🆕 过滤后的 CN IPv4 数据)"
|
||
echo " ├── config/CN-ip-cidr.txt (备用 CN IP 数据)"
|
||
echo " └── geosite/ (解包的域名数据)"
|
||
echo ""
|
||
echo "💡 使用建议:"
|
||
echo " - MosDNS 配置中使用: config/cn.txt (仅 IPv4)"
|
||
echo " - 如需 IPv6 支持,使用: geoip/geoip_cn.txt"
|
||
echo "" |