From 156f82a1258d0d57e93dae3f75911a11c3c9e17a Mon Sep 17 00:00:00 2001 From: Claude Auto-Sync Date: Fri, 17 Apr 2026 12:17:41 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20=D0=BA=D0=BE=D1=80=D0=BD=D0=B5=D0=B2?= =?UTF-8?q?=D0=B0=D1=8F=20=D0=BF=D1=80=D0=B8=D1=87=D0=B8=D0=BD=D0=B0=20-?= =?UTF-8?q?=20=D0=BA=D0=BE=D0=BD=D1=84=D0=BB=D0=B8=D0=BA=D1=82=20fwmark=20?= =?UTF-8?q?Podkop=20=D1=81=20NetBird=20=D0=BD=D0=B0=20=D0=9F=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D0=B4=D0=B5=D0=BB=D0=BA=D0=B0=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...26-04-17-peredelki-podkop-stability-fix.md | 108 +++++++++++------- projects/niikn/openwrt-bypass.md | 2 + 2 files changed, 70 insertions(+), 40 deletions(-) diff --git a/decisions/2026-04-17-peredelki-podkop-stability-fix.md b/decisions/2026-04-17-peredelki-podkop-stability-fix.md index e714ebd..f157dfd 100644 --- a/decisions/2026-04-17-peredelki-podkop-stability-fix.md +++ b/decisions/2026-04-17-peredelki-podkop-stability-fix.md @@ -1,62 +1,90 @@ # 2026-04-17: Стабилизация Podkop на Переделках ## Проблема -Жалоба: Podkop на объекте Переделки (OpenWrt 100.70.197.125) плохо обходит блокировки, работает нестабильно. +Обход блокировок на OpenWrt Переделки (100.70.197.125) не работал: iPhone/iPad не открывали Instagram, YouTube и т.д. DNS резолвил в FakeIP (198.18.0.x), но соединения к FakeIP адресам висели в `SYN_SENT / UNREPLIED`. -## Диагностика +## Корневая причина: конфликт fwmark с NetBird -Туннель AWG (wg0 → 78.17.4.225 Финляндия) был исправен: -- Handshake свежий, 0% packet loss, выход через 78.17.4.225 -- FakeIP DNS резолвит в 198.18.0.x для всех проверенных доменов +OpenWrt + Podkop + NetBird VPN — три разные таблицы nftables, и **обе** — Podkop и NetBird — вешают chain на hook `prerouting priority mangle` (-150). -Три реальные причины нестабильности: +**`ip netbird` netbird-mangle-prerouting:** +``` +iifname != "wt0" ct state new ip saddr 192.168.2.0/24 meta mark set 0x0001bd22 +``` -### 1. `disable_quic = 0` (ГЛАВНАЯ) -QUIC (HTTP/3 на UDP:443) не перехватывался FakeIP. YouTube/Google/Meta/Instagram в Chrome/Firefox fallback'или на QUIC и шли напрямую, минуя VPN → обход ломался избирательно для этих сервисов. +**`inet PodkopTable` mangle:** +``` +iifname @interfaces ip daddr 198.18.0.0/15 meta l4proto tcp meta mark set 0x00100000 +``` -### 2. sing-box не в автозапуске -`/etc/init.d/sing-box enabled` → exit 1. При ребуте роутера sing-box не поднимался автоматически, podkop подхватывал его через `start_service`, но на это нельзя полагаться. +При одинаковом приоритете порядок выполнения не гарантирован. По факту на этой системе netbird выполнялся **после** podkop и перезаписывал метку: `0x00100000` → `0x0001bd22`. -### 3. `shutdown_correctly = 0` -При выключении nftables-правила podkop не снимались корректно. +Затем `PodkopTable.proxy` (priority dstnat, -100) проверял условие: +``` +meta mark & 0x00100000 == 0x00100000 +``` +— которое уже не выполнялось. **tproxy не срабатывал**, пакеты шли через forward → WAN masquerade и терялись. -## Исправление +Счётчики при этом обманчивы: `mangle` растёт (правило срабатывает), а `proxy tproxy` почти не растёт. +## Решение + +Сдвинуть PodkopTable.mangle на priority `-140` (`mangle + 10`) — выполняется **после** netbird, восстанавливая метку `0x00100000` перед proxy chain. + +### Патч `/usr/bin/podkop` (строка 311) +```bash +# было: +nft add chain inet "$NFT_TABLE_NAME" mangle '{ type filter hook prerouting priority -150; policy accept; }' +# стало: +nft add chain inet "$NFT_TABLE_NAME" mangle '{ type filter hook prerouting priority -140; policy accept; }' +``` + +Одной командой: ```bash ssh root@100.70.197.125 # 1qaz!QAZ - -# 1. Блокировка QUIC (сбрасывает HTTP/3 на TCP/TLS) -uci set podkop.settings.disable_quic='1' -uci set podkop.settings.shutdown_correctly='1' -uci commit podkop - -# 2. Автозапуск sing-box -/etc/init.d/sing-box enable - -# 3. Применить +cp /usr/bin/podkop /usr/bin/podkop.bak-20260417 +sed -i '311s/priority -150/priority -140/' /usr/bin/podkop podkop restart ``` +`mangle_output` (строка 312, hook output) оставлен `-150` — там конфликта нет. + +### Сопутствующие правки (сделаны ранее) +1. `disable_quic=1` — блокировать HTTP/3 чтобы браузеры не обходили FakeIP через UDP/443 +2. `/etc/init.d/sing-box enable` — автозапуск после ребута +3. `shutdown_correctly=1` + +```bash +uci set podkop.settings.disable_quic='1' +uci set podkop.settings.shutdown_correctly='1' +uci commit podkop +/etc/init.d/sing-box enable +``` + ## Результат - -| Параметр | До | После | -|----------|-----|-------| -| disable_quic | 0 | 1 | -| shutdown_correctly | 0 | 1 | -| sing-box autostart | DISABLED | ENABLED (`/etc/rc.d/S99sing-box`) | -| podkop autostart | ENABLED | ENABLED | -| AWG handshake | свежий | свежий | -| Выход в инет | 78.17.4.225 | 78.17.4.225 | - -FakeIP DNS проверен для: youtube, instagram, whatsapp, web.telegram.org, facebook, tiktok — все резолвятся в 198.18.0.x. - -В sing-box config.json подтверждено правило для `protocol: quic` на `tproxy-in` → QUIC-трафик к заблокированным доменам идёт через VPN. +- TCP tproxy: 5584 пакета / 409 KB за ~1 мин +- UDP tproxy (QUIC): 58 пакетов +- AWG transfer: 60 MiB received через туннель +- iPhone 192.168.2.160: 14 ASSURED conntrack соединений ## Важное на будущее -1. **`disable_quic=1` обязателен на FakeIP + sing-box** — без этого браузеры будут произвольно использовать HTTP/3 мимо обхода. -2. **Проверять автозапуск sing-box после установки/обновления Podkop** — установщик не всегда включает его в procd. -3. **`podkop restart` может сбрасывать `shutdown_correctly`** — это баг, перепроверять значение после рестарта. +1. **Конфликт priority при co-existence Podkop + NetBird** — если в сети присутствует NetBird (или любой другой nft-wrapper-VPN с hook prerouting priority mangle), Podkop нужно сдвигать на `-140` или позже. Это не описано в документации Podkop. +2. **Не верь только счётчику `mangle`** — если `proxy.tproxy` counter сильно отстаёт, метка где-то перезаписывается. +3. Патч `/usr/bin/podkop` слетит при обновлении пакета — после каждого `opkg upgrade podkop` проверять `sed -n '311p' /usr/bin/podkop`. +4. `podkop apply` команды не существует — для перегенерации правил: `podkop restart`. +5. На OpenWrt Переделки **нет `conntrack` CLI и `timeout`** — только /proc и builtin. + +## Диагностика на будущее + +```bash +# Быстрый тест: метка жива после всех mangle chains? +nft list chain inet PodkopTable proxy | grep packets +# Если TCP/UDP tproxy counter = 0 при активном LAN трафике → конфликт mangle + +# Перечисление всех prerouting chains с приоритетами +nft list chains | grep -A1 prerouting +``` ## Теги -`#niikn` `#peredelki` `#podkop` `#amneziawg` `#bypass` `#quic` `#stability` `#fix` +`#niikn` `#peredelki` `#podkop` `#netbird` `#nftables` `#fwmark` `#tproxy` `#amneziawg` `#fix` diff --git a/projects/niikn/openwrt-bypass.md b/projects/niikn/openwrt-bypass.md index b2ae07e..28f3259 100644 --- a/projects/niikn/openwrt-bypass.md +++ b/projects/niikn/openwrt-bypass.md @@ -236,6 +236,8 @@ traceroute -n 198.18.0.1 - **КРИТИЧНО для FakeIP-режима:** `disable_quic=1` обязателен, иначе браузеры используют HTTP/3 на UDP:443 мимо обхода (YouTube/Meta/Google) - `podkop restart` может сбрасывать `shutdown_correctly` в 0 — проверять после рестарта - sing-box установщик не всегда включает procd-автозапуск: проверять `/etc/init.d/sing-box enabled` +- **КРИТИЧНО при co-existence с NetBird** (Переделки): оба ставят chain на `prerouting priority mangle` (-150) и конфликтуют по fwmark. Netbird перезаписывает `0x00100000` → tproxy не срабатывает. Фикс: патч `/usr/bin/podkop:311` с `-150 → -140`. См. [decisions/2026-04-17-peredelki-podkop-stability-fix.md](../../decisions/2026-04-17-peredelki-podkop-stability-fix.md) +- Проверка что конфликта нет: `nft list chain inet PodkopTable proxy | grep packets` — счётчик tproxy должен расти при активном LAN трафике ## История изменений