Маршрутизация
Вкладка маршрутизации управляет тем, как обрабатываются DNS-запросы и куда направляется трафик, совпавший с целями сета. Содержит два раздела: DNS-редирект и Маршрутизация трафика.
DNS-редирект
Перенаправляет DNS-запросы для доменов из сета на указанный DNS-сервер.
Некоторые провайдеры перехватывают DNS-ответы и подменяют IP-адреса (DNS poisoning). В результате подключение идёт на неправильный адрес, даже если домен не заблокирован напрямую. DNS-редирект отправляет запрос на альтернативный сервер, минуя перехват.
Здесь описан обычный DNS-сервер. Про зашифрованный DNS (DoH), закреплённые адреса, DNS поверх TCP и общие настройки DNS смотрите страницу DNS.
Настройка
- Включите DNS-редирект
- Выберите DNS-сервер из списка или введите IP вручную
Если не знаете, какой DNS выбрать - начните с любого из списка, кроме Google DNS (8.8.8.8). Google DNS блокируется некоторыми провайдерами в первую очередь.
Список серверов
При выборе сервера его IP автоматически подставляется в поле. Можно ввести любой другой IP вручную.
Если поле DNS-сервера пустое, редирект не будет работать, даже если он включён.
Фрагментация DNS-запроса
Переключатель Фрагментировать запрос разбивает DNS-пакет на несколько частей перед отправкой.
Используется, если провайдер анализирует содержимое DNS-пакетов даже к сторонним серверам и блокирует запросы по содержимому.
Фрагментация затрагивает только DNS-запросы доменов из текущего сета. Остальной DNS-трафик не изменяется.
Маршрутизация трафика
Направляет трафик, совпавший с целями сета, через указанный сетевой интерфейс - например, VPN, WireGuard или другой туннель.
Маршрутизация всегда уводит трафик по адресу назначения: каждое правило, которое создаёт b4, сопоставляет адреса, собранные сетом из целей по IP и из адресов, в которые resolve-ятся его домены. Исходные устройства и исходные интерфейсы сужают, чей трафик попадёт в это правило, но сами по себе трафик не выбирают. Поэтому сет с включённой маршрутизацией и без доменов и IP-адресов не уводит ничего: b4 не создаёт для него правило и пишет об этом в лог.
Чтобы отправить весь трафик устройства, оставьте устройство выбранным в разделе Исходные устройства и включите Match any IP address на вкладке Цели, IP обхода.
Режим маршрутизации определяет, что происходит с совпавшим трафиком:
| Режим | Описание |
|---|---|
| Выходной интерфейс | Отправляет совпавший трафик через сетевой интерфейс. Описан ниже. |
| Вышестоящий прокси SOCKS5 | Передаёт совпавший трафик прокси SOCKS5. См. Вышестоящий прокси SOCKS5. |
| Блокировка | Отбрасывает или отклоняет совпавший трафик. См. Блокировка. |
Общая схема
Как это работает (подробно)
Маршрутизация использует policy-based routing - маршрутизацию на основе меток пакетов:
-
Сбор IP-адресов. Когда b4 видит DNS-ответ для домена из сета, он извлекает из него IP-адреса и добавляет их во внутренний IP-набор (nftables set или ipset). IP-адреса, указанные вручную в целях сета, добавляются при загрузке конфигурации.
-
Маркировка пакетов. b4 создаёт цепочки в firewall для каждого сета:
- PREROUTING (mangle) - маркирует транзитный трафик (от устройств в сети), если IP назначения есть в наборе. Если указаны исходные интерфейсы - маркирует только трафик с этих интерфейсов.
- OUTPUT (mangle) - маркирует трафик от самого роутера.
-
Policy routing. Для маркированных пакетов создаётся правило
ip rule: пакеты с определённымfwmarkнаправляются в отдельную таблицу маршрутизации, где default route указывает на выходной интерфейс. -
Masquerade. В цепочке POSTROUTING (nat) ко всему маркированному трафику, выходящему через целевой интерфейс, применяется masquerade - исходный IP пакета заменяется на IP выходного интерфейса. Это необходимо, чтобы ответные пакеты возвращались через тот же туннель.
-
Предварительное разрешение. При включении маршрутизации b4 сразу резолвит все домены из целей сета и добавляет полученные IP в набор. Это обеспечивает маршрутизацию с первого запроса, не дожидаясь DNS-трафика через NFQUEUE.
Настройка
- Включите Маршрутизацию
- Выберите Исходные интерфейсы - с каких интерфейсов перехватывать трафик
- Выберите Выходной интерфейс - куда направить трафик

