fix: корневая причина - конфликт fwmark Podkop с NetBird на Переделках
This commit is contained in:
@@ -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`
|
||||
|
||||
@@ -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 трафике
|
||||
|
||||
## История изменений
|
||||
|
||||
|
||||
Reference in New Issue
Block a user