Files
ai-setup/tests/test_network.sh
vitaly 7c8b3a7147 feat: issue #4 — geo-тест внешних IP в test_network.sh
Добавлен блок «7. Geo: внешние IP» — curl через прямой интерфейс
и через дефолт (VPN). Показывает оба IP и проверяет что они разные.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-07 20:14:54 +03:00

98 lines
4.5 KiB
Bash
Raw 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/bash
# Тесты сетевой настройки: Amnezia + ru-bypass + kill switch
# Запускать без sudo (проверяет что доступно обычному пользователю)
RED='\033[0;31m'
GRN='\033[0;32m'
YEL='\033[0;33m'
CLR='\033[0m'
pass=0 fail=0
check() {
local desc="$1" expected="$2"
local actual
actual=$(eval "$3" 2>&1)
if echo "$actual" | grep -qE "$expected"; then
echo -e "${GRN}${CLR} $desc"
pass=$((pass+1))
else
echo -e "${RED}${CLR} $desc"
echo " ожидалось: $expected"
echo " получено: $(echo "$actual" | head -3)"
fail=$((fail+1))
fi
}
echo "=== 1. Проверка окружения ==="
check "Amnezia интерфейс (amn0) существует" "amn0" "ip link show amn0 2>/dev/null"
check "wlp1s0 wifi интерфейс" "wlp1s0" "ip link show wlp1s0 2>/dev/null"
IPSET_INFO=$(sudo ipset list ru-direct 2>/dev/null)
if [ -n "$IPSET_INFO" ]; then
echo -e "${GRN}${CLR} ipset ru-direct существует"
IPSET_COUNT=$(echo "$IPSET_INFO" | grep -c '/')
if [ "$IPSET_COUNT" -gt 100 ]; then
echo -e "${GRN}${CLR} ipset не пуст ($IPSET_COUNT блоков)"
else
echo -e "${RED}${CLR} ipset слишком мал ($IPSET_COUNT блоков)"
fi
RU_IP=$(echo "$IPSET_INFO" | grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | head -1)
else
echo -e "${YEL}?${CLR} ipset — проверь с sudo"
RU_IP=$(dig +short ya.ru A | head -1)
fi
echo ""
echo "=== 2. Маршрутизация .ru vs не-.ru ==="
check ".ru IP ($RU_IP) → НЕ через amn0" "wl[pi]" "ip route get $RU_IP 2>/dev/null"
check "8.8.8.8 → через amn0" "amn0" "ip route get 8.8.8.8 2>/dev/null"
check "1.1.1.1 → через amn0" "amn0" "ip route get 1.1.1.1 2>/dev/null"
echo ""
echo "=== 3. DNS резолвинг ==="
check "ozon.ru резолвится" "185\.73\." "dig +short ozon.ru A 2>/dev/null"
check "google.com резолвится" "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" "dig +short google.com A 2>/dev/null | head -1"
check "gosuslugi.ru резолвится" "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" "dig +short gosuslugi.ru A 2>/dev/null | head -1"
echo ""
echo "=== 4. Связность (Amnezia вкл) ==="
check "google.com отвечает (VPN)" "HTTP" "curl -sI --max-time 5 https://google.com 2>&1 | head -1"
check "ozon.ru отвечает (прямо)" "HTTP" "curl -sI --max-time 5 https://ozon.ru 2>&1 | head -1"
check "gosuslugi.ru отвечает (прямо)" "HTTP" "curl -sI --max-time 5 https://gosuslugi.ru 2>&1 | head -1"
echo ""
echo "=== 5. Инфраструктура (нужен sudo) ==="
UFW_STATUS=$(sudo ufw status 2>/dev/null)
if echo "$UFW_STATUS" | grep -qE "активен|active"; then
echo -e "${GRN}${CLR} UFW активен"
else
echo -e "${YEL}?${CLR} UFW — запусти с sudo: sudo ufw status"
fi
check "ru-bypass сервис есть" "ru-bypass" "systemctl list-unit-files 2>/dev/null | grep ru-bypass || echo 'OK (проверить с sudo)'"
check "NM dispatcher есть" "99-ru-bypass" "ls -la /etc/NetworkManager/dispatcher.d/99-ru-bypass 2>/dev/null"
echo ""
echo "=== 6. Краевые случаи ==="
check "api.anthropic.com → amn0" "amn0" "ip route get $(dig +short api.anthropic.com A | head -1) 2>/dev/null"
check "ya.ru → НЕ через amn0 (прямо)" "wl[pi]" "ip route get $(dig +short ya.ru A | head -1) 2>/dev/null"
echo ""
echo "=== 7. Geo: внешние IP ==="
DEV_DIRECT=$(ip route show default 2>/dev/null | awk '/default/ {print $5; exit}')
ip_direct=$(curl -s --interface "$DEV_DIRECT" --max-time 10 https://ipinfo.io/ip 2>/dev/null)
ip_vpn=$(curl -s --max-time 10 https://ipinfo.io/ip 2>/dev/null)
echo " Прямой IP (через ${DEV_DIRECT:-?}): ${ip_direct:-недоступно}"
echo " VPN IP (через amn0): ${ip_vpn:-недоступно}"
if [ -n "$ip_direct" ] && [ -n "$ip_vpn" ] && [ "$ip_direct" != "$ip_vpn" ]; then
echo -e " ${GRN}${CLR} IP разные — .ru идёт напрямую, остальное через VPN"
pass=$((pass+1))
else
echo -e " ${YEL}!${CLR} IP одинаковые или недоступны — проверь маршрутизацию"
fail=$((fail+1))
fi
echo ""
echo "========================================="
echo -e "Итого: ${GRN}$pass пройдено${CLR}, ${RED}$fail провалено${CLR}"
[ "$fail" -eq 0 ] && echo -e "${GRN}ВСЁ ОК${CLR}" || echo -e "${RED}ЕСТЬ ПРОБЛЕМЫ${CLR}"