#!/bin/bash # ru-direct.sh — Route all Russian IPs directly, bypassing Amnezia VPN # Run as root: sudo bash ru-direct.sh # # What it does: # 1. Downloads Russian IP ranges from RIPE # 2. Adds routes via local gateway (bypasses amn0) # 3. Adds nftables rule to allow those packets before UFW's deny # # Persistent via: /etc/systemd/system/ru-direct.service set -euo pipefail GATEWAY="192.168.1.1" IFACE="wlp1s0" NFT_TABLE="ru_direct" CACHE_FILE="/var/cache/ru_ips.txt" RIPE_URL="https://ftp.ripe.net/pub/stats/ripencc/delegated-ripencc-latest" if [ "$(id -u)" != "0" ]; then echo "Запускай от root: sudo bash $0" exit 1 fi # ── 1. Загрузить/обновить список российских IP ───────────────────────────── echo "==> Загружаем российские IP с RIPE..." FRESH=$(curl -s --max-time 120 "$RIPE_URL" | \ awk -F'|' '$2=="RU" && $3=="ipv4" { n=$5+0; bits=0; while (n > 1) { n /= 2; bits++ } print $4 "/" (32 - bits) }') COUNT=$(echo "$FRESH" | wc -l) if [ "$COUNT" -lt 100 ]; then echo "ERROR: подозрительно мало диапазонов ($COUNT), прерываем" exit 1 fi echo " Найдено $COUNT диапазонов" echo "$FRESH" > "$CACHE_FILE" # ── 2. Настроить nftables (до UFW, priority -10) ─────────────────────────── echo "==> Настраиваем nftables..." # Удаляем старую таблицу если есть nft delete table inet "$NFT_TABLE" 2>/dev/null || true # Создаём новую таблицу, set и правило nft add table inet "$NFT_TABLE" nft add set inet "$NFT_TABLE" ru_ips \ '{ type ipv4_addr; flags interval; auto-merge; }' nft add chain inet "$NFT_TABLE" output \ '{ type filter hook output priority -10; policy accept; }' nft add rule inet "$NFT_TABLE" output \ ip daddr "@ru_ips" accept # Загружаем IP в set (порциями по 500, чтобы не упасть на ARG_MAX) echo "==> Загружаем IP в nftables set..." BATCH=() BATCH_SIZE=0 while IFS= read -r subnet; do BATCH+=("$subnet") BATCH_SIZE=$(( BATCH_SIZE + 1 )) if [ "$BATCH_SIZE" -ge 500 ]; then ELEMENTS=$(IFS=','; echo "${BATCH[*]}") nft add element inet "$NFT_TABLE" ru_ips "{ $ELEMENTS }" BATCH=() BATCH_SIZE=0 fi done < "$CACHE_FILE" # Остаток if [ "${#BATCH[@]}" -gt 0 ]; then ELEMENTS=$(IFS=','; echo "${BATCH[*]}") nft add element inet "$NFT_TABLE" ru_ips "{ $ELEMENTS }" fi echo " nftables: $(nft list set inet $NFT_TABLE ru_ips | grep -c '/') подсетей загружено" # ── 3. Добавить маршруты через локальный провайдер ───────────────────────── echo "==> Добавляем маршруты через $GATEWAY ($IFACE)..." ADDED=0 SKIPPED=0 while IFS= read -r subnet; do if ip route add "$subnet" via "$GATEWAY" dev "$IFACE" 2>/dev/null; then ADDED=$(( ADDED + 1 )) else SKIPPED=$(( SKIPPED + 1 )) fi done < "$CACHE_FILE" echo " Добавлено: $ADDED, уже было: $SKIPPED" # ── 4. Установить systemd-сервис ─────────────────────────────────────────── SCRIPT_DEST="/usr/local/bin/ru-direct.sh" cp "$0" "$SCRIPT_DEST" chmod +x "$SCRIPT_DEST" cat > /etc/systemd/system/ru-direct.service << 'EOF' [Unit] Description=Route Russian IPs directly (bypass Amnezia VPN) After=network-online.target amnezia-vpn.service Wants=network-online.target [Service] Type=oneshot RemainAfterExit=yes ExecStart=/usr/local/bin/ru-direct.sh StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl enable ru-direct.service echo "" echo "==> Готово!" echo " Российский трафик теперь идёт напрямую через $IFACE" echo " Сервис включён для автозапуска при загрузке" echo "" echo "Проверь:" echo " curl -s -o /dev/null -w '%{http_code}' -L --max-time 10 https://ozon.ru"