41 lines
2.7 KiB
Markdown
41 lines
2.7 KiB
Markdown
# Блок `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, здесь только метрики.
|