Compare commits
4 Commits
93ade1c65b
...
a4fb06527f
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a4fb06527f | ||
|
|
9fe499fc6e | ||
|
|
8e13ae2e17 | ||
|
|
e896a24fae |
136
decisions/2026-05-04-niikn-nspd-via-netbird-lionart.md
Normal file
136
decisions/2026-05-04-niikn-nspd-via-netbird-lionart.md
Normal file
@@ -0,0 +1,136 @@
|
||||
---
|
||||
date: 2026-05-04
|
||||
type: decision
|
||||
status: рабочее
|
||||
tags: [decision, niikn, mmfb, network, netbird, nspd, fix]
|
||||
---
|
||||
|
||||
# 2026-05-04: NSPD из НИИКН — финальная схема через NetBird → pve-LionART
|
||||
|
||||
## Контекст
|
||||
|
||||
После отката WG-туннеля 2026-04-20 (общее замедление трафика) NSPD-bypass был на стороне NetBird Networks. Сегодня клиенты НИИКН пожаловались "не работает даже через NetBird и другие сайты тоже".
|
||||
|
||||
## Что нашёл
|
||||
|
||||
1. **Сетевая часть исправна** — netbird route `nspd-bypass` (2.63.246.0/24) активен, трейс `pve-niikn → 100.70.128.49 (pve-lionart) → 10.253.1.1 (MikroTik LionART)` работает. С `pve-niikn` `curl -k https://nspd.gov.ru/` отдаёт `HTTP:200`.
|
||||
2. **Цепочка для клиентов разорвана в трёх местах:**
|
||||
- OpenWrt 192.168.1.50: пропал `dnsmasq override` для `nspd.gov.ru` → podkop ловит в FakeIP `198.18.x.x` → AWG → Финляндия → блок (НСПД режет foreign IP).
|
||||
- MikroTik 192.168.1.1: нет static route `2.63.246.0/24 → 192.168.1.201` (pve-niikn) → пакеты идут в default WAN → MTS WAF блок.
|
||||
- pve-niikn: нет SNAT/MASQUERADE для `192.168.1.0/24 → wt0` → пакеты приходили на pve-lionart с приватным src → asymmetric routing.
|
||||
3. **TLS-сертификат** NSPD выпущен `Russian Trusted Sub CA` (Минцифра, valid from 2026-01-23). Chrome/Edge без ru-trust → `ERR_CERT_AUTHORITY_INVALID`. Yandex Browser работает нативно. Попутный артефакт: `curl` из OpenWrt 24.10 на mbedTLS не парсит ASN.1 этого cert (`X509 - The name tag or value is invalid`) — но это не проблема пользователей.
|
||||
|
||||
## Применённый фикс
|
||||
|
||||
### 1. OpenWrt (192.168.1.50) — DNS-override
|
||||
|
||||
```bash
|
||||
ssh root@192.168.1.50 # 1qaz!QAZ
|
||||
uci add_list dhcp.@dnsmasq[0].server='/nspd.gov.ru/77.88.8.8'
|
||||
uci add_list dhcp.@dnsmasq[0].server='/nspd.gov.ru/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
|
||||
```
|
||||
|
||||
Проверка: `nslookup nspd.gov.ru 127.0.0.1` → `2.63.246.x` (НЕ 198.18.x.x).
|
||||
|
||||
### 2. MikroTik НИИКН (192.168.1.1) — static route
|
||||
|
||||
```
|
||||
/ip/route/add dst-address=2.63.246.0/24 gateway=192.168.1.201 \
|
||||
comment="NSPD via NetBird->LionART"
|
||||
```
|
||||
|
||||
### 3. pve-niikn (192.168.1.201 / 100.70.120.229) — SNAT на wt0
|
||||
|
||||
```bash
|
||||
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o wt0 \
|
||||
-m comment --comment 'nspd-bypass-via-lionart' -j MASQUERADE
|
||||
```
|
||||
|
||||
Persist через systemd unit `/etc/systemd/system/iptables-nspd-restore.service` (idempotent: `iptables -C ... || iptables -A ...`).
|
||||
|
||||
## Подтверждение работы
|
||||
|
||||
```
|
||||
# tcpdump на vmbr0 при curl с OpenWrt → nspd.gov.ru:443
|
||||
192.168.1.50 > 2.63.246.73:443 Flags [S] ← клиент
|
||||
2.63.246.73:443 > 192.168.1.50 Flags [S.] ← НСПД отвечает!
|
||||
192.168.1.50 > 2.63.246.73:443 Flags [P.] len 276 ← TLS ClientHello
|
||||
2.63.246.73:443 > 192.168.1.50 Flags [.] len 1228 ← TLS ServerHello+Cert
|
||||
... full data flow ...
|
||||
```
|
||||
|
||||
## Что нужно от пользователей
|
||||
|
||||
- **Yandex Browser** — открывают `nspd.gov.ru` сразу (встроенно доверяет Минцифре).
|
||||
- **Chrome/Edge/Firefox** — установить ru-trust сертификаты с https://www.gosuslugi.ru/crt:
|
||||
- `russian_trusted_root_ca.cer` → Trusted Root Certification Authorities
|
||||
- `russian_trusted_sub_ca.cer` → Intermediate Certification Authorities
|
||||
|
||||
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
|
||||
```
|
||||
|
||||
## Распространение на другие гос-сайты
|
||||
|
||||
Тот же ru-trust cert у `culture.gov.ru`, `gosuslugi.ru`, `rosreestr.gov.ru` (последний ещё блокирует MTS-IP отдельно — нужен такой же bypass через LionART).
|
||||
|
||||
### 2026-05-04 — добавлены zakupki и telemost
|
||||
|
||||
Аналогичная схема (без TLS-cert проблем — `zakupki.gov.ru` имеет GlobalSign cert, `telemost.yandex.ru` тоже стандартный).
|
||||
|
||||
NetBird Routes API (`POST /api/routes`):
|
||||
- `zakupki-bypass` → `95.167.245.0/24` (id `d7s61o2fadhs73bjk520`) → peer `cuisnd3l0ubs73bsbbl0` (pve-lionart)
|
||||
- `telemost-bypass` → `87.250.251.0/24` (id `d7s61oafadhs73bjk750`) → тот же peer
|
||||
|
||||
MikroTik НИИКН:
|
||||
```
|
||||
/ip/route/add dst-address=95.167.245.0/24 gateway=192.168.1.201 comment="zakupki via NetBird->LionART"
|
||||
/ip/route/add dst-address=87.250.251.0/24 gateway=192.168.1.201 comment="telemost via NetBird->LionART"
|
||||
```
|
||||
|
||||
pve-niikn — добавлен **MSS clamping** для wt0 (NetBird MTU=1280, br-lan/vmbr0=1500 → большие TCP-ответы дропались):
|
||||
```bash
|
||||
iptables -t mangle -A FORWARD -o wt0 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
|
||||
iptables -t mangle -A FORWARD -i wt0 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
|
||||
```
|
||||
|
||||
Не забыть `iptables-save > /etc/iptables/rules.v4` для persist (или дополнить `iptables-nspd-restore.service`).
|
||||
|
||||
Известный артефакт: `lk.zakupki.gov.ru` (`94.25.27.250`) даёт TLS handshake failure даже с LionART — у него mTLS / ГОСТ-крипто-провайдер требуется. Решается локально на клиенте (КриптоПро/JaCarta), не сетевыми средствами.
|
||||
|
||||
## Откат
|
||||
|
||||
```bash
|
||||
# pve-niikn
|
||||
systemctl disable --now iptables-nspd-restore.service
|
||||
rm /etc/systemd/system/iptables-nspd-restore.service
|
||||
iptables -t nat -D POSTROUTING -s 192.168.1.0/24 -o wt0 \
|
||||
-m comment --comment 'nspd-bypass-via-lionart' -j MASQUERADE
|
||||
|
||||
# MikroTik НИИКН
|
||||
/ip/route/remove [find comment="NSPD via NetBird->LionART"]
|
||||
|
||||
# OpenWrt
|
||||
uci -q del_list dhcp.@dnsmasq[0].server='/nspd.gov.ru/77.88.8.8'
|
||||
uci -q del_list dhcp.@dnsmasq[0].server='/nspd.gov.ru/8.8.8.8'
|
||||
uci commit dhcp
|
||||
/etc/init.d/dnsmasq restart
|
||||
```
|
||||
|
||||
## Связанные
|
||||
|
||||
- [decisions/2026-04-20-niikn-nspd-bypass-via-lionart.md](2026-04-20-niikn-nspd-bypass-via-lionart.md) — предыдущая попытка через WG-туннель MikroTik↔MikroTik, откачено
|
||||
- [projects/niikn/openwrt-bypass.md](../projects/niikn/openwrt-bypass.md) — раздел "Исключение доменов из проксирования"
|
||||
- [decisions/2026-04-28-niikn-uookn-sev-gov-fakeip-fix.md](2026-04-28-niikn-uookn-sev-gov-fakeip-fix.md) — другие gov-сайты
|
||||
|
||||
## Теги
|
||||
`#niikn` `#mmfb` `#lionart` `#netbird` `#nspd` `#mikrotik` `#openwrt` `#fix`
|
||||
193
projects/niikn/govru-quickfix-playbook.md
Normal file
193
projects/niikn/govru-quickfix-playbook.md
Normal file
@@ -0,0 +1,193 @@
|
||||
---
|
||||
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 |
|
||||
|
||||
⚠️ **Эти 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 НИИКН конфиг
|
||||
@@ -1,6 +1,7 @@
|
||||
# netbird-claude-install.ps1
|
||||
# Установка Netbird на Windows + регистрация в tenant netbird.io (группа Claude-Diag)
|
||||
# + включение RDP и WinRM для удалённой диагностики через Netbird-интерфейс.
|
||||
# + создание пользователя claude/Kl@udeD1ag!2026
|
||||
# + OpenSSH Server, RDP, WinRM для удалённой диагностики через Netbird.
|
||||
#
|
||||
# Запуск: PowerShell от администратора
|
||||
# iwr -useb https://git.dttb.ru/oleg/knowledge-base/raw/branch/main/snippets/netbird-claude-install.ps1 | iex
|
||||
@@ -9,7 +10,7 @@
|
||||
#
|
||||
# Идемпотентно: можно запускать повторно.
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
$ErrorActionPreference = "Continue" # не падаем на одной ошибке — нужен максимум сделанного
|
||||
|
||||
# ===== TLS 1.2+ (PowerShell 5.1 на 2012R2/2016 по умолчанию TLS 1.0) =====
|
||||
try {
|
||||
@@ -22,6 +23,8 @@ try {
|
||||
$SETUP_KEY = "83301E74-6F86-4CBD-AF77-0C65730103CA" # Claude-Diag, истекает 2026-05-21
|
||||
$NETBIRD_CIDR = "100.70.0.0/16" # адресное пространство tenant'а
|
||||
$NETBIRD_EXE = "C:\Program Files\Netbird\netbird.exe"
|
||||
$CLAUDE_USER = "claude"
|
||||
$CLAUDE_PASS = "Kl@udeD1ag!2026"
|
||||
|
||||
# ===== 1. Проверка прав =====
|
||||
$isAdmin = ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
|
||||
@@ -34,46 +37,96 @@ Write-Host "=== Netbird Claude-Diag setup ===" -ForegroundColor Cyan
|
||||
|
||||
# ===== 2. Установка Netbird =====
|
||||
if (-not (Test-Path $NETBIRD_EXE)) {
|
||||
Write-Host "[1/5] Скачиваю Netbird MSI..."
|
||||
Write-Host "[1/7] Скачиваю Netbird MSI..."
|
||||
$msi = "$env:TEMP\netbird.msi"
|
||||
Invoke-WebRequest -UseBasicParsing -Uri "https://pkgs.netbird.io/windows/x64" -OutFile $msi
|
||||
Write-Host "[2/5] Устанавливаю (silent)..."
|
||||
Write-Host "[2/7] Устанавливаю (silent)..."
|
||||
Start-Process msiexec.exe -ArgumentList "/i `"$msi`" /qn" -Wait
|
||||
Start-Sleep 5
|
||||
} else {
|
||||
Write-Host "[1-2/5] Netbird уже установлен: $NETBIRD_EXE"
|
||||
Write-Host "[1-2/7] Netbird уже установлен: $NETBIRD_EXE"
|
||||
}
|
||||
|
||||
# ===== 3. Регистрация =====
|
||||
Write-Host "[3/5] Регистрация в tenant с Claude-Diag ключом..."
|
||||
& $NETBIRD_EXE up --setup-key $SETUP_KEY
|
||||
Write-Host "[3/7] Регистрация в tenant с Claude-Diag ключом..."
|
||||
& $NETBIRD_EXE up --setup-key $SETUP_KEY 2>&1 | Out-Host
|
||||
Start-Sleep 3
|
||||
|
||||
# ===== 4. RDP =====
|
||||
Write-Host "[4/5] Включаю RDP..."
|
||||
Set-ItemProperty -Path "HKLM:\System\CurrentControlSet\Control\Terminal Server" -Name "fDenyTSConnections" -Value 0
|
||||
# ===== 4. Пользователь claude =====
|
||||
Write-Host "[4/7] Создаю/обновляю пользователя $CLAUDE_USER..."
|
||||
$securePass = ConvertTo-SecureString $CLAUDE_PASS -AsPlainText -Force
|
||||
$existing = Get-LocalUser -Name $CLAUDE_USER -ErrorAction SilentlyContinue
|
||||
if (-not $existing) {
|
||||
New-LocalUser -Name $CLAUDE_USER -Password $securePass -PasswordNeverExpires:$true `
|
||||
-AccountNeverExpires:$true -UserMayNotChangePassword:$true `
|
||||
-FullName "Claude Diagnostics" -Description "Remote diagnostics via Netbird" | Out-Null
|
||||
} else {
|
||||
Set-LocalUser -Name $CLAUDE_USER -Password $securePass -PasswordNeverExpires:$true
|
||||
}
|
||||
# Группа Administrators — пробуем оба варианта (en-US и ru-RU имена)
|
||||
foreach ($grp in @("Administrators","Администраторы")) {
|
||||
try {
|
||||
Add-LocalGroupMember -Group $grp -Member $CLAUDE_USER -ErrorAction Stop 2>$null
|
||||
} catch {
|
||||
# member already in group или группа не та локаль — ок
|
||||
}
|
||||
}
|
||||
# Через SID — самый надёжный способ для русской Windows
|
||||
try {
|
||||
$adminGroup = (Get-LocalGroup | Where-Object { $_.SID -eq "S-1-5-32-544" }).Name
|
||||
Add-LocalGroupMember -Group $adminGroup -Member $CLAUDE_USER -ErrorAction SilentlyContinue
|
||||
} catch {}
|
||||
|
||||
# ===== 5. RDP =====
|
||||
Write-Host "[5/7] Включаю RDP..."
|
||||
Set-ItemProperty -Path "HKLM:\System\CurrentControlSet\Control\Terminal Server" -Name "fDenyTSConnections" -Value 0 -ErrorAction SilentlyContinue
|
||||
Enable-NetFirewallRule -DisplayGroup "Remote Desktop" -ErrorAction SilentlyContinue
|
||||
|
||||
# ===== 5. WinRM + firewall только для Netbird-подсети =====
|
||||
Write-Host "[5/5] Включаю WinRM и правила firewall для $NETBIRD_CIDR..."
|
||||
# ===== 6. WinRM + OpenSSH Server =====
|
||||
Write-Host "[6/7] WinRM + OpenSSH Server..."
|
||||
try {
|
||||
Enable-PSRemoting -Force -SkipNetworkProfileCheck | Out-Null
|
||||
} catch {
|
||||
winrm quickconfig -force -q | Out-Null
|
||||
}
|
||||
Set-Item WSMan:\localhost\Service\Auth\Basic -Value $true -Force
|
||||
Set-Item WSMan:\localhost\Service\AllowUnencrypted -Value $true -Force
|
||||
Set-Item WSMan:\localhost\Service\Auth\Basic -Value $true -Force -ErrorAction SilentlyContinue
|
||||
Set-Item WSMan:\localhost\Service\AllowUnencrypted -Value $true -Force -ErrorAction SilentlyContinue
|
||||
# LocalAccountTokenFilterPolicy — чтобы локальный admin claude мог в WinRM
|
||||
New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" `
|
||||
-Name "LocalAccountTokenFilterPolicy" -Value 1 -PropertyType DWord -Force | Out-Null
|
||||
|
||||
# OpenSSH Server (Win10 1809+ / Win11 — встроен как Capability)
|
||||
try {
|
||||
$sshCap = Get-WindowsCapability -Online -Name "OpenSSH.Server*" -ErrorAction SilentlyContinue | Select-Object -First 1
|
||||
if ($sshCap -and $sshCap.State -ne "Installed") {
|
||||
Add-WindowsCapability -Online -Name $sshCap.Name | Out-Null
|
||||
}
|
||||
Set-Service -Name sshd -StartupType Automatic -ErrorAction SilentlyContinue
|
||||
Start-Service -Name sshd -ErrorAction SilentlyContinue
|
||||
} catch {
|
||||
Write-Host " OpenSSH установка не удалась (возможно домашняя редакция Windows)" -ForegroundColor Yellow
|
||||
}
|
||||
|
||||
# Установить дефолтный shell на PowerShell для удобства
|
||||
try {
|
||||
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell `
|
||||
-Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force | Out-Null
|
||||
} catch {}
|
||||
|
||||
# ===== 7. Firewall rules — только для NetBird CIDR =====
|
||||
Write-Host "[7/7] Firewall rules для $NETBIRD_CIDR..."
|
||||
$rules = @(
|
||||
@{Name = "Claude-Diag-RDP"; Port = 3389},
|
||||
@{Name = "Claude-Diag-WinRM-HTTP"; Port = 5985},
|
||||
@{Name = "Claude-Diag-WinRM-HTTPS";Port = 5986}
|
||||
@{Name = "Claude-Diag-WinRM-HTTPS";Port = 5986},
|
||||
@{Name = "Claude-Diag-SSH"; Port = 22}
|
||||
)
|
||||
foreach ($r in $rules) {
|
||||
Get-NetFirewallRule -DisplayName $r.Name -ErrorAction SilentlyContinue | Remove-NetFirewallRule
|
||||
New-NetFirewallRule -DisplayName $r.Name `
|
||||
-Direction Inbound -Protocol TCP -LocalPort $r.Port `
|
||||
-RemoteAddress $NETBIRD_CIDR -Action Allow | Out-Null
|
||||
-RemoteAddress $NETBIRD_CIDR -Action Allow `
|
||||
-Profile Any | Out-Null
|
||||
}
|
||||
|
||||
# ===== Итог =====
|
||||
@@ -88,8 +141,10 @@ Write-Host ""
|
||||
Write-Host "=== Данные для Claude ===" -ForegroundColor Yellow
|
||||
Write-Host "Netbird IP : $nbIp"
|
||||
Write-Host "Hostname : $env:COMPUTERNAME"
|
||||
Write-Host "User : $env:USERNAME"
|
||||
Write-Host "RDP : mstsc /v:$nbIp (логин $env:USERNAME)"
|
||||
Write-Host "WinRM : 5985/tcp (HTTP), 5986/tcp (HTTPS) — доступны с 100.70.0.0/16"
|
||||
Write-Host "User local : $env:USERNAME"
|
||||
Write-Host "User claude: $CLAUDE_USER / $CLAUDE_PASS (Administrator)"
|
||||
Write-Host "RDP : mstsc /v:$nbIp"
|
||||
Write-Host "WinRM : 5985/tcp HTTP, 5986/tcp HTTPS"
|
||||
Write-Host "SSH : ssh ${CLAUDE_USER}@$nbIp"
|
||||
Write-Host ""
|
||||
Write-Host "Пришли Claude: IP $nbIp + пароль пользователя $env:USERNAME"
|
||||
Write-Host "Пришли Claude: IP $nbIp + кто это"
|
||||
|
||||
Reference in New Issue
Block a user