213 lines
8.2 KiB
Bash
213 lines
8.2 KiB
Bash
#!/bin/bash
|
||
# ============================================================
|
||
# 三网路由检测脚本 (电信 / 联通 / 移动)
|
||
# 适用系统: Debian / Ubuntu
|
||
# 功能: 自动安装依赖,测试去程+回程路由
|
||
# ============================================================
|
||
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
BLUE='\033[0;34m'
|
||
CYAN='\033[0;36m'
|
||
BOLD='\033[1m'
|
||
RESET='\033[0m'
|
||
|
||
# ── 测试目标 IP ──────────────────────────────────────────────
|
||
# 去程(从本地到这些国内IP)
|
||
TELECOM_IPS=("202.96.209.5" "61.139.2.69" "211.137.58.20") # 电信各省
|
||
UNICOM_IPS=("211.95.46.3" "218.104.111.114" "61.135.169.121") # 联通各省
|
||
MOBILE_IPS=("221.179.131.11" "223.5.5.5" "120.196.165.1") # 移动各省
|
||
|
||
# 回程测试目标
|
||
TELECOM_RETURN="180.97.33.108" # 电信上海
|
||
UNICOM_RETURN="218.104.111.114" # 联通武汉
|
||
MOBILE_RETURN="221.179.131.11" # 移动北京
|
||
|
||
# ── 辅助函数 ─────────────────────────────────────────────────
|
||
print_banner() {
|
||
echo -e "${CYAN}"
|
||
echo "╔══════════════════════════════════════════════════╗"
|
||
echo "║ 三网路由检测脚本 by route_test ║"
|
||
echo "║ 电信 / 联通 / 移动 去程 + 回程 ║"
|
||
echo "╚══════════════════════════════════════════════════╝"
|
||
echo -e "${RESET}"
|
||
}
|
||
|
||
print_section() {
|
||
echo ""
|
||
echo -e "${BOLD}${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${RESET}"
|
||
echo -e "${BOLD}${YELLOW} $1${RESET}"
|
||
echo -e "${BOLD}${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${RESET}"
|
||
}
|
||
|
||
check_root() {
|
||
if [[ $EUID -ne 0 ]]; then
|
||
echo -e "${RED}[错误] 请使用 root 用户运行此脚本${RESET}"
|
||
echo " sudo bash route_test.sh"
|
||
exit 1
|
||
fi
|
||
}
|
||
|
||
get_vps_info() {
|
||
print_section "📋 VPS 基本信息"
|
||
local ip=$(curl -s --max-time 5 ip.sb 2>/dev/null || echo "获取失败")
|
||
local info=$(curl -s --max-time 5 ipinfo.io 2>/dev/null)
|
||
local org=$(echo "$info" | grep '"org"' | cut -d'"' -f4)
|
||
local city=$(echo "$info" | grep '"city"' | cut -d'"' -f4)
|
||
local country=$(echo "$info" | grep '"country"' | cut -d'"' -f4)
|
||
echo -e " IP地址 : ${GREEN}${ip}${RESET}"
|
||
echo -e " 归属地 : ${GREEN}${country} ${city}${RESET}"
|
||
echo -e " ASN/运营: ${GREEN}${org}${RESET}"
|
||
echo -e " 系统 : ${GREEN}$(lsb_release -d 2>/dev/null | cut -f2)${RESET}"
|
||
echo -e " 内核 : ${GREEN}$(uname -r)${RESET}"
|
||
echo -e " 时间 : ${GREEN}$(date '+%Y-%m-%d %H:%M:%S %Z')${RESET}"
|
||
}
|
||
|
||
install_deps() {
|
||
print_section "🔧 检查并安装依赖"
|
||
|
||
apt-get update -qq 2>/dev/null
|
||
|
||
# mtr
|
||
if ! command -v mtr &>/dev/null; then
|
||
echo -e " ${YELLOW}安装 mtr...${RESET}"
|
||
apt-get install -y -qq mtr-tiny 2>/dev/null && \
|
||
echo -e " ${GREEN}✔ mtr 安装完成${RESET}" || \
|
||
echo -e " ${RED}✘ mtr 安装失败${RESET}"
|
||
else
|
||
echo -e " ${GREEN}✔ mtr 已安装${RESET}"
|
||
fi
|
||
|
||
# traceroute
|
||
if ! command -v traceroute &>/dev/null; then
|
||
echo -e " ${YELLOW}安装 traceroute...${RESET}"
|
||
apt-get install -y -qq traceroute 2>/dev/null && \
|
||
echo -e " ${GREEN}✔ traceroute 安装完成${RESET}" || \
|
||
echo -e " ${RED}✘ traceroute 安装失败${RESET}"
|
||
else
|
||
echo -e " ${GREEN}✔ traceroute 已安装${RESET}"
|
||
fi
|
||
|
||
# nexttrace
|
||
if ! command -v nexttrace &>/dev/null; then
|
||
echo -e " ${YELLOW}安装 nexttrace...${RESET}"
|
||
curl -s https://raw.githubusercontent.com/nxtrace/NTrace-core/main/nt_install.sh | bash -s -- --yes 2>/dev/null
|
||
if command -v nexttrace &>/dev/null; then
|
||
echo -e " ${GREEN}✔ nexttrace 安装完成${RESET}"
|
||
else
|
||
echo -e " ${RED}✘ nexttrace 安装失败,回程测试将跳过${RESET}"
|
||
fi
|
||
else
|
||
echo -e " ${GREEN}✔ nexttrace 已安装$(nexttrace --version 2>/dev/null | head -1)${RESET}"
|
||
fi
|
||
}
|
||
|
||
# ── 去程测试(ping延迟)────────────────────────────────────────
|
||
ping_test() {
|
||
local label=$1
|
||
local ip=$2
|
||
local result=$(ping -c 3 -W 3 "$ip" 2>/dev/null | tail -1 | awk -F'/' '{print $5}')
|
||
if [[ -n "$result" ]]; then
|
||
echo -e " ${ip} → ${GREEN}${result} ms${RESET}"
|
||
else
|
||
echo -e " ${ip} → ${RED}超时/不可达${RESET}"
|
||
fi
|
||
}
|
||
|
||
outbound_test() {
|
||
print_section "📤 去程延迟测试(VPS → 国内)"
|
||
|
||
echo -e "\n ${BOLD}▶ 电信${RESET}"
|
||
for ip in "${TELECOM_IPS[@]}"; do
|
||
ping_test "电信" "$ip"
|
||
done
|
||
|
||
echo -e "\n ${BOLD}▶ 联通${RESET}"
|
||
for ip in "${UNICOM_IPS[@]}"; do
|
||
ping_test "联通" "$ip"
|
||
done
|
||
|
||
echo -e "\n ${BOLD}▶ 移动${RESET}"
|
||
for ip in "${MOBILE_IPS[@]}"; do
|
||
ping_test "移动" "$ip"
|
||
done
|
||
}
|
||
|
||
# ── 回程路由追踪 ──────────────────────────────────────────────
|
||
return_route_nexttrace() {
|
||
local label=$1
|
||
local ip=$2
|
||
local color=$3
|
||
|
||
echo -e "\n ${color}${BOLD}▶ ${label} 回程路由 → ${ip}${RESET}"
|
||
echo -e " ${CYAN}$(printf '─%.0s' {1..48})${RESET}"
|
||
|
||
if command -v nexttrace &>/dev/null; then
|
||
nexttrace --no-rdns "$ip" 2>/dev/null | \
|
||
grep -v "^$" | \
|
||
sed 's/^/ /'
|
||
else
|
||
echo -e " ${RED}nexttrace 未安装,使用 traceroute 替代(无ASN信息)${RESET}"
|
||
traceroute -n -m 20 "$ip" 2>/dev/null | sed 's/^/ /'
|
||
fi
|
||
}
|
||
|
||
return_route_test() {
|
||
print_section "📥 回程路由追踪(VPS → 国内三网)"
|
||
echo -e " ${YELLOW}提示: 关注 AS 号码${RESET}"
|
||
echo -e " ${YELLOW} 电信CN2: as4809 普通163: as4134${RESET}"
|
||
echo -e " ${YELLOW} 联通9929: as9929 普通169: as4837${RESET}"
|
||
echo -e " ${YELLOW} 移动CMIN2: as58807 普通CMNet: as9808${RESET}"
|
||
|
||
return_route_nexttrace "电信" "$TELECOM_RETURN" "$RED"
|
||
return_route_nexttrace "联通" "$UNICOM_RETURN" "$BLUE"
|
||
return_route_nexttrace "移动" "$MOBILE_RETURN" "$GREEN"
|
||
}
|
||
|
||
# ── MTR 质量测试 ──────────────────────────────────────────────
|
||
mtr_test() {
|
||
print_section "📊 MTR 丢包率测试(各发送10个包)"
|
||
|
||
local targets=(
|
||
"电信上海|$TELECOM_RETURN"
|
||
"联通武汉|$UNICOM_RETURN"
|
||
"移动北京|$MOBILE_RETURN"
|
||
)
|
||
|
||
for item in "${targets[@]}"; do
|
||
local label="${item%%|*}"
|
||
local ip="${item##*|}"
|
||
echo -e "\n ${BOLD}▶ ${label} (${ip})${RESET}"
|
||
if command -v mtr &>/dev/null; then
|
||
mtr --report --report-cycles 10 --no-dns "$ip" 2>/dev/null | \
|
||
awk 'NR>1 {printf " %-5s %-18s Loss:%5s Avg:%7s ms\n", $1, $2, $3, $8}' | \
|
||
head -20
|
||
else
|
||
echo -e " ${RED}mtr 未安装${RESET}"
|
||
fi
|
||
done
|
||
}
|
||
|
||
# ── 摘要 ──────────────────────────────────────────────────────
|
||
summary() {
|
||
print_section "✅ 检测完成"
|
||
echo -e " 如需可视化路由图,访问 nexttrace 输出的 MapTrace URL"
|
||
echo -e " 如需重新测试: ${CYAN}bash route_test.sh${RESET}"
|
||
echo ""
|
||
}
|
||
|
||
# ── 主流程 ────────────────────────────────────────────────────
|
||
main() {
|
||
check_root
|
||
print_banner
|
||
get_vps_info
|
||
install_deps
|
||
outbound_test
|
||
return_route_test
|
||
mtr_test
|
||
summary
|
||
}
|
||
|
||
main
|