После включения в верхней части раздела отображается диаграмма потока:
[Исходные интерфейсы] → B4 → [Выходной интерфейс] → Интернет
Диаграмма обновляется при изменении настроек.
Исходные интерфейсы
Определяют, с каких сетевых интерфейсов перехватывать трафик для маршрутизации. Отображаются как кнопки-бейджи - клик включает/выключает интерфейс.
Если ни один исходный интерфейс не выбран - маршрутизация применяется ко всему трафику, включая трафик от самого роутера. Если выбран исходный интерфейс или исходное устройство, сет ограничивается трафиком, пришедшим оттуда, а собственный трафик роутера остаётся на обычном маршруте: он не приходит ни с какого интерфейса и ни от какого устройства.
Если ранее выбранный интерфейс исчез из системы (например, VPN-подключение разорвалось), он отображается красным с пометкой «stale».
Выходной интерфейс
Сетевой интерфейс, через который будет отправлен маркированный трафик:
| Интерфейс | Описание |
|---|---|
wg0, wg1 | WireGuard-туннель |
tun0, tun1 | OpenVPN-туннель |
ppp0 | PPP-соединение |
Если выбранный выходной интерфейс перестал быть доступен, появится предупреждение. Маршрутизация не будет работать, пока интерфейс не появится снова.
Egress IP
Необязательный параметр. Подменяет адрес источника у трафика этого сета на выходе, вместо того чтобы оставлять собственный адрес выходного интерфейса. В терминах firewall это замена правила MASQUERADE на SNAT --to-source для этого сета.
Смысл в том, чтобы передать решение о маршруте устройству, которым b4 не управляет. Если туннели подняты на вышестоящем роутере, этот роутер уже умеет выбирать путь по адресу источника, и b4 достаточно проставить нужный источник. На хосте самого b4 не нужны ни интерфейс туннеля, ни отдельная таблица маршрутизации, а в отличие от вышестоящего SOCKS5-прокси подмена выполняется в ядре и не тратит CPU на каждый пакет.
Egress IP требует выходного интерфейса: правило привязывается к нему, чтобы при переключении на второй WAN пакеты не ушли в другой аплинк с адресом источника от первого.
Чтобы это заработало целиком:
- b4 сам добавляет адрес на выходной интерфейс и убирает его, когда сет перестаёт им пользоваться, так что вручную ничего добавлять не нужно и сохранять между перезагрузками тоже. Если интерфейс потерял адрес, например при обновлении аренды DHCP или подъёме линка, b4 это замечает и возвращает адрес на место. Прежде чем занять адрес, b4 отправляет ARP-пробу; если на него отвечает другой хост сегмента или адрес не удаётся добавить, b4 пишет предупреждение и возвращается к masquerade, вместо того чтобы сломать этот хост или отправлять трафик, на который никто не ответит. Адрес, настроенный вами вручную, используется как есть, и b4 удаляет только те адреса, которые добавил сам.
- Вышестоящее устройство должно маршрутизировать этот источник в нужный путь, например
ip rule add from 192.168.1.51 lookup 100в Linux или правилоmangleсsrc-addressиaction=mark-routingв RouterOS. - Вышестоящее устройство не должно отбрасывать пакеты на проверке обратного пути. Роутер со строгим
rp_filterи без маршрута обратно к машине с b4 для этого адреса отбросит их до того, как дойдёт до правил политики. Это самая частая причина, по которой внешне верная настройка не пропускает трафик.
Семейство адресов должно совпадать. IPv4-адрес подменяет только IPv4. Что при этом произойдёт с IPv6-трафиком сета, зависит от Поддержки IPv6 в Настройки → Основные:
- Поддержка IPv6 включена. IPv6-трафик сета по-прежнему уводится на выходной интерфейс, работает через masquerade и уходит с собственным IPv6-адресом интерфейса. У сета один egress IP, поэтому IPv6-адрес на его месте переносит подмену на IPv6, а IPv4 возвращается к masquerade.
- Поддержка IPv6 выключена. У сета вообще нет IPv6-правил. Его IPv6-трафик не маркируется, не уводится и не проходит masquerade: он идёт обычным маршрутом роутера, а для назначения с двойным стеком это значит, что сет обходится стороной, а не маршрутизируется с неверным адресом источника.
Egress IP, на который никто не отвечает, ломает трафик молча: пакеты уходят, ответы не возвращаются, а правила сета при этом выглядят корректно. Прежде чем искать проблему в сете, проверьте, что адрес есть на интерфейсе.
Недоступно в режиме движка TUN с захватом всего маршрута по умолчанию. Там b4 переотправляет пакеты по пути, который обходит это правило, и настройка не действует.
IP TTL (время жизни записи)
Определяет, сколько секунд IP-адрес, полученный из DNS-ответа, хранится в IP-наборе маршрутизации. По истечении TTL запись удаляется автоматически.
Значение по умолчанию: 3600 секунд (1 час).
IP-адреса, добавленные вручную в целях сета, также получают этот TTL и обновляются при каждой синхронизации конфигурации.
Для стабильных сервисов с постоянными 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. |
Выбор backend происходит автоматически. На системах с nftables используется nftables, на старых системах - iptables. Ручная настройка не требуется.
FWMark и таблица маршрутизации
Каждому выходному интерфейсу автоматически назначаются:
- fwmark - метка пакета (диапазон
0x100–0x7EFF) - routing table - номер таблицы маршрутизации (диапазон
100–2099)
Значения вычисляются на основе имени интерфейса и остаются стабильными между перезагрузками. Если несколько сетов используют один и тот же выходной интерфейс - они разделяют fwmark и таблицу.
Ручное указание fwmark и table доступно через конфигурационный файл. В этом случае автоматическое назначение не используется.
Очистка
При отключении маршрутизации или удалении сета b4 полностью удаляет все созданные правила:
- Удаляет
ip ruleи записи в таблице маршрутизации - Удаляет jump-правила из базовых цепочек
- Очищает и удаляет созданные цепочки и IP-наборы
При полной остановке b4 выполняется очистка обоих backend (nftables и iptables) для удаления возможных остаточных правил.
Вышестоящий прокси SOCKS5
Вместо отправки совпавшего трафика через интерфейс b4 может передать его прокси SOCKS5. Установите Режим маршрутизации в Вышестоящий прокси SOCKS5.
Так b4 включается в цепочку с Xray, sing-box или подобным клиентом - работающим как на самом роутере, так и на другом хосте в сети. Режим полезен и там, где блокировка построена по принципу белого списка и прямые соединения к адресам вне списка отбрасываются.
Как это работает
-
Сбор IP. Источники те же, что и в режиме интерфейса: DNS-ответы, которые видит b4, статические IP из целей сета и предварительное разрешение доменов сета. Кроме того, имя, совпавшее с сетом по суффиксу домена, разрешается целиком, поэтому все его адреса попадают в набор сразу, а не узнаются по одному соединению за раз.
-
Прозрачный слушатель. b4 открывает слушателя на порту, вычисленном из сета, и помечает сокет прозрачным, чтобы принимать соединения, адресованные другому узлу.
-
Перехват. Правила TPROXY в PREROUTING направляют TCP с адресом назначения из набора на этот слушатель вместе с
ip ruleи локальным маршрутом, чтобы пакет доставлялся локально, а не пересылался дальше. -
Ретрансляция. Для каждого принятого соединения b4 открывает SOCKS5 CONNECT к вышестоящему прокси и передаёт байты в обе стороны.
В режиме прокси манипуляции с пакетами (подделка, фрагментация, десинхронизация) для совпавшего трафика отключены. За доставку до назначения отвечает вышестоящий прокси.
Требования
Прозрачный перехват требует модулей ядра, которых нет в установке OpenWrt по умолчанию:
opkg install kmod-nft-tproxy kmod-nft-socket
На сборках с apk:
apk add kmod-nft-tproxy kmod-nft-socket
В системе с iptables соответствующие модули - kmod-ipt-tproxy и kmod-ipt-socket.
Настройки -> Диагностика показывает, доступен ли TPROXY, и называет недостающие модули вместе с пакетами, которые их содержат.
Настройки
| Настройка | Описание |
|---|---|
| Хост вышестоящего SOCKS5 | Имя хоста или IP прокси. Укажите 127.0.0.1, если он работает на том же роутере, или адрес другого хоста в сети. |
| Порт вышестоящего SOCKS5 | Порт, который слушает прокси. |
| Имя пользователя / Пароль | Заполняются только если прокси требует аутентификацию. |
| Передавать имя домена вышестоящему прокси | Передаёт домен вместо адреса, когда b4 его знает, чтобы прокси разрешил имя сам и выбрал подходящий по географии адрес. |
| Направлять UDP через вышестоящий прокси | Туннелирует совпавший UDP через прокси по UDP ASSOCIATE. См. QUIC и HTTP/3 ниже. |
| Откат на прямое соединение при отказе прокси | Открывает обычное прямое соединение к исходному адресу, когда прокси недоступен, вместо отказа. Оставьте выключенным, если прямое соединение хуже, чем никакого. |
QUIC и HTTP/3
Большинство прокси SOCKS5 передают только TCP. Xray и sing-box требуют явно включить UDP на входящем подключении.
При выключенной опции Направлять UDP через вышестоящий прокси b4 отклоняет совпавший UDP на порту 443 через ICMP port-unreachable. Браузеры читают это как сигнал откатиться на TCP, который прокси передаёт. Без этого любой сайт, объявляющий HTTP/3 заголовком alt-svc, открывался бы по QUIC напрямую, минуя прокси, а браузер запоминает такой выбор на весь срок жизни, указанный в заголовке.
Этот отказ пишется отдельно для каждого семейства адресов. IPv6-половина появляется, только когда включена Поддержка IPv6 в Настройки → Основные. При выключенной поддержке создаётся только IPv4-правило, поэтому совпавшее с сетом назначение, отвечающее ещё и по IPv6, по-прежнему доступно там по QUIC, и такое соединение через прокси не идёт.
При включённой опции совпавший UDP уходит к прокси через UDP ASSOCIATE. Включайте её, только если вышестоящий прокси это умеет. Если не умеет, совпавший UDP отбрасывается, а b4 пишет предупреждение с именем сета и адресом прокси.
Как проверить работу
Не судите по тому, отрисовалась ли веб-страница. Страница обычно подтягивает ресурсы с других имён и других адресов, поэтому страница, у которой основной документ маршрутизируется, а ресурсы нет, может выглядеть сломанной, хотя маршрутизация работает верно.
Запросите одну конечную точку:
curl -s https://ipinfo.io/ip
Затем посмотрите в журнале соединений нужную запись. Трафик, прошедший через прокси, помечен [proxy]:
TCP 192.168.1.37:20854 → 34.117.59.81:443 sni-set=ipinfo.io [proxy]
Если строки [proxy] нет, соединение не было перехвачено. Обычная причина - адрес, к которому оно шло, отсутствует в наборе.
Когда не отвечает сам upstream
Строка [proxy] говорит лишь о том, что соединение дошло до b4, но не о том, что прокси ответил. Если upstream отклоняет соединения или молча их отбрасывает, каждое перехваченное соединение принимается, удерживается всё время ожидания подключения и закрывается - из браузера это выглядит как зависший и так и не открывшийся сайт.
b4 сообщает об этом в журнале:
tproxy: set "TMDB" cannot reach its upstream 10.8.0.1:1080 (1 consecutive failures),
traffic matched by this set is not getting through: dial upstream: dial tcp 10.8.0.1:1080: i/o timeout
Пока upstream недоступен, сообщение повторяется не чаще раза в минуту, а когда он снова отвечает - в журнал попадает парная запись. То же состояние есть в Настройки → Диагностика в разделе upstreams, поэтому по диагностическому отчёту видно, был ли прокси доступен на момент его снятия:
{
"set_name": "TMDB",
"upstream": "10.8.0.1:1080",
"reachable": false,
"consecutive_failures": 12,
"last_error": "dial upstream: dial tcp 10.8.0.1:1080: i/o timeout"
}
Учтите, что это касается каждого адреса в сете и всех TCP-портов - включая адреса, выученные с общего CDN, на который разрешаются и посторонние сайты. Поэтому недоступный upstream способен сломать сайты, ради которых сет не создавался.
Если клиент разрешает имена через DNS-over-HTTPS или DNS-over-TLS, b4 не видит его DNS-запросов, и набор наполняется только предварительным разрешением и доменами из TLS-рукопожатий. Отключите шифрованный DNS на клиенте либо добавьте домены в сет, чтобы они разрешались заранее.