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>
This commit is contained in:
2026-06-06 11:44:40 +03:00
parent c1e68571f8
commit 17c456ed4f
4 changed files with 239 additions and 0 deletions

View File

@@ -0,0 +1,128 @@
#!/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"