Добавлен блок «7. Geo: внешние IP» — curl через прямой интерфейс и через дефолт (VPN). Показывает оба IP и проверяет что они разные. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
98 lines
4.5 KiB
Bash
98 lines
4.5 KiB
Bash
#!/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}"
|