Files
knowledge-base/projects/niikn/govru-quickfix-playbook.md
dttb 5949452bcf niikn: КОРНЕВОЙ фикс — убрал russia_outside из podkop (ломал РФ-сайты)
russia_outside = РФ-сайты для доступа из-за границы; для офиса в РФ он фейкапил
gosuslugi/ozon/ЕИС/nspd и гнал в финский выход → гео-блок. Убран — РФ-сайты резолвятся
реально (проверено sing-box 127.0.0.42), overrides больше не нужны, цикл слётов разорван.
Инсайт Олега про inside/outside. Watchdog niikn-podkop-watchdog на pve-niikn сторожит откат.
Заодно: исправлены перепутанные chat_id (Олег=1292155421, Максим=437242345).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-29 13:24:04 +03:00

209 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
date: 2026-05-04
type: playbook
tags: [niikn, network, gov-ru, troubleshooting, playbook]
---
# Playbook: gov-сайты не открываются из НИИКН
Для оператора (Claude / Олег) — пошаговый алгоритм когда сотрудник НИИКН говорит «<domain>.gov.ru / .ru не работает». Все компоненты проверены 2026-05-04.
> ## ✅ КОРНЕВОЙ ФИКС 2026-05-29 — читать ПЕРВЫМ
> Первопричина всех этих жалоб устранена: **из podkop убран список `russia_outside`** (он гнал РФ-сайты gosuslugi/ozon/ЕИС/nspd в финский выход → гео-блок). Теперь РФ-сайты резолвятся реально и идут напрямую / через LionART-маршруты. **dnsmasq-overrides и весь алгоритм 2А ниже стали не нужны** (оставлены как backup) — overrides больше не «слетают-и-ломают», т.к. сайты и так не фейкапятся.
> - НЕ возвращать `russia_outside` в podkop! Сторож `niikn-podkop-watchdog.sh` (pve-niikn, cron */15) снимет его + алерт Олегу через Антошку.
> - Если новая жалоба на РФ-сайт: проверь `ssh root@192.168.1.50 'nslookup ДОМЕН 127.0.0.42'` — если `198.18.x`, значит снова попал в какой-то podkop-лист; убрать лист, а не лепить override.
> - Подробно: [decisions/2026-05-29-niikn-diadoc-ozon-fix.md](../../decisions/2026-05-29-niikn-diadoc-ozon-fix.md)
## Архитектура bypass
```
Клиент НИИКН (192.168.1.x, Win+Yandex Browser)
└─ DNS → 192.168.1.50 (OpenWrt dnsmasq → podkop FakeIP по умолчанию)
└─ для исключённых доменов (sev/zakupki/nspd/...) → форвард в 77.88.8.8 / 8.8.8.8 → реальный IP
└─ маршрут к реальному IP:
├─ обычный → MikroTik (192.168.1.1) → MTS WAN 85.235.181.190
└─ для bypass-сетей (2.63.246/24, 95.167.245/24, 87.250.251/24) → 192.168.1.201 (pve-niikn) → wt0 (NetBird) → pve-LionART → WAN LionART 195.26.30.163
```
**Ключевой узел** — pve-LionART (`100.70.128.49` в NetBird, peer ID `cuisnd3l0ubs73bsbbl0`) — чистый российский WAN.
## Шаг 1. Триаж — какой класс проблемы
С pve-LionART прогнать сайт:
```bash
sshpass -p '1qaz!QAZ' ssh -o StrictHostKeyChecking=no root@100.70.128.49 "
getent hosts SITE
curl -sk -A 'Mozilla/5.0' -o /dev/null -w 'HTTP:%{http_code}\n' --max-time 10 https://SITE/
echo | openssl s_client -servername SITE -connect SITE:443 -connect_timeout 6 2>/dev/null | openssl x509 -noout -issuer 2>/dev/null
"
```
И с НИИКН (через OpenWrt → MTS):
```bash
sshpass -p '1qaz!QAZ' ssh root@100.70.120.229 "sshpass -p '1qaz!QAZ' ssh root@192.168.1.50 '
nslookup SITE 127.0.0.1 | tail -3
curl -sk -A Mozilla -o /dev/null -w \"HTTP:%{http_code}\\n\" --max-time 10 https://SITE/
'"
```
Соотношение результатов → класс:
| LionART | НИИКН curl | DNS на НИИКН | Класс | Решение |
|---------|-----------|--------------|-------|---------|
| 200 | 200 | реальный IP | Норма | (вообще не должно жаловаться) |
| 200 | 4xx/000 | `198.18.x.x` (FakeIP) | **A. FakeIP подмена** (sev, culture, gosuslugi) | Шаг 2А |
| 200 | 000/forbidden | реальный IP | **B. WAF-блок MTS-IP** (nspd) | Шаг 2Б |
| 4xx unknown CA | то же | любое | **C. ru-trust cert на клиенте** (nspd с Jan 2026) | Шаг 2В |
| handshake failure / TLS alert | то же | любое | **D. ГОСТ-mTLS / клиент-сертификат** (lk.zakupki) | Шаг 2Г |
| 403 без UA, 200 с UA | (то же) | любое | **E. Anti-bot WAF** (uookn.sev) | A или Б — UA проблема не у нас |
## Шаг 2А. FakeIP подмена (только DNS-фикс)
Симптом: `nslookup SITE 127.0.0.1``198.18.x.x`. **Каждый раз когда я вижу FakeIP для gov-сайта — этот override либо потерян, либо никогда не был**.
```bash
ssh root@100.70.120.229
ssh root@192.168.1.50 # 1qaz!QAZ оба
DOMAIN=sev.gov.ru # ROOT-домен достаточно — покрывает все поддомены
uci -q del_list dhcp.@dnsmasq[0].server="/$DOMAIN/77.88.8.8"
uci -q del_list dhcp.@dnsmasq[0].server="/$DOMAIN/8.8.8.8"
uci add_list dhcp.@dnsmasq[0].server="/$DOMAIN/77.88.8.8"
uci add_list dhcp.@dnsmasq[0].server="/$DOMAIN/8.8.8.8"
uci commit dhcp
/etc/init.d/dnsmasq restart
rm -f /tmp/sing-box/cache.db
/etc/init.d/sing-box restart
```
После этого клиенту: `ipconfig /flushdns` (или просто перезапустить браузер).
## Шаг 2Б. WAF-блок MTS-IP (DNS + NetBird route + MikroTik route)
Симптом: с LionART 200, c НИИКН (real IP) → 000/блок-страница «Forbidden Rule …». Решение — пустить только этот CIDR через NetBird → pve-LionART.
```bash
# 1. CIDR подсети сайта (через RIPE)
curl -s "https://stat.ripe.net/data/network-info/data.json?resource=$IP" | python3 -c "import json,sys; print(json.load(sys.stdin)['data']['prefix'])"
# 2. NetBird route через API (token в credentials.md → "Netbird (netbird.io cloud)")
NB="nbp_YTEmAVpS0hLhnTeJ09q3wYaC0AAXjN21NPvM"
curl -s -X POST -H "Authorization: Token $NB" -H "Content-Type: application/json" \
https://api.netbird.io/api/routes \
-d '{"network":"<CIDR>","network_id":"<short-name>","description":"<описание>","peer":"cuisnd3l0ubs73bsbbl0","masquerade":true,"metric":9999,"groups":["cqgcidrl0ubs73f2hgf0"],"enabled":true,"network_type":"IPv4"}'
# 3. MikroTik route (на 192.168.1.1)
sshpass -p 'OL260380eg' ssh -o KexAlgorithms=+diffie-hellman-group14-sha1 \
-o HostKeyAlgorithms=+ssh-rsa AI@192.168.1.1 \
'/ip/route/add dst-address=<CIDR> gateway=192.168.1.201 comment="<short-name> via NetBird->LionART"'
# 4. MASQUERADE и MSS clamp на pve-niikn — уже стоят в systemd unit
# iptables-nspd-restore.service. Если новый интерфейс — обновить.
# 5. DNS override на OpenWrt (см. шаг 2А) чтобы podkop не подменял на FakeIP
```
**Известные группы / peers (NetBird):**
- group `cqgcidrl0ubs73f2hgf0` = «All» (default)
- peer `cuisnd3l0ubs73bsbbl0` = pve-lionart (наш чистый exit)
## Шаг 2В. ru-trust cert на клиенте (для Минцифра-сертификатов)
Симптом: `openssl x509 -issuer` показывает `Russian Trusted Sub CA` или `Russian Trusted Root CA`. Chrome/Edge ругается «ERR_CERT_AUTHORITY_INVALID». Yandex Browser работает нативно.
Быстро для одного ПК — PowerShell от админа через RustDesk:
```powershell
$tmp=$env:TEMP
iwr https://gu-st.ru/content/Other/doc/russian_trusted_root_ca.cer -OutFile $tmp\r.cer
iwr https://gu-st.ru/content/Other/doc/russian_trusted_sub_ca.cer -OutFile $tmp\s.cer
Import-Certificate -FilePath $tmp\r.cer -CertStoreLocation Cert:\LocalMachine\Root
Import-Certificate -FilePath $tmp\s.cer -CertStoreLocation Cert:\LocalMachine\CA
```
Если `gu-st.ru` блочат — поменять на оригинальный путь `https://www.gosuslugi.ru/crt`. Если и тот не открывается — embed cert base64 прямо в скрипт.
Альтернатива без CSP-вмешательства: открывать gov-сайты в **Yandex Browser** (он встроенно доверяет Минцифре).
## Шаг 2Г. ГОСТ-mTLS / клиент-сертификат
Симптом: TLS handshake failure / SSL alert от сервера независимо от выходного IP. Пример — `lk.zakupki.gov.ru`, многие ЛК Госуслуг для юр.лиц.
**Сетью не решается.** Юзеру нужен:
- КриптоПро CSP установлен
- Сертификат ЭЦП на токене (Rutoken / JaCarta) или в реестре
- Плагин для браузера (CryptoPro Browser Plugin)
Помочь могу только подсказать — установка обычно делается централизованно.
## Шаг 2Д. Anti-bot WAF
Симптом: `curl -sk` → 403, но `curl -sk -A 'Mozilla/5.0'` → 200. Пример — `uookn.sev.gov.ru` на Bitrix BotProtect.
**Действий не нужно** — все нормальные браузеры отправляют User-Agent. Если жалобы при таком сценарии — значит у юзера ещё какая-то проблема (DNS-кэш / неправильный браузер / настройки прокси). Прогнать шаг 2А на всякий случай.
## Текущий реестр overrides + routes
### OpenWrt 192.168.1.50 — dnsmasq.server (форсируем реальный DNS вместо FakeIP)
Проверка списка: `uci show dhcp | grep server=`
| Домен | Когда добавлен | Класс |
|-------|--------------|-------|
| `nspd.gov.ru` | 2026-04-20 (восст. 2026-05-04) | A+B (DNS + NetBird route) |
| `sev.gov.ru` | 2026-04-28 (восст. 2026-05-04) | A |
| `zakupki.gov.ru` | 2026-04-? (восст. 2026-05-04) | A+B |
| `gosuslugi.ru` | 2026-05-04 | A |
| `rosreestr.gov.ru` | 2026-05-04 | A (но MTS-блок остаётся, нужно расширять до B при обращении) |
| `culture.gov.ru` | 2026-04-30 (восст. 2026-05-04) | A |
| `economy.gov.ru` | 2026-05-04 | A (fgistp.economy.gov.ru — Минэк ФГИС ТП) |
| `ozon.ru` (вся зона `*.ozon.ru`) | 2026-05-29 | `russia_outside` FakeIP'ил → выход в Финляндию → Ozon гео-блокирует зарубежные IP («Доступ ограничен»). Override → прямой MTS (РФ-IP). curl всё равно 403 (анти-бот по fingerprint, одинаков с MTS и LionART) — **браузер проходит JS-challenge**. |
⚠️ **Эти overrides периодически теряются** при работе с podkop / реконфигах OpenWrt. Если жалоба — проверять uci show dhcp в первую очередь.
> **Аудит + восстановление 2026-05-29:** при разборе жалобы (diadoc/ozon/ЕИС) в живом `uci show dhcp` оставались только `nspd` + `ozon` — остальные gov-overrides снова слетели, из-за чего `zakupki.gov.ru` (ЕИС), `gosuslugi`, `sev`, `rosreestr`, `culture`, `economy` уходили в FakeIP→Финляндию и не открывались. **Восстановлены все** (`/$D/77.88.8.8` + `/8.8.8.8`), `dnsmasq` рестарт. Проверка с офисного ПК (maul-pc) и pve-niikn: `zakupki.gov.ru`→**200** (через LionART-route `95.167.245.0/24`), `gosuslugi`/`sev`/`rosreestr`/`culture`/`economy`→**200** (через MTS напрямую). Прочие РФ-маркетплейсы (WB/СберМаркет/Я.Маркет/М.Видео/Авито) — direct, ок; `russia_outside` ловит узко (ozon, gosuslugi, zakupki).
>
> ⚠️ `lk.zakupki.gov.ru` (личный кабинет ЕИС) — **ГОСТ-TLS only**: TLS alert 40 (handshake_failure) с обоих путей (MTS и LionART), CIDR `94.25.0.0/17` Ростелеком. **Маршрутом НЕ лечится** (см. Шаг 2Г). Открывать в **Yandex Browser** (нативный ГОСТ) + КриптоПро CSP/ЭЦП для входа.
>
> ✅ **podkop/туннель проверены 2026-05-29:** заблокированные работают (youtube/instagram→200, whatsapp соединяется с maul-pc), tproxy-счётчик растёт (8.3M пакетов), awg0 несёт трафик. Туннель Финляндия жив.
### NetBird Routes (через API) → pve-LionART
| Network | Network ID | CIDR | Назначение |
|---------|-----------|------|-----------|
| `nspd-bypass` | `d7ji3ajl0ubs73a92s40` | `2.63.246.0/24` | nspd.gov.ru |
| `zakupki-bypass` | `d7s61o2fadhs73bjk520` | `95.167.245.0/24` | zakupki.gov.ru main |
| `telemost-bypass` | `d7s61oafadhs73bjk750` | `87.250.251.0/24` | telemost.yandex.ru |
| `diadoc-bypass` | `d8cljnbl0ubs7386r1ug` | `46.17.203.0/24` | diadoc.ru / Контур (AS49675) — MTS WAN чёрная дыра (TCP timeout 12с); LionART достаёт. **2026-05-29** |
### MikroTik 192.168.1.1 — static routes
```
/ip/route/print where comment~"NetBird"
```
Должны быть routes `2.63.246.0/24`, `95.167.245.0/24`, `87.250.251.0/24`, `46.17.203.0/24``192.168.1.201`.
### pve-niikn 192.168.1.201 — iptables (persist через systemd)
`/etc/systemd/system/iptables-nspd-restore.service`:
- POSTROUTING: `-s 192.168.1.0/24 -o wt0 -j MASQUERADE`
- mangle FORWARD MSS clamp на wt0 (важно — MTU 1280)
## Что делать когда юзер говорит "не открывается"
**90% случаев:** просто запусти шаг 2А с восстановлением dnsmasq overrides на OpenWrt + сказать клиенту перезапустить браузер. Это решает большинство «вчера работало, сегодня нет».
**Если шаг 2А не помог:** триаж по таблице → 2Б/2В/2Г.
**Если ru-trust требуется массово:** готовить .ps1 для раскатки через RustDesk на все ПК НИИКН.
## Связанные
- [decisions/2026-05-04-niikn-nspd-via-netbird-lionart.md](../../decisions/2026-05-04-niikn-nspd-via-netbird-lionart.md) — финальная схема NetBird→LionART
- [decisions/2026-04-28-niikn-uookn-sev-gov-fakeip-fix.md](../../decisions/2026-04-28-niikn-uookn-sev-gov-fakeip-fix.md) — sev.gov.ru
- [decisions/2026-04-30-niikn-culture-gov-fakeip-fix.md](../../decisions/2026-04-30-niikn-culture-gov-fakeip-fix.md) — culture.gov.ru
- [openwrt-bypass.md](openwrt-bypass.md) — общая схема OpenWrt + AmneziaWG + podkop
- [mikrotik.md](mikrotik.md) — MikroTik НИИКН конфиг