mosdns/v2dat.sh
dengxiongjian ee06785e08
Some checks are pending
Test mosdns / build (push) Waiting to run
开发web管理
2025-10-15 22:20:27 +08:00

130 lines
4.4 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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