--- sidebar_position: 4 title: Маршрутизация --- # Маршрутизация Вкладка маршрутизации управляет тем, как обрабатываются DNS-запросы и куда направляется трафик, совпавший с целями сета. Содержит два раздела: **DNS-редирект** и **Маршрутизация трафика**. ## DNS-редирект Перенаправляет DNS-запросы для доменов из сета на указанный DNS-сервер. Некоторые провайдеры перехватывают DNS-ответы и подменяют IP-адреса (DNS poisoning). В результате подключение идёт на неправильный адрес, даже если домен не заблокирован напрямую. DNS-редирект отправляет запрос на альтернативный сервер, минуя перехват. ```mermaid flowchart LR A["Приложение"] -->|"DNS-запрос
instagram.com"| B["b4"] B -->|"Перехват"| C{"DNS провайдера"} C -->|"Подмена IP"| X["❌ Неправильный адрес"] B -->|"Редирект"| D["Указанный DNS"] D -->|"Реальный IP"| E["✅ Сайт работает"] style A fill:#4a9eff,color:#fff,stroke:none style B fill:#e91e63,color:#fff,stroke:none style C fill:#ff9800,color:#fff,stroke:none style X fill:#f44336,color:#fff,stroke:none style D fill:#4caf50,color:#fff,stroke:none style E fill:#4caf50,color:#fff,stroke:none ``` ### Настройка 1. Включите **DNS-редирект** 2. Выберите DNS-сервер из списка или введите IP вручную :::tip Если не знаете, какой DNS выбрать - начните с любого из списка, кроме Google DNS (8.8.8.8). Google DNS блокируется некоторыми провайдерами в первую очередь. ::: ### Список серверов В интерфейсе отображается список DNS-серверов с иконками: | Иконка | Значение | | --- | --- | | ⚡ | Fast - ориентирован на скорость | | 🛑 | AdBlock - блокирует рекламные домены | | 🔒 | DNSSEC - криптографическая проверка ответов | При выборе сервера его IP автоматически подставляется в поле. Можно ввести любой другой IP вручную. :::warning Если поле DNS-сервера пустое, редирект не будет работать, даже если он включён. ::: ### Фрагментация DNS-запроса Переключатель **Фрагментировать запрос** разбивает DNS-пакет на несколько частей перед отправкой. Используется, если провайдер анализирует содержимое DNS-пакетов даже к сторонним серверам и блокирует запросы по содержимому. :::info Фрагментация затрагивает только DNS-запросы доменов из текущего сета. Остальной DNS-трафик не изменяется. ::: --- ## Маршрутизация трафика Направляет трафик, совпавший с целями сета, через указанный сетевой интерфейс - например, VPN, WireGuard или другой туннель. ### Общая схема ```mermaid flowchart TB DNS["DNS-ответ для домена из сета"] -->|"IP + TTL"| IPSET STATIC["Статические IP из целей сета"] -->|"IP"| IPSET IPSET["IP-набор
(nftables set / ipset)"] IPSET --> MARK["PREROUTING / OUTPUT
dst IP в наборе? → fwmark"] MARK -->|"fwmark"| RULE["ip rule
fwmark → таблица маршрутизации"] RULE --> ROUTE["Таблица маршрутизации
default → выходной интерфейс"] ROUTE --> MASQ["POSTROUTING
Masquerade"] MASQ --> IFACE["wg0 / tun0 / ..."] style DNS fill:#4a9eff,color:#fff,stroke:none style STATIC fill:#4a9eff,color:#fff,stroke:none style IPSET fill:#ff9800,color:#fff,stroke:none style MARK fill:#e91e63,color:#fff,stroke:none style MASQ fill:#e91e63,color:#fff,stroke:none style RULE fill:#9c27b0,color:#fff,stroke:none style ROUTE fill:#9c27b0,color:#fff,stroke:none style IFACE fill:#4caf50,color:#fff,stroke:none ``` ### Как это работает (подробно) Маршрутизация использует policy-based routing - маршрутизацию на основе меток пакетов: 1. **Сбор IP-адресов.** Когда b4 видит DNS-ответ для домена из сета, он извлекает из него IP-адреса и добавляет их во внутренний IP-набор (nftables set или ipset). IP-адреса, указанные вручную в [целях сета](./targets.md), добавляются при загрузке конфигурации. 2. **Маркировка пакетов.** b4 создаёт цепочки в firewall для каждого сета: - **PREROUTING** (mangle) - маркирует транзитный трафик (от устройств в сети), если IP назначения есть в наборе. Если указаны исходные интерфейсы - маркирует только трафик с этих интерфейсов. - **OUTPUT** (mangle) - маркирует трафик от самого роутера. 3. **Policy routing.** Для маркированных пакетов создаётся правило `ip rule`: пакеты с определённым `fwmark` направляются в отдельную таблицу маршрутизации, где default route указывает на выходной интерфейс. 4. **Masquerade.** В цепочке **POSTROUTING** (nat) ко всему маркированному трафику, выходящему через целевой интерфейс, применяется masquerade - исходный IP пакета заменяется на IP выходного интерфейса. Это необходимо, чтобы ответные пакеты возвращались через тот же туннель. 5. **Предварительное разрешение.** При включении маршрутизации b4 сразу резолвит все домены из целей сета и добавляет полученные IP в набор. Это обеспечивает маршрутизацию с первого запроса, не дожидаясь DNS-трафика через NFQUEUE. ### Настройка 1. Включите **Маршрутизацию** 2. Выберите **Исходные интерфейсы** - с каких интерфейсов перехватывать трафик 3. Выберите **Выходной интерфейс** - куда направить трафик ![routing](/img/routing/20260326230827.png) После включения в верхней части раздела отображается диаграмма потока: ```text [Исходные интерфейсы] → B4 → [Выходной интерфейс] → Интернет ``` Диаграмма обновляется при изменении настроек. ### Исходные интерфейсы Определяют, с каких сетевых интерфейсов перехватывать трафик для маршрутизации. Отображаются как кнопки-бейджи - клик включает/выключает интерфейс. :::info Если ни один исходный интерфейс не выбран - маршрутизация применяется ко всему трафику, включая трафик от самого роутера. ::: Если ранее выбранный интерфейс исчез из системы (например, VPN-подключение разорвалось), он отображается красным с пометкой «stale». ### Выходной интерфейс Сетевой интерфейс, через который будет отправлен маркированный трафик: | Интерфейс | Описание | | --- | --- | | `wg0`, `wg1` | WireGuard-туннель | | `tun0`, `tun1` | OpenVPN-туннель | | `ppp0` | PPP-соединение | :::warning Если выбранный выходной интерфейс перестал быть доступен, появится предупреждение. Маршрутизация не будет работать, пока интерфейс не появится снова. ::: ### IP TTL (время жизни записи) Определяет, сколько секунд IP-адрес, полученный из DNS-ответа, хранится в IP-наборе маршрутизации. По истечении TTL запись удаляется автоматически. Значение по умолчанию: **3600** секунд (1 час). IP-адреса, добавленные вручную в целях сета, также получают этот TTL и обновляются при каждой синхронизации конфигурации. :::tip Для стабильных сервисов с постоянными IP можно увеличить TTL. Для CDN-сервисов, где IP меняются часто, лучше уменьшить. ::: ### Firewall backend b4 автоматически определяет доступный backend: | Backend | Требования | Описание | | --- | --- | --- | | **nftables** | бинарник `nft` | Создаёт таблицу `b4_route` с цепочками `prerouting`, `output`, `postrouting`. IP-наборы с поддержкой `interval` и `timeout`. | | **iptables + ipset** | бинарники `iptables`, `ipset` | Использует таблицы `mangle` и `nat`. Создаёт ipset типа `hash:net` для хранения IP. Также проверяет `iptables-legacy`. | :::info Выбор backend происходит автоматически. На системах с nftables используется nftables, на старых системах - iptables. Ручная настройка не требуется. ::: ### FWMark и таблица маршрутизации Каждому выходному интерфейсу автоматически назначаются: - **fwmark** - метка пакета (диапазон `0x100`–`0x7EFF`) - **routing table** - номер таблицы маршрутизации (диапазон `100`–`2099`) Значения вычисляются на основе имени интерфейса и остаются стабильными между перезагрузками. Если несколько сетов используют один и тот же выходной интерфейс - они разделяют `fwmark` и таблицу. :::info Ручное указание `fwmark` и `table` доступно через конфигурационный файл. В этом случае автоматическое назначение не используется. ::: ### Очистка При отключении маршрутизации или удалении сета b4 полностью удаляет все созданные правила: - Удаляет `ip rule` и записи в таблице маршрутизации - Удаляет jump-правила из базовых цепочек - Очищает и удаляет созданные цепочки и IP-наборы При полной остановке b4 выполняется очистка обоих backend (nftables и iptables) для удаления возможных остаточных правил.