Files
ai-setup/home-configs/network/ru-direct.sh
vitaly 17c456ed4f feat: добавить скрипты управления сетью и kill switch
- ks-off.sh — временно отключить UFW kill switch перед сёрфингом без VPN
- ks-on.sh — восстановить kill switch (с проверкой что amn0 поднят)
- ru-direct.sh — роутинг всех российских IP напрямую через провайдера, минуя Amnezia
- ru-direct-undo.sh — откат ru-direct.sh, возврат к "всё через VPN"

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-06 11:44:40 +03:00

129 lines
4.3 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
# 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"