#!/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 ""