Files
ai-setup/tests/test_network.sh
vitaly fcf810fd75 feat: ru-bypass — .ru трафик напрямую мимо Amnezia, всё остальное через VPN
- ipset ru-direct + маршруты через 192.168.1.1 для всех RU IP-блоков (RIPE)
- kill switch (UFW) остаётся: не-.ru трафик при отвале Amnezia блокируется
- ru-ipset-restore.service стартует до UFW — исправляет проблему перезагрузки
- ru-bypass.service стартует после network-online — обновляет RIPE и маршруты
- NM dispatcher авто-перезапускает при reconnect amn0
- python3 summarize_address_range для корректной обработки невыровненных блоков RIPE
- tests/test_network.sh — автотесты маршрутизации и связности

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-07 08:41:16 +03:00

83 lines
3.7 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 "========================================="
echo -e "Итого: ${GRN}$pass пройдено${CLR}, ${RED}$fail провалено${CLR}"
[ "$fail" -eq 0 ] && echo -e "${GRN}ВСЁ ОК${CLR}" || echo -e "${RED}ЕСТЬ ПРОБЛЕМЫ${CLR}"