From 17c456ed4fe69f4ae4e5db987b1e39b0f27a7ab2 Mon Sep 17 00:00:00 2001 From: vitaly Date: Sat, 6 Jun 2026 11:44:40 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D1=81=D0=BA=D1=80=D0=B8=D0=BF=D1=82=D1=8B=20?= =?UTF-8?q?=D1=83=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D1=81=D0=B5=D1=82=D1=8C=D1=8E=20=D0=B8=20kill=20switch?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 --- home-configs/network/ks-off.sh | 17 ++++ home-configs/network/ks-on.sh | 29 ++++++ home-configs/network/ru-direct-undo.sh | 65 +++++++++++++ home-configs/network/ru-direct.sh | 128 +++++++++++++++++++++++++ 4 files changed, 239 insertions(+) create mode 100644 home-configs/network/ks-off.sh create mode 100644 home-configs/network/ks-on.sh create mode 100644 home-configs/network/ru-direct-undo.sh create mode 100644 home-configs/network/ru-direct.sh diff --git a/home-configs/network/ks-off.sh b/home-configs/network/ks-off.sh new file mode 100644 index 0000000..7a6b33c --- /dev/null +++ b/home-configs/network/ks-off.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# ks-off.sh — временно отключить kill switch UFW +# После этого отключи Amnezia через её GUI — трафик пойдёт напрямую через провайдера. +# Обратная команда: sudo bash ks-on.sh + +if [ "$(id -u)" != "0" ]; then + echo "Запускай от root: sudo bash $0" + exit 1 +fi + +echo "Отключаем UFW kill switch..." +ufw disable +echo "" +echo "Готово. UFW выключен." +echo "Теперь отключи Amnezia через её GUI — трафик пойдёт напрямую (российский IP)." +echo "" +echo "Чтобы вернуть kill switch: sudo bash ks-on.sh" diff --git a/home-configs/network/ks-on.sh b/home-configs/network/ks-on.sh new file mode 100644 index 0000000..e22794b --- /dev/null +++ b/home-configs/network/ks-on.sh @@ -0,0 +1,29 @@ +#!/bin/bash +# ks-on.sh — включить/восстановить kill switch UFW +# Перед этим подключи Amnezia через её GUI, иначе интернет будет полностью заблокирован. + +if [ "$(id -u)" != "0" ]; then + echo "Запускай от root: sudo bash $0" + exit 1 +fi + +echo "Проверяем что Amnezia поднята..." +if ! ip link show amn0 &>/dev/null && ! ip link show amnezia0 &>/dev/null; then + echo "" + echo "ВНИМАНИЕ: интерфейс amn0/amnezia0 не найден!" + echo "Похоже Amnezia не подключена." + echo "Если включить UFW сейчас — интернет полностью заблокируется." + echo "" + read -p "Всё равно включить kill switch? [y/N] " CONFIRM + if [ "$CONFIRM" != "y" ] && [ "$CONFIRM" != "Y" ]; then + echo "Отменено." + exit 0 + fi +fi + +echo "Включаем UFW kill switch..." +ufw enable +echo "" +echo "Готово. Kill switch активен." +echo "" +ufw status | head -3 diff --git a/home-configs/network/ru-direct-undo.sh b/home-configs/network/ru-direct-undo.sh new file mode 100644 index 0000000..66bade1 --- /dev/null +++ b/home-configs/network/ru-direct-undo.sh @@ -0,0 +1,65 @@ +#!/bin/bash +# ru-direct-undo.sh — Откат ru-direct.sh, возврат к состоянию "всё через Amnezia" +# Run as root: sudo bash ru-direct-undo.sh + +set -euo pipefail + +IFACE="wlp1s0" +GATEWAY="192.168.1.1" +NFT_TABLE="ru_direct" +CACHE_FILE="/var/cache/ru_ips.txt" + +if [ "$(id -u)" != "0" ]; then + echo "Запускай от root: sudo bash $0" + exit 1 +fi + +# ── 1. Удалить nftables таблицу ──────────────────────────────────────────── + +echo "==> Удаляем nftables таблицу $NFT_TABLE..." +if nft delete table inet "$NFT_TABLE" 2>/dev/null; then + echo " Удалено" +else + echo " Таблицы не было (или уже удалена)" +fi + +# ── 2. Удалить маршруты через wlp1s0 ────────────────────────────────────── + +echo "==> Удаляем маршруты через $IFACE..." +if [ -f "$CACHE_FILE" ]; then + REMOVED=0 + while IFS= read -r subnet; do + if ip route del "$subnet" via "$GATEWAY" dev "$IFACE" 2>/dev/null; then + (( REMOVED++ )) + fi + done < "$CACHE_FILE" + echo " Удалено маршрутов: $REMOVED" +else + echo " Кеш $CACHE_FILE не найден, маршруты удалим по-другому..." + # Удаляем все маршруты через wlp1s0, кроме локальной подсети + ip route show dev "$IFACE" | awk '$1 !~ /^192\.168\./ && $1 != "default" {print $1}' | \ + while read subnet; do + ip route del "$subnet" dev "$IFACE" 2>/dev/null && echo " del $subnet" || true + done +fi + +# ── 3. Остановить и удалить systemd-сервис ───────────────────────────────── + +echo "==> Отключаем systemd-сервис..." +systemctl stop ru-direct.service 2>/dev/null || true +systemctl disable ru-direct.service 2>/dev/null || true +rm -f /etc/systemd/system/ru-direct.service +systemctl daemon-reload +echo " Сервис удалён" + +# ── 4. Удалить файлы ─────────────────────────────────────────────────────── + +rm -f /usr/local/bin/ru-direct.sh +rm -f "$CACHE_FILE" +echo "==> Файлы удалены" + +echo "" +echo "==> Откат завершён. Всё как было — весь трафик через Amnezia." +echo "" +echo "Если что-то в браузере не переключилось — перезапусти его." +echo "Или перезагрузи систему для полной чистоты." diff --git a/home-configs/network/ru-direct.sh b/home-configs/network/ru-direct.sh new file mode 100644 index 0000000..48f14be --- /dev/null +++ b/home-configs/network/ru-direct.sh @@ -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"