fix: корневая причина - конфликт fwmark Podkop с NetBird на Переделках

This commit is contained in:
Claude Auto-Sync
2026-04-17 12:17:41 +00:00
parent e91e216815
commit 156f82a125
2 changed files with 70 additions and 40 deletions

View File

@@ -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`

View File

@@ -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 трафике
## История изменений