Files
knowledge-base/projects/openwrt-4/canal-plus-setup-runbook.md

230 lines
16 KiB
Markdown
Raw Permalink 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-06-02
type: runbook
status: active
tags: [openwrt, podkop, amneziawg, canal-plus, france, pbr, netbird, client, runbook]
aliases: [OpenWrt_4 Canal+, canal-plus-runbook, француз обход]
---
# OpenWrt_4 (француз, Москва) — обход + Canal+: рунбук выезда
> **Контекст.** Клиент-француз в Москве. Cudy TR3000 (`OpenWrt_4`, NetBird `100.70.235.2`), podkop + AmneziaWG + NetBird. Завтра — **смена провайдера** + первичная настройка **Canal+**.
> **Главная зависимость:** Canal+ / myCanal гео-блочит по IP → нужен **французский IP**. У Олега франц-выхода не было (только Финляндия/Сингапур) → поднимаем **FR VPS + AmneziaWG**.
> **Устройство Canal+:** Apple TV / Smart TV / приставка (гео по IP) → **роутим устройство целиком** через FR-туннель (`pbr`), без гонки за доменами Canal+.
> Модель/грабли подкопа: [[../../snippets/podkop-reference]]. Диагностика: [[../../snippets/podkop-fakeip-diagnostics]].
---
## Архитектура (после настройки)
```
LAN
├─ дом (телефоны/ПК) ── podkop FakeIP ─ meta/youtube/telegram → awg0 → ФРАНЦИЯ
│ РФ-сайты (gosuslugi/ozon/банки) ───────→ WAN напрямую
└─ Apple TV (Canal+) ── pbr: ВЕСЬ трафик источника ───────────→ awg0 → ФРАНЦИЯ
awg0 = AmneziaWG до нового FR VPS. EXIT один — Франция (она дотягивается и до YouTube/Meta, и до Canal+).
```
**Почему один французский выход, а не финский+отдельно Canal+:** Франция открывает и заблокированное РКН (YT/Meta/TG), и Canal+. Два туннеля городить не нужно. ⛔ `russia_outside` НЕ ставить — клиент в РФ, сломает РФ-сайты.
---
## Фаза 0 — СЕГОДНЯ: поднять FR VPS + AmneziaWG-сервер
### 0.1 VPS — выбор провайдера
**Требования:** KVM (не OpenVZ — нужен `/dev/net/tun`), Ubuntu 22.04/24.04, 2 vCPU / 2 GB / 2040 GB NVMe, порт ≥100 Mbps, **безлимит или ≥2 TB трафика** (HD-стрим ~6 Mbps ≈ 8 ГБ/час). IP именно французский.
| Провайдер | Локация | Оплата из РФ | Почему |
|---|---|---|---|
| **HOSTKEY Paris** ⭐ рекоменд. | Paris PAR3 (Vélizy) | ✅ твой аккаунт (Финляндия там же), карта/крипта | instant, панель знакома, 110 Gbps. Минус: датацентр-IP — Canal+ может забанить → ротация/фолбэк ниже |
| **Aeza Paris** — резерв/тест | Paris | ✅ RU-карты/SBP/Tinkoff/крипта, €0.02/час | instant, **другой ASN** для проверки гео. Минус: под санкциями OFAC-2025 + жалобы на стабильность — не как постоянный |
| OVH / Scaleway | Roubaix / Paris | ⚠️ нужна НЕ-российская карта | лучшая инфра: Scaleway — безлимит исходящего; OVH — докупка до 16 IP (удобная ротация при бане). Брать если есть зарубежная карта |
**Если IP во франц-бане Canal+** («недоступно в регионе»): (1) запросить другой IP у хостера / докупить (OVH +16 IP), (2) поднять Aeza Paris почасово и проверить другой ASN, (3) гарантированный фолбэк — IPRoyal `country-fr` residential ([[../../snippets/iproyal-gost-relay]]).
Hetzner/Contabo **не годятся** — нет Франции.
### 0.2 AmneziaWG-сервер — **разворачивает Олег через приложение AmneziaVPN** (Claude не ставит вручную)
> Договорённость: сервер поднимает Олег сам приложением, Claude работает с уже готовым сервером (конвертация конфига, проверка, podkop+pbr, диагностика). Никаких самосборных amneziawg-go от Claude.
Олег в приложении **AmneziaVPN**:
1. Добавить сервер по SSH: `151.243.217.139`, root + пароль (приложение само развернёт Docker-стек).
2. Протокол — именно **AmneziaWG** (не OpenVPN/обычный WireGuard): DPI-устойчив для связки РФ→Франция. Обфускацию (Jc/S1/S2/H1H4) и ключи приложение генерит само.
3. Сделать **отдельное подключение/клиент для роутера** («Cudy») и **экспортировать** его конфиг: «Настройки соединения → AmneziaWG/WireGuard» → текст `[Interface]/[Peer]` (или `.conf`).
4. Скинуть этот экспорт Claude.
**Claude дальше:** из экспорта берёт `PrivateKey`/`Address`/`PublicKey`/`PresharedKey`/`Endpoint` + **точные** Jc/Jmin/Jmax/S1/S2/H1H4 (как сгенерил app) и собирает OpenWrt-блок `awg0` (Фаза 3). Затем по SSH на ноду проверяет, что контейнер слушает и egress = FR.
Проверка ноды (Claude, после деплоя): `ss -ulpn | grep -i awg` (порт слушает), `curl -s ipinfo.io/country``FR`, в Docker — контейнер amnezia-awg.
> На выезд возьми из приложения: экспорт **AmneziaWG-конфига для роутера** (в нём `Endpoint <FR_VPS_IP>:<порт>` и все ключи). Этого достаточно — Claude конвертнёт в UCI.
---
## Фаза 1 — на месте: новый провайдер (WAN)
```sh
# подключить WAN нового провайдера, поднять линк (DHCP / PPPoE / static — по провайдеру)
uci show network.wan; ifstatus wan | grep -E 'up|address'
ping -c3 1.1.1.1 # есть ли интернет вообще
```
- **CGNAT/двойной NAT — не проблема:** туннель и NetBird исходящие, проброс портов не нужен.
- **MTU:** PPPoE → 1492. Если позже awg0 будет «грузить сайты наполовину» — см. Фазу 3 (MTU 1420→1380).
- Убедиться, что провайдер **не режет UDP/39202** (редко): `nc -zu <FR_VPS_IP> 39202` или просто проверить handshake в Фазе 3.
---
## Фаза 2 — на месте: вернуть NetBird (для управления и моих диагностик)
```sh
netbird status # должен сам переподключиться (конфиг на месте), IP 100.70.235.2
```
- Если не поднялся / агент битый — **переэнроллить** (диаг-ключ ИСТЁК 2026-05-21, сперва перевыпустить):
```bash
# перевыпуск ключа Claude-Diag (с любого хоста с интернетом):
curl -s -X POST -H "Authorization: Token nbp_YTEmAVpS0hLhnTeJ09q3wYaC0AAXjN21NPvM" \
-H "Content-Type: application/json" \
-d '{"name":"Claude Diagnostic","type":"reusable","expires_in":2592000,"auto_groups":["d7jra32fadhs73dmqv5g"],"usage_limit":0,"ephemeral":false}' \
https://api.netbird.io/api/setup-keys
# на роутере:
netbird up --setup-key <НОВЫЙ_КЛЮЧ>
```
- Агент старый (`0.50.2`). Обновлять **только если** не подключается (не чинить рабочее). Как поднимется — пинг мне `ssh root@100.70.235.2`, дальше помогу вживую.
---
## Фаза 3 — на месте: клиент awg0 → французский VPS
**Сначала проверь, что proto умеет AWG 1.5** (сервер на 1.5: H-диапазоны/S3/S4/I1):
```sh
grep -oE 'awg_(s[1-4]|h[1-4]|i[1-5])' /lib/netifd/proto/amneziawg.sh | sort -u
opkg list-installed | grep amneziawg
```
- Видишь `awg_s3 awg_s4 awg_i1` → ставь блок ниже целиком.
- НЕТ их → handshake не встанет (H заданы диапазонами). Тогда: `opkg update && opkg install kmod-amneziawg amneziawg-tools luci-proto-amneziawg` → повтори. Если свежего пакета нет → Олег перегенерит сервер в приложении проще (одиночные H, без S3/S4/I) и пришлёт новый экспорт.
```sh
# === Готовый клиент Оливье (10.8.1.3) → FR-нода 151.243.217.139:44221 ===
uci set network.awg0=interface
uci set network.awg0.proto='amneziawg'
uci set network.awg0.private_key='3JMaqHzXmGjKRoRSpSluPu6N9hPO/PssjCH4rp6Q+lw='
uci -q delete network.awg0.addresses
uci add_list network.awg0.addresses='10.8.1.3/32'
uci set network.awg0.mtu='1420'
# classic-обфускация (есть в любой версии proto):
uci set network.awg0.awg_jc='5'
uci set network.awg0.awg_jmin='10'
uci set network.awg0.awg_jmax='50'
uci set network.awg0.awg_s1='97'
uci set network.awg0.awg_s2='99'
uci set network.awg0.awg_h1='525652870-1032659689'
uci set network.awg0.awg_h2='2143742042-2146202402'
uci set network.awg0.awg_h3='2146939599-2147410002'
uci set network.awg0.awg_h4='2147455965-2147472644'
# AWG 1.5 (ставить ТОЛЬКО если proto поддерживает — см. проверку выше):
uci set network.awg0.awg_s3='63'
uci set network.awg0.awg_s4='7'
uci set network.awg0.awg_i1='<r 2><b 0x858000010001000000000669636c6f756403636f6d0000010001c00c000100010000105a00044d583737>'
uci set network.awg0_peer=amneziawg_awg0
uci set network.awg0_peer.public_key='wyN+ob6bWvDsBHw6gVBO11YmpG1kYVO6OqnGtwJx5zs='
uci set network.awg0_peer.preshared_key='eRtyuG6UdQqKxKK/lmWkosR3n0PUNUH9u45CXVNnsS8='
uci set network.awg0_peer.endpoint_host='151.243.217.139'
uci set network.awg0_peer.endpoint_port='44221'
uci add_list network.awg0_peer.allowed_ips='0.0.0.0/0'
uci set network.awg0_peer.route_allowed_ips='0' # ВАЖНО: awg0 НЕ глобальный дефолт — рулят podkop и pbr
uci set network.awg0_peer.persistent_keepalive='25'
uci commit network
# awg0 в WAN-зону (иначе трафик не уходит и нет SNAT) — найди индекс wan-зоны:
uci show firewall | grep -E "zone\[.*\].name"
uci add_list firewall.@zone[1].network='awg0' # подставь правильный индекс wan!
uci commit firewall
/etc/init.d/network restart && /etc/init.d/firewall reload
```
**Проверка туннеля + что выход именно французский:**
```sh
awg show awg0 # handshake < 2 мин, rx/tx растут
curl -4 -s --max-time 5 --interface awg0 https://ipinfo.io/country # → FR (ключевой тест!)
curl -4 -s --max-time 5 https://ifconfig.me; echo # WAN = РФ-IP (для сравнения)
```
- Нет handshake → порт/UDP режется DPI нового провайдера или опечатка в ключах/H-параметрах. H1H4 — точные числа, не диапазоны.
- Сайты грузятся наполовину → `ping -M do -s 1380 8.8.8.8 -I awg0`; если фрагментация — MTU awg0 1420→1380.
---
## Фаза 4 — на месте: podkop (обход РКН для дома)
```sh
uci set podkop.main.connection_type='vpn'
uci set podkop.main.interface='awg0'
uci set podkop.settings.disable_quic='1' # ОБЯЗАТЕЛЬНО
# списки — точечные; ⛔ НИКОГДА russia_outside (клиент в РФ):
for L in meta youtube telegram; do uci add_list podkop.main.community_lists="$L"; done
uci -q del_list podkop.main.community_lists='russia_outside'
uci commit podkop && /etc/init.d/podkop restart
```
Проверка FakeIP: `nslookup www.instagram.com 192.168.1.1` → `198.18.x.x`; `nslookup gosuslugi.ru 192.168.1.1` → **реальный** IP (РФ-сайт мимо туннеля). DNS-цепочка: `LAN→dnsmasq:53→127.0.0.42`, `noresolv=1`.
---
## Фаза 5 — на месте: Canal+ устройство → Франция целиком (pbr)
**5.1 Статический лиз для приставки**
```sh
uci add dhcp host
uci set dhcp.@host[-1].name='canaltv'
uci set dhcp.@host[-1].mac='<APPLETV_MAC>' # Settings → Network → посмотреть MAC
uci set dhcp.@host[-1].ip='192.168.1.50'
uci commit dhcp && /etc/init.d/dnsmasq restart
```
**5.2 pbr: весь трафик 192.168.1.50 → awg0**
```sh
opkg update && opkg install pbr luci-app-pbr
uci set pbr.config.enabled='1'
uci add pbr policy
uci set pbr.@policy[-1].name='CanalTV_FR'
uci set pbr.@policy[-1].src_addr='192.168.1.50'
uci set pbr.@policy[-1].interface='awg0'
uci commit pbr && /etc/init.d/pbr restart
/etc/init.d/pbr status # политика должна зарезолвиться (awg0 online)
```
**5.3 Приставку увести с FakeIP (иначе FakeIP-домены уедут в awg0 и сломаются на ней).**
Самое надёжное и быстрое — задать DNS прямо на приставке:
> Apple TV: Настройки → Сеть → (Wi-Fi/Ethernet) → Конфигурация DNS → **Вручную → 1.1.1.1**.
DNS-запрос тоже уйдёт через Францию (pbr) → вернутся реальные IP, маршрутизируемые в awg0. На приставке выключи любой DoH/VPN-профиль.
*(Альтернатива «всё на роутере» — tagged dhcp-option DNS для этого хоста; делать только если не хочешь трогать приставку.)*
**Если НЕ хочешь pbr** (Plan B, по доменам): добавь домены Canal+ в `user_domains` подкопа (поймав их вживую):
```sh
tcpdump -i br-lan -n 'udp port 53 and host 192.168.1.50' & # запусти приложение Canal+ — собери хосты
uci set podkop.main.user_domain_list_type='dynamic'
for d in mycanal.fr canalplus.com canal-plus.com <добавить пойманные>; do
uci add_list podkop.main.user_domains="$d"; done
uci commit podkop && /etc/init.d/podkop restart
```
Минус Plan B — легко пропустить CDN/DRM-хост → плеер падает. Для приставки pbr надёжнее.
---
## Фаза 6 — на месте: проверка Canal+
1. На приставке (или `curl` с роутера от её таблицы) публичный IP = **французский**.
2. Запусти myCanal → должно определить Францию → live + VOD играют.
3. **«Недоступно в вашем регионе»** → IP VPS во франц-бане:
- сменить франц-сервер/пересоздать VPS-IP, **или** временно завернуть приставку через IPRoyal `country-fr` ([[../../snippets/iproyal-gost-relay]]).
4. Тормозит/буферит → MTU (Фаза 3) или маловат VPS — проверить `iperf3` до VPS.
---
## Фаза 7 — после: задокументировать
- [ ] Заполнить [[README]]: доступы Cudy, `<FR_VPS_IP>`, ключи, MAC приставки.
- [ ] Дописать строку в инвентарь [[../../snippets/podkop-reference#9-инвентарь-podkop-по-объектам]] (объект `OpenWrt_4`, EXIT=Франция, Canal+ через pbr).
- [ ] Переименовать пир в NetBird `OpenWrt_4` → осмысленно.
- [ ] Решение в `decisions/2026-06-02-openwrt4-canal-plus-france.md`.
## Чек-лист «взять с собой»
`<FR_VPS_IP>` · `server.pub` · `client.key` · `psk` · перевыпущенный NetBird-ключ (если понадобится) · MAC приставки.