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

16 KiB
Raw Blame History

date, type, status, tags, aliases
date type status tags aliases
2026-06-02 runbook active
openwrt
podkop
amneziawg
canal-plus
france
pbr
netbird
client
runbook
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/countryFR, в Docker — контейнер amnezia-awg.

На выезд возьми из приложения: экспорт AmneziaWG-конфига для роутера (в нём Endpoint <FR_VPS_IP>:<порт> и все ключи). Этого достаточно — Claude конвертнёт в UCI.


Фаза 1 — на месте: новый провайдер (WAN)

# подключить 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 (для управления и моих диагностик)

netbird status            # должен сам переподключиться (конфиг на месте), IP 100.70.235.2
  • Если не поднялся / агент битый — переэнроллить (диаг-ключ ИСТЁК 2026-05-21, сперва перевыпустить):
    # перевыпуск ключа 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):

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) и пришлёт новый экспорт.
# === Готовый клиент Оливье (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

Проверка туннеля + что выход именно французский:

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 (обход РКН для дома)

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.1198.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 Статический лиз для приставки

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

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 подкопа (поймав их вживую):

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 приставки.