Files
Виталий Никитенко 083a614940 feat(eltex): add ai-eltex launcher for corporate LLM proxy
ai-eltex runs Claude Code through the Eltex LiteLLM proxy
(http://llm.eltex.loc:4000, team GLM subscription). The personal key
from admins is checked via /v1/models and stored in
~/.config/ai-setup/eltex_key; the model is taken from the key's
allowed list (ELTEX_MODEL / ELTEX_BASE_URL override). The proxy
ignores effort/thinking, so no effort forcing. /logout-eltex and
/logout in ai-eltex drop the key; setup.sh status shows it.

ru-bypass: hosts block now has an end marker and only that block is
rewritten, manual entries outside it survive; llm.eltex.loc/llm2 added
since the VPN DNS does not resolve it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 12:21:02 +07:00
..

Сетевые скрипты

Скрипты для окружения с Amnezia VPN и UFW kill switch.

Главная идея: весь не-.ru трафик идёт через Amnezia, .ru сайты (ozon.ru, госуслуги и т.д.) - напрямую через провайдера с российским IP. Если Amnezia падает - не-.ru трафик блокируется UFW, .ru продолжает работать.


Скрипты

Файл Назначение
ru-bypass.sh Основной - настраивает .ru маршруты и ipset
ks-off.sh Временно отключить UFW kill switch (доступ без VPN)
ks-on.sh Восстановить UFW kill switch

Сетевые скрипты запускаются от root. Обычно их дергает setup.sh через sudo и сохраняет профиль в ~/.config/ai-setup/network_<profile>.conf; сам ru-bypass.sh дополнительно пишет root-конфиг /etc/ru-bypass.conf для systemd и NetworkManager dispatcher.


Как работает ru-bypass

Принцип

Amnezia поднимает интерфейс amn0 и захватывает весь трафик двумя широкими маршрутами:

  • 0.0.0.0/1 dev amn0
  • 128.0.0.0/1 dev amn0

ru-bypass.sh добавляет тысячи более специфичных маршрутов для .ru IP-блоков через локальный роутер (например 95.173.0.0/16 via <GATEWAY> dev <DEV>). Ядро Linux выбирает самый специфичный маршрут - .ru уходит напрямую, всё остальное - в amn0.

UFW kill switch

default deny outgoing              — запрещено всё по умолчанию
allow out on amn0                  — через Amnezia можно всё
before.rules: ipset ru-direct      — для .ru IP разрешён прямой выход на DEV
before.rules: 10/8, 172.16/12,
              192.168/16           — RFC1918 (*.loc) разрешён прямой выход на DEV

Если Amnezia падает: amn0 исчезает, не-.ru трафик блокируется UFW. Маршруты .ru через DEV и правило UFW для ipset остаются - .ru работает.

Что делает скрипт при запуске

  1. Скачивает список .ru IP-блоков из RIPE (кэш 24 часа в /var/cache/ru-delegations.txt)
  2. Создаёт/обновляет ipset ru-direct (~11000 записей)
  3. Сохраняет ipset в /etc/ipset.conf
  4. Добавляет маршруты через локальный роутер для всех .ru блоков
  5. Добавляет маршруты для RFC1918 диапазонов (10/8, 172.16/12, 192.168/16) - нужно для *.loc
  6. Добавляет встроенные исключения kill switch (mattermost.eltex-co.ru, elph.eltex-co.ru, 10.80.0.15)
  7. Добавляет пользовательские исключения из AMNEZIA_SERVER и KILL_SWITCH_EXCEPTIONS
  8. Обновляет блок локальных Eltex-хостов в /etc/hosts (только между маркерами # ru-bypass: local hosts / # ru-bypass: end, ручные записи сохраняются)
  9. Если задан LOCAL_DNS, настраивает resolvectl для ~loc на интерфейсе DEV
  10. Обновляет /etc/ufw/before.rules, прямые iptables-правила и отключает IPv6 при активном kill switch
  11. При первом запуске: устанавливает systemd service/timer и NetworkManager dispatcher

Сервисы (устанавливаются однократно)

  • ru-ipset-restore.service - запускается до UFW, восстанавливает ipset из файла. Нужен потому что UFW стартует рано и не знает об ipset ru-direct.
  • ru-bypass.service - запускается после network-online, качает свежий RIPE-список и добавляет маршруты.
  • ru-bypass.timer - ежедневно запускает ru-bypass.service для обновления RIPE-списка.
  • NM dispatcher /etc/NetworkManager/dispatcher.d/99-ru-bypass - автоматически перезапускает скрипт когда amn0 поднимается (Amnezia переподключилась).

Запуск

Первый запуск / обновление через меню

bash setup.sh
# выбери пункт 2) Сеть: ru-bypass + kill switch

Меню предложит значения из ip route show default, даст выбрать профиль (home, office, $(hostname) и т.д.) и сохранит:

GATEWAY=...
DEV=...
LOCAL_DNS=...
AMNEZIA_SERVER=...
KILL_SWITCH_EXCEPTIONS=...

Прямой запуск скрипта

sudo bash scripts/ru-bypass.sh

Если env-переменные не переданы, скрипт сначала читает /etc/ru-bypass.conf, а потом использует legacy-дефолты GATEWAY=192.168.1.1, DEV=wlp1s0.

Параметры для другой сети

Для другой сети передай параметры через env:

sudo GATEWAY=10.0.0.1 DEV=enp3s0 LOCAL_DNS=10.0.0.53 bash scripts/ru-bypass.sh

Чтобы узнать нужные значения:

ip route show default
# Пример: default via 10.0.0.1 dev enp3s0 proto dhcp
#                      ^^^^^^^      ^^^^^^
#                      GATEWAY      DEV

Офисная машина

Если в офисе другой gateway и другой сетевой интерфейс - создай отдельный профиль через пункт 2 в setup.sh или передай значения через env. Amnezia там тоже поднимает amn0, так что остальное работает одинаково.

Пример (офис с проводным интерфейсом):

sudo GATEWAY=192.168.0.1 DEV=eth0 LOCAL_DNS=192.168.0.53 bash scripts/ru-bypass.sh

ks-off.sh и ks-on.sh

Для ситуаций когда нужен временный доступ без VPN (сайты, которые блокируют нероссийские IP, например для оплаты или личного кабинета).

ks-off.sh - отключить kill switch

sudo bash scripts/ks-off.sh

Отключает UFW. После этого - отключить Amnezia через GUI. Трафик пойдёт напрямую через провайдера (российский IP).

Примечание: IPv6 остаётся отключённым после ks-off.sh (если он был выключен ks-on.sh или ru-bypass.sh). Он восстановится автоматически при следующем ks-on.sh или перезагрузке.

Важно: выйди из Claude Code перед этим - сессия будет идти с другого IP.

ks-on.sh - восстановить kill switch

sudo bash scripts/ks-on.sh

Сначала подключи Amnezia через GUI (дождись появления amn0), потом запускай. Иначе скрипт предупредит - без amn0 UFW сразу заблокирует весь интернет.

Типичный workflow

# Нужен ru-сайт без VPN:
1. Выйти из Claude Code
2. sudo bash ks-off.sh
3. Отключить Amnezia в GUI

# Возврат к нормальному режиму:
4. Подключить Amnezia в GUI (подождать amn0)
5. sudo bash ks-on.sh
6. Войти в Claude Code

Проверка

# Эти команды без sudo:
ip route get 8.8.8.8           # -> dev amn0 (Google через VPN)
ip route get 95.173.136.1      # -> dev <DEV> (ozon.ru напрямую)
ip route get $(dig +short api.anthropic.com A | head -1)  # -> dev amn0

# Полные тесты:
bash tests/test_network.sh