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