diff --git a/AGENTS.md b/AGENTS.md index 369af2b..dc582d5 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -2,4 +2,4 @@ Данные правила применяются ко всем агентам, работающим конкретно в этом репозитории. -1. **Полная перегенерация standalone-скриптов при запуске сетап-скрипта (Full regeneration of standalone scripts on setup run):** При каждом запуске `ai-setup.sh` все генерируемые скрипты в `~/.local/bin/` (`ai-gpt`, `ai-deepseek`, `ai-kimi`, `ai-openrouter`, `ai-gemini`, `ai-api-helpers.sh`, `ai-claude`) должны быть **полностью перезаписаны** актуальными версиями. Запрещено выполнять слияние (merge) старого и нового содержимого или дополнение (append). Скрипт обязан привести все генерируемые файлы к эталонному виду, однозначно определяемому текущей конфигурацией. +1. **Полная перегенерация standalone-скриптов при запуске сетап-скрипта (Full regeneration of standalone scripts on setup run):** При каждом запуске `ai-setup.sh` все генерируемые скрипты в выбранном `BIN_DIR` (`~/bin`, если он уже есть в `PATH`, иначе `~/.local/bin`: `ai-gpt`, `ai-deepseek`, `ai-kimi`, `ai-openrouter`, `ai-gemini`, `ai-api-helpers.sh`, `ai-claude`, `claude-gpt-effort-proxy.py`) должны быть **полностью перезаписаны** актуальными версиями. Запрещено выполнять слияние (merge) старого и нового содержимого или дополнение (append). Скрипт обязан привести все генерируемые файлы к эталонному виду, однозначно определяемому текущей конфигурацией. diff --git a/EFFORT_MAPPING.md b/EFFORT_MAPPING.md index 2018073..026e44b 100644 --- a/EFFORT_MAPPING.md +++ b/EFFORT_MAPPING.md @@ -1,116 +1,112 @@ -# Effort Mapping — Соответствие уровней для всех провайдеров +# Effort Mapping - соответствие уровней для Claude Code лаунчеров ## Как это работает -Когда вы меняете effort в Claude Code (через `/effort` или `--effort`), значение передаётся -в API провайдера. Каждый провайдер поддерживает свой набор уровней reasoning effort. -Если выбранного уровня нет у провайдера — он автоматически маппится на ближайший -**более высокий** нативный уровень. +`/effort` и `AI_EFFORT` относятся к лаунчерам, которые запускают Claude Code: +`ai-claude`, `ai-deepseek`, `ai-kimi`, `ai-openrouter`. + +Нативные лаунчеры `ai-gpt` (OpenAI Codex) и `ai-gemini` (Antigravity `agy`) не используют +эту схему. У них свои настройки reasoning внутри соответствующего CLI. + +Документ отражает текущую реализацию `scripts/ai-setup.sh`. ## Таблица маппинга -> Актуально на 12 июня 2026 г. +| Claude Code `/effort` | Anthropic (`ai-claude`) | DeepSeek V4 (`ai-deepseek`) | Kimi K2.7/K2.6 (`ai-kimi`) | OpenRouter/GPT-5.5 (`ai-openrouter`) | +|:---:|:---:|:---:|:---:|:---:| +| `low` | нативно `low` | провайдер поднимает до `high` | thinking on | без локального маппинга | +| `medium` | нативно `medium` | провайдер поднимает до `high` | thinking on | без локального маппинга | +| `high` | нативно `high` | нативно `high` | thinking on | без локального маппинга | +| `xhigh` | нативно `xhigh` | провайдер поднимает до `max` | thinking on | без локального маппинга | +| `max` | нативно `max` | нативно `max` | thinking on | без локального маппинга | -| Claude Code
`/effort` | Anthropic
(Claude) | GPT-5.5
(ChatGPT) | DeepSeek V4 | Kimi K2.7
(Moonshot) | Gemini 3.x | -|:---:|:---:|:---:|:---:|:---:|:---:| -| `low` | ✅ `low` | ✅ `low` | ⬆ `high` | 🔛 thinking on | ✅ `LOW` | -| `medium` | ✅ `medium` | ✅ `medium` | ⬆ `high` | 🔛 thinking on | ✅ `MEDIUM` | -| `high` | ✅ `high` | ✅ `high` | ✅ `high` | 🔛 thinking on | ✅ `HIGH` | -| `xhigh` | ✅ `xhigh` | ✅ `xhigh` | ⬆ `max` | 🔛 thinking on | ⬆ `HIGH` | -| `max` | ✅ `max` | ⬆ `xhigh` ¹ | ✅ `max` | 🔛 thinking on | ⬆ `HIGH` | - -**Обозначения:** -- ✅ — нативная поддержка (1:1 соответствие) -- ⬆ — маппинг на ближайший доступный уровень вверх -- 🔛 — бинарный режим (thinking вкл/выкл, без градаций) - -¹ GPT-5.5 не имеет уровня `max` — effort-proxy (`claude-gpt-effort-proxy.py`) маппит `max` → `xhigh` +Для OpenRouter текущий лаунчер не делает локального преобразования effort и отправляет +значение дальше через Claude Code/OpenRouter. Конкретная интерпретация зависит от выбранной +модели и backend-а OpenRouter. ## Нативные уровни каждого провайдера -### Anthropic (Claude) — эталон -``` -low → medium → high → xhigh → max -``` -- 5 уровней, полное соответствие с Claude Code -- По умолчанию: `xhigh` -- `max` — максимальный бюджет на thinking, для самых сложных задач +### Anthropic (Claude) -### GPT-5.5 (через claude-code-proxy) +```text +low -> medium -> high -> xhigh -> max ``` -low → medium → high → xhigh -``` -- 4 основных уровня (также существуют `none` и `minimal`) -- Нет `max` → маппится в `xhigh` -- По умолчанию: `medium` -- Маппинг выполняется effort-proxy на стороне лаунчера + +- 5 уровней, полное соответствие с Claude Code. +- Дефолт `ai-claude`: `xhigh`. +- `max` - максимальный бюджет thinking для самых сложных задач. ### DeepSeek V4 -``` -high → max -``` -- Всего 2 реальных уровня -- `low` и `medium` → автоматически поднимаются до `high` -- `xhigh` → автоматически поднимается до `max` -- Маппинг выполняется на стороне DeepSeek API -### Kimi K2.7 (Moonshot AI) +```text +high -> max ``` + +- 2 реальных уровня. +- `low` и `medium` фактически поднимаются до `high`. +- `xhigh` фактически поднимается до `max`. +- Маппинг выполняется на стороне DeepSeek API. +- Дефолт `ai-deepseek`: `high`. + +### Kimi K2.7/K2.6 (Moonshot AI) + +```text on / off ``` -- Бинарный режим — thinking либо включён, либо выключен -- Все уровни effort = thinking включён -- Нет градаций глубины reasoning -- Маппинг выполняется на стороне Moonshot API -### Gemini 3.x (через antigravity-claude-proxy) -``` -MINIMAL → LOW → MEDIUM → HIGH -``` -- 4 уровня -- Нет `xhigh` и `max` → оба маппятся в `HIGH` -- Pro-модели: по умолчанию `HIGH` -- Flash-модели: по умолчанию `MEDIUM` -- Маппинг выполняется на стороне antigravity-claude-proxy +- Бинарный режим: thinking либо включен, либо выключен. +- Все уровни Claude Code effort в текущем лаунчере означают thinking on. +- Градаций глубины reasoning нет. +- Дефолт `ai-kimi`: `high`. + +### OpenRouter / GPT-5.5 + +Текущий `ai-openrouter` работает через Claude Code с `ANTHROPIC_BASE_URL=https://openrouter.ai/api` +и не вызывает локальный effort proxy. Поэтому `low`/`medium`/`high`/`xhigh`/`max` не +преобразуются в shell-лаунчере. + +`claude-gpt-effort-proxy.py` все еще генерируется как совместимый helper для старого +`claude-code-proxy` backend-а. Если использовать его вручную, он маппит только +`xhigh` -> `high`, потому что `claude-code-proxy` принимает `low`, `medium`, `high`, `max`. ## Где выполняется маппинг | Провайдер | Кто маппит | Файл/компонент | |:---|:---|:---| -| Anthropic | Не нужен | — | -| GPT-5.5 | effort-proxy (наш) | `~/.local/bin/claude-gpt-effort-proxy.py` | +| Anthropic | Не нужен | - | | DeepSeek V4 | DeepSeek API | На стороне сервера | -| Kimi K2.7 | Moonshot API | На стороне сервера | -| Gemini 3.x | antigravity-claude-proxy | npm пакет | +| Kimi K2.7/K2.6 | Moonshot API | На стороне сервера | +| OpenRouter/GPT-5.5 | Локального маппинга нет | `ai-openrouter` отправляет значение как есть | +| Legacy GPT proxy | helper-маппинг `xhigh` -> `high` | `~/bin/claude-gpt-effort-proxy.py` или `~/.local/bin/claude-gpt-effort-proxy.py` | ## Persistence effort между сессиями -Каждый лаунчер (`ai-claude`, `ai-deepseek`, `ai-kimi`, `ai-openrouter`) запоминает свой -уровень effort отдельно. Логика гибридная: +Каждый Claude Code лаунчер (`ai-claude`, `ai-deepseek`, `ai-kimi`, `ai-openrouter`) +запоминает свой уровень effort отдельно. Логика гибридная: -- **`low` / `medium` / `high` / `xhigh`** живут нативно в `settings.json` лаунчера. +- `low` / `medium` / `high` / `xhigh` живут нативно в `settings.json` лаунчера. `/effort` внутри сессии работает как обычно, уровень сохраняется между сессиями. -- **`max`** — единственный, который Claude Code **не сохраняет** в `settings.json` +- `max` - единственный уровень, который Claude Code не сохраняет в `settings.json` (он session-only). Поэтому его восстанавливаем через `CLAUDE_CODE_EFFORT_LEVEL`. - Текущий уровень (включая `max`) статусбар пишет в `~/.cache/ai-setup/effort_`. + Текущий уровень, включая `max`, лаунчер записывает в `~/.cache/ai-setup/effort_`. -**Важное следствие (только для `max`):** когда восстановлена `max`-сессия, выставлена -`CLAUDE_CODE_EFFORT_LEVEL=max`, и `/effort` внутри неё **не сменит** уровень -(env-переменная — жёсткий override Claude Code). На остальных уровнях `/effort` свободен. +Важное следствие только для `max`: когда восстановлена `max`-сессия, выставлена +`CLAUDE_CODE_EFFORT_LEVEL=max`, и `/effort` внутри нее не сменит уровень, потому что +env-переменная работает как жесткий override Claude Code. -**Как выйти из `max` (или форсить любой уровень):** перезапусти лаунчер с `AI_EFFORT`: +Как выйти из `max` или форсить любой уровень: ```bash AI_EFFORT=max ai-deepseek # включить и запомнить max -AI_EFFORT=high ai-deepseek # вернуться на high (выйти из max) -ai-deepseek # без флага - восстанавливает последний уровень +AI_EFFORT=high ai-deepseek # вернуться на high +ai-deepseek # без флага - восстановить последний уровень ``` -Дефолты при пустом кэше: `xhigh` для `ai-claude`, `high` для остальных. +Дефолты при пустом кеше: `xhigh` для `ai-claude`, `high` для остальных Claude Code лаунчеров. ## Рекомендации -- **Для повседневной работы:** `high` или `xhigh` — работает одинаково хорошо у всех провайдеров -- **`max` effort:** имеет реальный эффект только у **Anthropic** и **DeepSeek**. Для GPT маппится в `xhigh`, для Gemini и Kimi — в их максимальный уровень -- **`low`/`medium`:** у DeepSeek и Kimi фактически не снижают reasoning — DeepSeek поднимет до `high`, Kimi просто включит thinking -- **Смена уровня:** на `low..xhigh` обычным `/effort`; из `max` — через `AI_EFFORT= ai-` (в max-сессии `/effort` залочен env-переменной, см. «Persistence effort») +- Для повседневной работы: `high` или `xhigh`. +- `max` effort имеет реальный эффект у Anthropic и DeepSeek; у Kimi это все тот же thinking on. +- `low`/`medium` у DeepSeek и Kimi фактически не снижают reasoning. +- Смена уровня на `low`..`xhigh`: обычным `/effort`; выход из `max`: через `AI_EFFORT= ai-`. diff --git a/QUICK_START.md b/QUICK_START.md index 6d96851..d040def 100644 --- a/QUICK_START.md +++ b/QUICK_START.md @@ -6,9 +6,9 @@ bash setup.sh ``` -Спросит про VLESS-прокси (можно пропустить — `n`), затем установит лаунчеры +Спросит про VLESS-прокси (по умолчанию `Y`; если не нужен, ответь `n`), затем установит лаунчеры `ai-claude`, `ai-gpt`, `ai-deepseek`, `ai-kimi`, `ai-openrouter`, `ai-gemini` -в `~/.local/bin/` и запишет API-ключи. +в `~/bin`, если он уже есть в `PATH`, иначе в `~/.local/bin/`, и запишет API-ключи. После установки, если команды не видны: ```bash @@ -20,25 +20,24 @@ exec bash Нужно один раз на каждой машине. .ru трафик идёт напрямую, остальное — через Amnezia. Если Amnezia падает, не-.ru блокируется. -```bash -# Запустить Amnezia, затем узнать gateway и интерфейс: -ip route show default -# Пример: default via 192.168.1.1 dev wlp1s0 +Запускай через `bash setup.sh` и выбери пункт `2) Сеть: ru-bypass + kill switch`. +Меню само предложит `GATEWAY` и `DEV` из `ip route show default`, даст выбрать профиль +(`home`, `office`, имя хоста и т.д.) и сохранит настройки в +`~/.config/ai-setup/network_.conf`. -# Запустить скрипт (дефолты: GATEWAY=192.168.1.1, DEV=wlp1s0) -sudo bash scripts/ru-bypass.sh +Дополнительные поля можно оставить пустыми: +- `LOCAL_DNS` - DNS для `*.loc` +- `AMNEZIA_SERVER` - IP/домен сервера Amnezia, чтобы VPN мог подняться при kill switch +- `KILL_SWITCH_EXCEPTIONS` - IP/домены, которые должны ходить напрямую -# Если параметры отличаются: -sudo GATEWAY=10.0.0.1 DEV=enp3s0 bash scripts/ru-bypass.sh -``` - -После первого запуска systemd-сервисы установлены — при перезагрузке всё поднимается само. +После первого запуска systemd-сервисы и timer установлены - при перезагрузке всё поднимается само, +а RIPE-список обновляется ежедневно. ## Проверка сети ```bash ip route get 8.8.8.8 # -> dev amn0 (через VPN) -ip route get $(dig +short ya.ru A | head -1) # -> dev wlp1s0 (напрямую) +ip route get $(dig +short ya.ru A | head -1) # -> dev (напрямую) bash tests/test_network.sh ``` diff --git a/README.md b/README.md index 07533f6..5e14d48 100644 --- a/README.md +++ b/README.md @@ -9,14 +9,17 @@ ``` setup.sh # мастер-скрипт с меню scripts/ -├── ai-setup.sh # устанавливает AI-инструменты в ~/.local/bin +├── ai-setup.sh # устанавливает AI-инструменты в выбранный BIN_DIR +├── fuck-rkn.sh # серверный установщик nginx + telemt + xray ├── ru-bypass.sh # .ru трафик напрямую, kill switch для остального ├── ks-off.sh # временно отключить kill switch └── ks-on.sh # восстановить kill switch home-configs/ ├── GLOBAL_RULES.md # глобальные правила для всех агентов ├── claude/ -│ └── skills/ # кастомные скиллы для Claude Code (и Gemini) +│ ├── hooks/ # хуки аккаунтов Claude Code +│ ├── skills/ # кастомные скиллы для Claude Code (и Gemini) +│ └── statusline-command.sh # статусная строка Claude Code ├── network/ │ └── README.md # подробная документация по сетевой настройке ├── vless/ @@ -27,6 +30,7 @@ tests/ ├── test_fixes.sh # юнит-тесты структуры ai-setup.sh └── test_network.sh # тесты маршрутизации test_isolated.sh # проверка автоустановки ai-gpt и ai-kimi +test_sigint.sh # ручной тест поведения SIGINT ``` ## Установка @@ -49,6 +53,7 @@ bash setup.sh 4) Включить kill switch 5) Статус 6) Проверить сеть + 7) Обновить # git pull + перегенерация AI-лаунчеров ``` После установки, если shell ещё не видит новые команды: @@ -85,7 +90,8 @@ before.rules: RFC1918 — 10/8, 172.16/12, 192.168/16 тоже напр ### Первый запуск Через меню (`bash setup.sh` → пункт 2) - он автоматически определит GATEWAY и DEV -из `ip route show default` и сохранит их в `~/.config/ai-setup/network_$(hostname).conf`. +из `ip route show default`, предложит профиль и сохранит настройки в +`~/.config/ai-setup/network_.conf` (по умолчанию профиль равен `$(hostname)`). Или напрямую: @@ -101,14 +107,19 @@ sudo GATEWAY=10.0.0.1 DEV=eth0 bash scripts/ru-bypass.sh - Скрипт копируется в `/usr/local/bin/ru-bypass.sh` - `ru-ipset-restore.service` - восстанавливает ipset из файла **до старта UFW** при загрузке - `ru-bypass.service` - обновляет RIPE-список и маршруты после network-online +- `ru-bypass.timer` - ежедневно запускает обновление RIPE-списка и маршрутов - NM dispatcher `/etc/NetworkManager/dispatcher.d/99-ru-bypass` - перезапускает скрипт при поднятии amn0 +- `/etc/ru-bypass.conf` - root-конфиг для запусков из systemd/NM dispatcher +- `/etc/hosts` блок для локальных Eltex-доменов При каждом запуске: - Скачивает список .ru IP-блоков из RIPE (кэш 24ч, `/var/cache/ru-delegations.txt`) - Обновляет ipset `ru-direct` (~11000 записей) +- Добавляет в ipset встроенные и пользовательские kill switch исключения - Сохраняет ipset в `/etc/ipset.conf` для восстановления после ребута - Добавляет маршруты через GATEWAY для всех .ru блоков и RFC1918 +- Обновляет UFW `before.rules`, добавляет прямые iptables-правила и отключает IPv6 при активном kill switch ### ks-off / ks-on @@ -130,8 +141,8 @@ sudo bash scripts/ks-on.sh ```bash ip route get 8.8.8.8 # -> dev amn0 (Google через VPN) -ip route get 77.88.8.8 # -> dev wlp1s0 (ya.ru напрямую) -ip route get 10.10.0.1 # -> dev wlp1s0 (*.loc напрямую) +ip route get 77.88.8.8 # -> dev (ya.ru напрямую) +ip route get 10.10.0.1 # -> dev (*.loc напрямую) bash tests/test_network.sh # полные тесты ``` @@ -139,16 +150,17 @@ bash tests/test_network.sh # полные тесты `scripts/ai-setup.sh` устанавливает и настраивает все AI CLI. -После запуска генерируются или обновляются в `~/.local/bin`: +После запуска генерируются или обновляются в выбранном `BIN_DIR`: `~/bin`, если он уже есть +в `PATH`, иначе `~/.local/bin`. - `ai-claude` - Claude Code (Anthropic API) - `ai-gpt` - нативный OpenAI Codex CLI - `ai-deepseek` - Claude Code через DeepSeek API - `ai-kimi` - Claude Code через официальный Kimi Code API (`api.kimi.com/coding`) -- `ai-openrouter` - Claude Code через OpenRouter (GPT-5.5, Claude и др.) +- `ai-openrouter` - Claude Code через OpenRouter (GPT-5.5, Grok, Qwen, MiniMax, Llama и др.) - `ai-gemini` - нативный Antigravity CLI `agy` - `ai-api-helpers.sh` - вспомогательные функции для лаунчеров -- `claude-gpt-effort-proxy.py` - прокси для маппинга effort-уровней (GPT backend) +- `claude-gpt-effort-proxy.py` - совместимый helper для старого GPT/claude-code-proxy backend Все генерируемые скрипты полностью перезаписываются при каждом запуске `scripts/ai-setup.sh`. @@ -166,7 +178,8 @@ bash tests/test_network.sh # полные тесты - Устанавливает Xray, генерирует конфиг, создаёт systemd сервис - Все лаунчеры оборачиваются в `proxychains4` -Если выбрать **n** - VLESS отключается, прокси и IPv6 сбрасываются в дефолт. +Если выбрать **n** - VLESS отключается, xray останавливается, системный/Firefox прокси +сбрасываются в direct. IPv6 включается обратно только если UFW kill switch не активен. ## Ключи и конфиги @@ -174,7 +187,7 @@ bash tests/test_network.sh # полные тесты - `~/.config/ai-setup/kimi_key` - Kimi API key (права 600) - `~/.config/ai-setup/openrouter_key` - OpenRouter API key (права 600) - `~/.config/ai-setup/global_rules.md` - глобальные правила агентов -- `~/.config/ai-setup/network_$(hostname).conf` - сохранённые GATEWAY/DEV для текущей машины +- `~/.config/ai-setup/network_.conf` - сохранённые сетевые профили (`GATEWAY`, `DEV`, `LOCAL_DNS`, `AMNEZIA_SERVER`, `KILL_SWITCH_EXCEPTIONS`) ## Права запуска агентов @@ -193,10 +206,12 @@ Surgical Changes, Goal-Driven Execution) плюс пользовательски ## Effort Mapping -`EFFORT_MAPPING.md` - таблица маппинга effort-уровней (`low`/`medium`/`high`/`xhigh`/`max`) -между провайдерами (Anthropic, GPT-5.5, DeepSeek V4, Kimi K2.6, Gemini 3.x). +`EFFORT_MAPPING.md` - таблица effort-уровней (`low`/`medium`/`high`/`xhigh`/`max`) +для Claude Code лаунчеров (`ai-claude`, `ai-deepseek`, `ai-kimi`, `ai-openrouter`). +Нативные `ai-gpt` и `ai-gemini` живут отдельно. -`claude-gpt-effort-proxy.py` маппит `xhigh` → `high` для GPT-бэкенда (нет нативного `xhigh` у GPT). +`claude-gpt-effort-proxy.py` маппит `xhigh` -> `high` для совместимости со старым +GPT/claude-code-proxy backend; текущие лаунчеры его напрямую не вызывают. ## Требования @@ -212,4 +227,5 @@ Surgical Changes, Goal-Driven Execution) плюс пользовательски bash tests/test_fixes.sh # структура ai-setup.sh и синтаксис bash bash test_isolated.sh # автоустановка ai-gpt и ai-kimi через mock curl bash tests/test_network.sh # маршрутизация (нужен активный ru-bypass) +# test_sigint.sh # ручной диагностический тест SIGINT ``` diff --git a/home-configs/network/README.md b/home-configs/network/README.md index 3e33dde..29c0553 100644 --- a/home-configs/network/README.md +++ b/home-configs/network/README.md @@ -16,7 +16,9 @@ | `ks-off.sh` | Временно отключить UFW kill switch (доступ без VPN) | | `ks-on.sh` | Восстановить UFW kill switch | -Все скрипты запускаются явно от root. Никакой автоустановки нет. +Сетевые скрипты запускаются от root. Обычно их дергает `setup.sh` через `sudo` и сохраняет +профиль в `~/.config/ai-setup/network_.conf`; сам `ru-bypass.sh` дополнительно +пишет root-конфиг `/etc/ru-bypass.conf` для systemd и NetworkManager dispatcher. --- @@ -29,7 +31,7 @@ Amnezia поднимает интерфейс `amn0` и захватывает - `128.0.0.0/1 dev amn0` `ru-bypass.sh` добавляет тысячи **более специфичных** маршрутов для .ru IP-блоков через -локальный роутер (например `95.173.0.0/16 via 192.168.1.1 dev wlp1s0`). Ядро Linux +локальный роутер (например `95.173.0.0/16 via dev `). Ядро Linux выбирает самый специфичный маршрут - .ru уходит напрямую, всё остальное - в amn0. ### UFW kill switch @@ -37,13 +39,13 @@ Amnezia поднимает интерфейс `amn0` и захватывает ``` default deny outgoing — запрещено всё по умолчанию allow out on amn0 — через Amnezia можно всё -before.rules: ipset ru-direct — для .ru IP разрешён прямой выход на wlp1s0 +before.rules: ipset ru-direct — для .ru IP разрешён прямой выход на DEV before.rules: 10/8, 172.16/12, - 192.168/16 — RFC1918 (*.loc) разрешён прямой выход на wlp1s0 + 192.168/16 — RFC1918 (*.loc) разрешён прямой выход на DEV ``` Если Amnezia падает: `amn0` исчезает, не-.ru трафик блокируется UFW. Маршруты .ru -через wlp1s0 и правило UFW для ipset остаются - .ru работает. +через `DEV` и правило UFW для ipset остаются - .ru работает. ### Что делает скрипт при запуске @@ -52,7 +54,12 @@ before.rules: 10/8, 172.16/12, 3. Сохраняет ipset в `/etc/ipset.conf` 4. Добавляет маршруты через локальный роутер для всех .ru блоков 5. Добавляет маршруты для RFC1918 диапазонов (`10/8`, `172.16/12`, `192.168/16`) - нужно для `*.loc` -6. При первом запуске: добавляет правила в `/etc/ufw/before.rules` и устанавливает systemd сервисы +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` +9. Если задан `LOCAL_DNS`, настраивает `resolvectl` для `~loc` на интерфейсе `DEV` +10. Обновляет `/etc/ufw/before.rules`, прямые iptables-правила и отключает IPv6 при активном kill switch +11. При первом запуске: устанавливает systemd service/timer и NetworkManager dispatcher ### Сервисы (устанавливаются однократно) @@ -60,6 +67,7 @@ before.rules: 10/8, 172.16/12, Нужен потому что 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 переподключилась). @@ -67,21 +75,39 @@ before.rules: 10/8, 172.16/12, ## Запуск -### Первый запуск / обновление +### Первый запуск / обновление через меню + +```bash +bash setup.sh +# выбери пункт 2) Сеть: ru-bypass + kill switch +``` + +Меню предложит значения из `ip route show default`, даст выбрать профиль (`home`, `office`, +`$(hostname)` и т.д.) и сохранит: + +```bash +GATEWAY=... +DEV=... +LOCAL_DNS=... +AMNEZIA_SERVER=... +KILL_SWITCH_EXCEPTIONS=... +``` + +### Прямой запуск скрипта ```bash sudo bash scripts/ru-bypass.sh ``` -Скрипт сам установит сервисы, добавит правило UFW и настроит NM dispatcher. +Если env-переменные не переданы, скрипт сначала читает `/etc/ru-bypass.conf`, а потом +использует legacy-дефолты `GATEWAY=192.168.1.1`, `DEV=wlp1s0`. ### Параметры для другой сети -По умолчанию используется домашняя сеть (`GATEWAY=192.168.1.1`, `DEV=wlp1s0`). -Для другой машины передай параметры через env: +Для другой сети передай параметры через env: ```bash -sudo GATEWAY=10.0.0.1 DEV=enp3s0 bash ru-bypass.sh +sudo GATEWAY=10.0.0.1 DEV=enp3s0 LOCAL_DNS=10.0.0.53 bash scripts/ru-bypass.sh ``` Чтобы узнать нужные значения: @@ -94,12 +120,13 @@ ip route show default ### Офисная машина -Если в офисе другой gateway и другой сетевой интерфейс - просто передай их через env. -Amnezia там тоже поднимает `amn0`, так что остальное работает одинаково. +Если в офисе другой gateway и другой сетевой интерфейс - создай отдельный профиль через +пункт 2 в `setup.sh` или передай значения через env. Amnezia там тоже поднимает `amn0`, +так что остальное работает одинаково. Пример (офис с проводным интерфейсом): ```bash -sudo GATEWAY=192.168.0.1 DEV=eth0 bash ru-bypass.sh +sudo GATEWAY=192.168.0.1 DEV=eth0 LOCAL_DNS=192.168.0.53 bash scripts/ru-bypass.sh ``` --- @@ -118,6 +145,9 @@ 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 @@ -150,7 +180,7 @@ sudo bash scripts/ks-on.sh ```bash # Эти команды без sudo: ip route get 8.8.8.8 # -> dev amn0 (Google через VPN) -ip route get 95.173.136.1 # -> dev wlp1s0 (ozon.ru напрямую) +ip route get 95.173.136.1 # -> dev (ozon.ru напрямую) ip route get $(dig +short api.anthropic.com A | head -1) # -> dev amn0 # Полные тесты: diff --git a/scripts/ai-setup.sh b/scripts/ai-setup.sh index d009ec6..71fd2b7 100755 --- a/scripts/ai-setup.sh +++ b/scripts/ai-setup.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash # ============================================================ -# AI Setup - Claude / GPT-5.5 / DeepSeek / Kimi / Gemini +# AI Setup - Claude / GPT-5.5 / Grok / Qwen / DeepSeek / Kimi / MiniMax / Llama / Gemini # Запуск: bash ai-setup.sh # ============================================================ @@ -1663,7 +1663,7 @@ echo " На базе Claude Code:" echo -e " ${CYAN}ai-claude${NC} - Оригинальный Claude Code (Anthropic)" echo -e " ${CYAN}ai-deepseek${NC} - DeepSeek (через Claude Code, API ключ сохраняется)" echo -e " ${CYAN}ai-kimi${NC} - Kimi K2.7 Code (через Claude Code, API ключ сохраняется)" -echo -e " ${CYAN}ai-openrouter${NC} - OpenRouter (через Claude Code: GPT-5.5, Opus 4.8, Sonnet 4.6)" +echo -e " ${CYAN}ai-openrouter${NC} - OpenRouter (через Claude Code: GPT-5.5, Grok, Qwen, MiniMax, Llama и др.)" echo "" echo " Нативные CLI:" echo -e " ${CYAN}ai-gpt${NC} - OpenAI Codex (нативный CLI, автоустановка)" diff --git a/scripts/ru-bypass.sh b/scripts/ru-bypass.sh index fcbbbfa..a0b3222 100644 --- a/scripts/ru-bypass.sh +++ b/scripts/ru-bypass.sh @@ -335,8 +335,8 @@ sed -i "/-A ufw-before-output -d 172\.16\.0\.0\/12 -o/d" "$UFW_BEFORE" sed -i "/-A ufw-before-output -d 192\.168\.0\.0\/16 -o/d" "$UFW_BEFORE" # Добавляем правила заново с актуальным DEV -sed -i "0,/^COMMIT/{s/^COMMIT/# $UFW_IPSET_MARKER\n-A ufw-before-output -m set --match-set $SETNAME dst -o $DEV -j ACCEPT\nCOMMIT/}" "$UFW_BEFORE" -sed -i "0,/^COMMIT/{s/^COMMIT/# $UFW_LOCAL_MARKER\n-A ufw-before-output -d 10.0.0.0\/8 -o $DEV -j ACCEPT\n-A ufw-before-output -d 172.16.0.0\/12 -o $DEV -j ACCEPT\n-A ufw-before-output -d 192.168.0.0\/16 -o $DEV -j ACCEPT\nCOMMIT/}" "$UFW_BEFORE" +sed -i "/^\\*filter/,/^COMMIT/{s/^COMMIT/# $UFW_IPSET_MARKER\\n-A ufw-before-output -m set --match-set $SETNAME dst -o $DEV -j ACCEPT\\nCOMMIT/}" "$UFW_BEFORE" +sed -i "/^\\*filter/,/^COMMIT/{s/^COMMIT/# $UFW_LOCAL_MARKER\\n-A ufw-before-output -d 10.0.0.0\\/8 -o $DEV -j ACCEPT\\n-A ufw-before-output -d 172.16.0.0\\/12 -o $DEV -j ACCEPT\\n-A ufw-before-output -d 192.168.0.0\\/16 -o $DEV -j ACCEPT\\nCOMMIT/}" "$UFW_BEFORE" echo "UFW before.rules обновлён (ipset + локальные сети, DEV=$DEV)." diff --git a/setup.sh b/setup.sh index d20088c..4f4d1e7 100755 --- a/setup.sh +++ b/setup.sh @@ -113,7 +113,7 @@ case "$choice" in read -rp "DEV (интерфейс) [${auto_dev}]: " dev read -rp "LOCAL_DNS (DNS для *.loc) [${saved_local_dns:-пусто}]: " local_dns read -rp "AMNEZIA_SERVER (IP/домен сервера Amnezia) [${saved_amn_srv:-пусто}]: " amn_srv - read -e -rp "KS_EXCEPTIONS (исключения kill switch: IP/домены через пробел): " -i "${saved_ks_exc}" ks_exc + read -e -rp "KILL_SWITCH_EXCEPTIONS (исключения kill switch: IP/домены через пробел): " -i "${saved_ks_exc}" ks_exc gw="${gw:-$auto_gw}" dev="${dev:-$auto_dev}" [ "$local_dns" = "пусто" ] && local_dns=""