Commit d8d93ef2 authored by Vitaly Lipatov's avatar Vitaly Lipatov

route-update.md: update docs for IPv6 architecture and route loss detection

- Update routes6.d structure: replace ogw with gre group (table 222) - Fix NETMAP prefix /120 → /118, show igw as gateway (not egw) - Add OpenVPN NAT66 and Xray L7 proxy sections - Update ip rule show to include gre (pref 2220), add IPv6 packet flow - Document --verbose flag and partial route loss detection (1% tolerance) Co-Authored-By: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
parent c2743a29
......@@ -28,7 +28,7 @@ routes.d/ # IPv4
│ └── antifilter-*.list -> /root/antifilter/...
routes6.d/ # IPv6
├── dgw/ # те же списки, шлюз через default IPv6
├── dgw/ # direct, через дефолтный IPv6 шлюз
│ ├── gateway # default
│ ├── table # 2
│ └── dgw.list -> /root/egw-route/dgw.list
......@@ -36,13 +36,16 @@ routes6.d/ # IPv6
├── egw/ # обход блокировок через GRE-туннель
│ ├── gateway # 2a03:5a00:c:20::122
│ ├── table # 201
│ └── egw.list -> /root/egw-route/egw.list
│ ├── egw.list -> /root/egw-route/egw.list
│ ├── ogw.list -> /root/egw-route/ogw.list
│ └── ai.list, discord.list, fakenews.list
└── ogw/ # доменные списки (IPv4-подсети фильтруются)
└── gre/ # трафик через GRE (Telegram, YouTube, ...)
├── gateway # 2a03:5a00:c:20::122
├── table # 12
├── ogw.list -> /root/egw-route/ogw.list
└── youtube.list -> /root/egw-route/youtube.list
├── table # 222
├── youtube.list -> /root/egw-route/youtube.list
├── telegram.list -> /root/egw-route/telegram.list
└── whatsapp.list -> /root/egw-route/whatsapp.list
```
Каталоги `routes.d/`, `routes6.d/` и `.state/` — site-specific, не хранятся в git.
......@@ -69,28 +72,71 @@ routes6.d/ # IPv6
- Один и тот же `.list` файл можно использовать в routes.d и routes6.d —
IPv4-адреса попадут в IPv4 маршруты, домены будут зарезолвлены в обоих режимах
### GRE-туннель для IPv6
### IPv6 через GRE-туннель (NETMAP)
IPv6-трафик к заблокированным ресурсам маршрутизируется через GRE-туннель:
IPv6-трафик к заблокированным ресурсам маршрутизируется через GRE-туннель
с prefix translation (NETMAP) на контейнере CT 680:
```
egw (2a03:5a00:c:20::14)
│ ip rule → table egw-v6 → via 2a03:5a00:c:20::122
igw (2a03:5a00:c:20::13)
│ ip -6 rule → table 201/222 → via 2a03:5a00:c:20::122
CT 680 gre.hetzner (2a03:5a00:c:20::122)
nft SNAT prefix: 2a03:5a00:c:20::/120 → 2a01:4f9:c010:cf42::/120
ip6tables NETMAP: 2a03:5a00:c:20::/118 → 2a01:4f9:c010:cf42::/118
═══ GRE tunnel (fd32::2 ↔ fd32::1) ═══
hetzner (2a01:4f9:c010:cf42::1)
│ route: 2a01:4f9:c010:cf42::/120 via fd32::2
│ route: 2a01:4f9:c010:cf42::/118 via fd32::2
│ НЕТ NAT — src уже в hetzner /64
интернет (видит src 2a01:4f9:c010:cf42::14)
интернет (видит src 2a01:4f9:c010:cf42::13)
```
Prefix translation (NPTv6) через nftables `snat prefix` / `dnat prefix` на CT 680.
Prefix translation через ip6tables NETMAP на CT 680.
Предсказуемое сопоставление: внутренний `::N` → внешний `::N`.
Маска /118 охватывает диапазон ::0 — ::3ff (достаточно для всех контейнеров).
### IPv6 через OpenVPN (NAT66)
Контейнер CT 675 (nfqws.ovpn.hetzner) подключён к hetzner через OpenVPN.
IPv6 через двойной MASQUERADE:
```
igw (2a03:5a00:c:20::13)
│ ip -6 rule → table 201 → via 2a03:5a00:c:20::122
CT 675 nfqws.ovpn.hetzner
│ ip6tables MASQUERADE: src → fd28::2 (OpenVPN tunnel address)
═══ OpenVPN tunnel (fd28::2 ↔ fd28::1) ═══
hetzner VDS
│ ip6tables MASQUERADE: src fd28::/112 → hetzner IPv6
интернет
```
OpenVPN сервер раздаёт `fd28::/112` и пушит `route-ipv6 2000::/3`.
На VDS: `ip6tables -t nat -A POSTROUTING -s fd28::/112 -o eth0 -j MASQUERADE`.
### IPv6 через Xray (L7 proxy)
Контейнер CT 684 (xray.hetzner) — L7 VLESS-proxy с tun-интерфейсом.
IPv6 работает на уровне прокси без NAT:
```
CT 684 xray.hetzner
│ ip -6 route add default dev xray0
│ Xray терминирует соединение и устанавливает новое от имени VDS
hetzner VDS (Xray server)
интернет
```
Для Xray достаточно добавить `ip -6 route add default dev xray0`
прокси сам устанавливает новое соединение с dst от своего адреса.
## Формат файлов
......@@ -151,6 +197,10 @@ default
# Показать что будет сделано, ничего не менять
./route-update.sh --show
# Подробный вывод (хэши, количество маршрутов, причины решений)
./route-update.sh --verbose
./route-update.sh -v --resolve
# Создать ip rule для всех групп (без загрузки маршрутов)
./route-update.sh --set-rules
......@@ -178,6 +228,8 @@ default
3. **Проверка ip rules/routes** — даже при совпадении хэшей скрипт проверяет,
что ip rule и маршруты в таблице существуют. Если потеряны (перезагрузка
сети, `networkctl reconfigure`), автоматически перезагружает группу.
Частичная потеря маршрутов тоже обнаруживается: если количество маршрутов
в таблице упало более чем на 1% от ожидаемого, группа перезагружается.
| Событие | Что происходит |
|---|---|
......@@ -186,6 +238,7 @@ default
| Gateway изменился | Хэш меняется → перезагрузка маршрутов |
| DNS вернул те же IP | Маршруты не перезагружаются |
| ip rules/routes потеряны | Автоматическая перезагрузка |
| Маршруты частично потеряны (>1%) | Автоматическая перезагрузка |
| Все .list убраны из группы | Таблица очищается |
| Каталог группы удалён | Cleanup находит осиротевший state → flush |
......@@ -229,8 +282,8 @@ ip rule show (IPv4):
ip -6 rule show (IPv6):
20: from all lookup 2 ← [dgw] (direct, через дефолтный IPv6 шлюз)
120: from all lookup 12 ← [ogw]
2010: from all lookup 201 ← [egw-v6]
2010: from all lookup 201 ← [egw] (через GRE-туннель)
2220: from all lookup 222 ← [gre] (Telegram, YouTube и др.)
32766: from all lookup main ← default route
Пакет к dst 1.2.3.4:
......@@ -238,6 +291,12 @@ ip -6 rule show (IPv6):
→ lookup table 12: есть маршрут? → via 91.232.225.12
→ lookup table 112: есть маршрут? → via 91.232.225.112
→ lookup main: default route
Пакет к dst 2001:db8::1 (IPv6):
→ lookup table 2: есть маршрут? → via default gw (прямой доступ)
→ lookup table 201: есть маршрут? → via 2a03:5a00:c:20::122 (GRE)
→ lookup table 222: есть маршрут? → via 2a03:5a00:c:20::122 (GRE)
→ lookup main: default route
```
Правила без `iif` — действуют на весь трафик (и транзитный, и локальный).
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment