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:
17
home-configs/network/ks-off.sh
Normal file
17
home-configs/network/ks-off.sh
Normal file
@@ -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"
|
||||||
29
home-configs/network/ks-on.sh
Normal file
29
home-configs/network/ks-on.sh
Normal file
@@ -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
|
||||||
65
home-configs/network/ru-direct-undo.sh
Normal file
65
home-configs/network/ru-direct-undo.sh
Normal file
@@ -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 "Или перезагрузи систему для полной чистоты."
|
||||||
128
home-configs/network/ru-direct.sh
Normal file
128
home-configs/network/ru-direct.sh
Normal 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"
|
||||||
Reference in New Issue
Block a user