Files
netrunner-proxy/client/src/tun/README.MD
T
2026-06-30 18:51:09 +07:00

41 lines
2.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Блок `client/tun` — TUN-интерфейс и системная маршрутизация
«Железо» клиента — граница с ОС, через которую в стек попадают сырые L3-пакеты
приложений и куда возвращаются ответы. Платформо-зависимый ввод/вывод.
> Детали — в rustdoc крейта `netrunner-client`, модуль `tun`.
## Файлы
| Файл | Роль |
|--------------|------------------------------------------------------------------|
| `tun.rs` | Обёртка `Tun`: создание/открытие устройства, `split` на reader/writer. |
| `device.rs` | Счётчики трафика (`GLOBAL_*` для FFI) + `TrafficCounter` со скоростью. |
| `routing.rs` | Установка/снятие системных маршрутов и kill-switch. |
## Как создаётся TUN
- **Linux (desktop)** — `Tun::create(...)` с именем `netr0`, адресом 10.0.0.1/24.
- **Android/iOS** — `Tun::from_fd(fd)`: дескриптор приходит из нативного `VpnService`.
- **Split** разводит устройство на пишущую и читающую половины — их забирают
разные задачи движка ([`net`](../net)).
## Маршрутизация (`routing.rs`)
`setup_platform_routing` заворачивает трафик в TUN, сохраняя доступ к прокси; при
`killswitch` режет всё мимо туннеля. Реализация целиком по `cfg`:
| Платформа | Механизм |
|---------------|------------------------------------------------------------------|
| Linux | `nftables` (таблица `netrunner`) + policy-routing `ip rule`/`table 100`; split-tunneling по UID; DNAT DNS на стек. |
| Windows | таблица маршрутов (`0.0.0.0/1`+`128.0.0.0/1` поверх дефолта); kill-switch удалением дефолта; откат через DHCP-renew. |
| Android/iOS | ничего — маршруты ставит нативная сторона. |
`reset_platform_routing` откатывает всё при остановке.
## Связи
Пакеты из `Tun` читает движок [`net`](../net); счётчики `GLOBAL_*` отдаются в
приложение через FFI (`lib.rs`). Имя `device.rs` историческое — сам smoltcp-`Device`
живёт во внешнем форке smoltcp, здесь только метрики.