Files
knowledge-base/projects/niikn/govru-quickfix-playbook.md

195 lines
11 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.
## Архитектура 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 — Минэк ФГИС ТП) |
⚠️ **Эти overrides периодически теряются** при работе с podkop / реконфигах OpenWrt. Если жалоба — проверять uci show dhcp в первую очередь.
### 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 |
### 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``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 НИИКН конфиг