VPN только для выбранных сайтов и устройств в OpenWrt: раздельная маршрутизация трафика

Настройка раздельной маршрутизации в OpenWrt: как направить трафик только выбранных устройств или доменов через VPN, оставив остальной интернет напрямую. Три способа: ip rule, vpn-policy-routing и dnsmasq с ipset.
Представь ситуацию: у тебя дома роутер на OpenWrt, к нему подключены десятки устройств — от умных розеток до игровых приставок. Весь трафик идёт через одного провайдера, и вдруг тебе понадобилось, чтобы только часть трафика уходила через VPN. Например, для работы с зарубежными сервисами, которые без VPN недоступны, или для тестирования собственных проектов.
Включать VPN на всех устройствах сразу — плохая идея. Умный дом начнёт терять связь с облаком, локальные сервисы перестанут отвечать, а скорость упадёт. Да и зачем гнать трафик умной лампочки через зашифрованный туннель?
Решение — раздельная маршрутизация трафика на уровне роутера. OpenWrt позволяет настроить политики так, что только выбранные устройства или домены будут уходить в VPN, а остальной трафик пойдёт обычным путём. Сегодня разберём, как это сделать правильно.
Что такое раздельная маршрутизация и зачем она нужна
Раздельная маршрутизация (split tunneling) — это механизм, при котором часть трафика направляется через VPN-туннель, а остальная — напрямую через основного провайдера. На роутере с OpenWrt это реализуется через таблицы маршрутизации, правила policy routing и файрвол.
Основные сценарии использования:
- Выборочный доступ по устройствам — например, только телевизор и приставка ходят через VPN для доступа к зарубежным стриминговым сервисам.
- Выборочный доступ по доменам — определённые сайты или API уходят в туннель, остальное — напрямую.
- Разделение по типам трафика — игровой трафик минимальной задержкой идёт напрямую, а загрузки — через VPN.
OpenWrt даёт гибкие инструменты для такой настройки. Мы рассмотрим два подхода: через стандартные средства (ip rule, ip route) и через пакет vpn-policy-routing, который сильно упрощает жизнь.
Подготовка: что понадобится
Для настройки нам нужны:
- Роутер с установленным OpenWrt (подойдут любые поддерживаемые модели — от NanoPi R2S до Routerich AX3000). Если у тебя Routerich, можешь заодно посмотреть общую настройку роутера на OpenWrt.
- Настроенный VPN-клиент. В OpenWrt чаще всего используют WireGuard или OpenVPN. В этой статье будем считать, что VPN уже поднят и работает — у нас есть интерфейс
wg0илиtun0. - Доступ к роутеру по SSH или через LuCI.
Проверим, что VPN-интерфейс активен:
ip addr show wg0
Если интерфейс есть и у него назначен адрес — отлично, можно двигаться дальше.
Базовая схема: как OpenWrt принимает решения о маршрутизации
Прежде чем настраивать, важно понять, как OpenWrt обрабатывает трафик. По умолчанию весь трафик от LAN-устройств попадает в цепочку forwarding и уходит через default route — то есть через WAN. Если мы поднимем VPN и добавим маршрут по умолчанию через wg0, весь трафик уйдёт в туннель. Нам это не нужно.
Вместо этого мы создадим отдельную таблицу маршрутизации, в которую поместим маршрут через VPN, и будем направлять в неё трафик по правилам ip rule.
Схема такая:
- Создаём таблицу маршрутизации, например, номер 100.
- Добавляем в неё маршрут по умолчанию через VPN-интерфейс.
- Создаём правила
ip rule, которые отправляют трафик от нужных устройств или к нужным сетям в эту таблицу. - Настраиваем NAT для VPN-интерфейса, чтобы ответы возвращались корректно.
Способ 1: Ручная настройка через ip rule и ip route
Этот способ подходит тем, кто хочет понять механику процесса и не боится командной строки. Все настройки можно сделать через SSH.
Шаг 1. Создаём таблицу маршрутизации
Откроем файл /etc/iproute2/rt_tables и добавим строку:
echo "100 vpn_table" >> /etc/iproute2/rt_tables
Теперь мы можем обращаться к таблице по имени vpn_table.
Шаг 2. Добавляем маршрут через VPN
ip route add default dev wg0 table vpn_table
Если используешь OpenVPN, замени wg0 на tun0.
Шаг 3. Добавляем правило для устройств
Допустим, мы хотим отправлять через VPN трафик от устройства с IP-адресом 192.168.1.100:
ip rule add from 192.168.1.100 lookup vpn_table priority 1000
Проверить правило можно так:
ip rule show
Шаг 4. Настраиваем NAT
Чтобы устройства, ушедшие в VPN, могли получать ответы, нужно настроить маскарадинг на VPN-интерфейсе. Добавим правило в файрвол:
iptables -t nat -A POSTROUTING -o wg0 -j MASQUERADE
Шаг 5. Сохраняем настройки
Проблема ручного способа в том, что после перезагрузки всё слетит. Чтобы этого избежать, нужно добавить команды в скрипты инициализации. В OpenWrt для этого есть /etc/firewall.user и /etc/rc.local.
Добавим в /etc/firewall.user:
iptables -t nat -A POSTROUTING -o wg0 -j MASQUERADE
А в /etc/rc.local перед exit 0:
ip route add default dev wg0 table vpn_table
ip rule add from 192.168.1.100 lookup vpn_table priority 1000
Проверка
Чтобы убедиться, что трафик от нужного устройства уходит в VPN, выполни на этом устройстве:
curl --interface eth0 ifconfig.me
Или просто зайди на сайт определения IP. Если IP совпадает с адресом VPN-сервера — всё работает.
Способ 2: Пакет vpn-policy-routing — удобная настройка через UCI
Ручной способ хорош для понимания, но когда устройств много, а доменов ещё больше, хочется автоматизации. Пакет vpn-policy-routing предоставляет удобный интерфейс через UCI и LuCI.
Установка
opkg update
opkg install vpn-policy-routing
После установки в LuCI появится раздел Network → VPN Policy Routing.
Настройка через UCI
Конфигурация хранится в /etc/config/vpn-policy-routing. Основные параметры:
uci set vpn-policy-routing.config.enabled='1'
uci set vpn-policy-routing.config.verbosity='1'
uci commit vpn-policy-routing
Теперь добавим политику для устройства:
uci add vpn-policy-routing policy
uci set vpn-policy-routing.@policy[-1].name='tv_vpn'
uci set vpn-policy-routing.@policy[-1].src_addr='192.168.1.100'
uci set vpn-policy-routing.@policy[-1].interface='wg0'
uci commit vpn-policy-routing
Перезапустим сервис:
/etc/init.d/vpn-policy-routing restart
Политики по доменам
vpn-policy-routing умеет работать с доменами через dnsmasq и ipset. Для этого нужно:
- Установить
ipset:
opkg install ipset
- Создать список доменов в конфигурации:
uci add vpn-policy-routing policy
uci set vpn-policy-routing.@policy[-1].name='domains_vpn'
uci set vpn-policy-routing.@policy[-1].domain='example.com'
uci set vpn-policy-routing.@policy[-1].interface='wg0'
uci commit vpn-policy-routing
Можно указать несколько доменов через пробел или добавить несколько записей domain.
Типичные ошибки
- Не работает после перезагрузки — проверь, что сервис
vpn-policy-routingвключён в автозагрузку:/etc/init.d/vpn-policy-routing enable. - Трафик не уходит в VPN — убедись, что в политике правильно указан интерфейс. Для WireGuard это
wg0, для OpenVPN —tun0. - Конфликт с файрволом — иногда правила файрвола блокируют forwarded-трафик. Проверь, что в зоне LAN разрешён forwarding в зону VPN.
Способ 3: Маршрутизация по доменам через dnsmasq и ipset
Если нужно отправлять в VPN только трафик к определённым доменам, можно использовать связку dnsmasq + ipset. Этот подход удобен, когда список доменов большой и постоянно меняется.
Настройка dnsmasq
Добавим в /etc/config/dhcp:
uci add_list dhcp.@dnsmasq[0].ipset='/example.com/vpn_table'
uci commit dhcp
Перезапустим dnsmasq:
/etc/init.d/dnsmasq restart
Теперь при запросе к example.com dnsmasq добавит IP-адрес в ipset vpn_table.
Правило маршрутизации
Добавим правило, которое направляет трафик к адресам из ipset в VPN-таблицу:
ip rule add from all fwmark 0x100 lookup vpn_table
Но чтобы это работало, нужно пометить пакеты через iptables:
iptables -t mangle -A PREROUTING -m set --match-set vpn_table dst -j MARK --set-mark 0x100
Автоматизация
Чтобы не вводить команды вручную после каждой перезагрузки, добавь их в /etc/firewall.user:
iptables -t mangle -A PREROUTING -m set --match-set vpn_table dst -j MARK --set-mark 0x100
А правило ip rule — в /etc/rc.local.
Настройка NAT и файрвола для VPN-интерфейса
Чтобы устройства в локальной сети могли ходить через VPN, нужно создать зону в файрволе. В LuCI: Network → Firewall → Zone Settings.
Добавим зону vpn:
- Interface:
wg0(илиtun0) - Allow forward to destination zones:
lan - Allow forward from source zones:
lan - Masquerading: включено
В конфиге это выглядит так:
uci add firewall zone
uci set firewall.@zone[-1].name='vpn'
uci set firewall.@zone[-1].network='wg0'
uci set firewall.@zone[-1].input='ACCEPT'
uci set firewall.@zone[-1].output='ACCEPT'
uci set firewall.@zone[-1].forward='ACCEPT'
uci set firewall.@zone[-1].masq='1'
uci commit firewall
Перезапустим файрвол:
/etc/init.d/firewall restart
Проверка результата
После настройки важно убедиться, что всё работает корректно. Вот несколько проверок:
Проверка маршрутов
ip route show table vpn_table
Должен быть маршрут по умолчанию через VPN-интерфейс.
Проверка правил
ip rule show
Убедись, что правило для нужного устройства или метки присутствует.
Проверка с устройства
Зайди с устройства, которое должно ходить через VPN, на сайт определения IP. Если адрес совпадает с VPN-сервером — всё ок.
Проверка с обычного устройства
Убедись, что остальные устройства ходят в интернет напрямую, без VPN.
Просмотр логов
Если что-то не работает, смотри логи:
logread | grep vpn-policy-routing
Типичные проблемы и их решение
Весь трафик уходит в VPN, хотя нужно только часть
Проверь, нет ли в таблице main маршрута по умолчанию через VPN. Если есть — удали его:
ip route del default dev wg0
Устройства в LAN не могут выйти в интернет через VPN
Убедись, что в зоне vpn файрвола включён masquerading. Без него ответы от VPN-сервера не вернутся к устройствам.
DNS-запросы уходят напрямую, а не через VPN
Если нужно, чтобы DNS тоже шёл через VPN, настрой соответствующий upstream в dnsmasq или укажи DNS-серверы VPN в интерфейсе wg0.
Не работает ipset
Проверь, что пакет ipset установлен, а в dnsmasq включена поддержка ipset. В LuCI: Network → DHCP and DNS → Advanced Settings — опция "IPset support".
Когда раздельная маршрутизация не нужна
Иногда проще не городить сложные схемы, а использовать VPN на конкретном устройстве. Например, если тебе нужно ходить через VPN только с ноутбука — установи WireGuard или OpenVPN прямо на него. Роутерная маршрутизация имеет смысл, когда:
- Устройств несколько, и они не поддерживают VPN-клиенты (телевизоры, приставки, IoT-гаджеты).
- Нужно централизованно управлять политиками.
- Хочется скрыть факт использования VPN от провайдера на уровне всей сети.
Кстати, если ты используешь Home Assistant и хочешь, чтобы часть его интеграций ходила через VPN, раздельная маршрутизация на роутере — самый надёжный способ. Интеграции вроде Xiaomi Miot Auto иногда требуют доступа к облаку, которое может быть недоступно напрямую.
Полезные советы
- Делай бэкап конфигов перед изменениями. В OpenWrt это делается через System → Backup/Flash Firmware.
- Используй LuCI, если не уверен в командной строке. Пакет
vpn-policy-routingимеет удобный веб-интерфейс. - Тестируй на одном устройстве перед тем, как применять политики ко всей сети.
- Следи за версией OpenWrt — в новых версиях синтаксис некоторых команд мог измениться.
Заключение
Раздельная маршрутизация в OpenWrt — мощный инструмент, который позволяет гибко управлять трафиком в домашней сети. Ты можешь отправлять в VPN только нужные устройства или домены, оставляя остальной трафик напрямую. Это экономит ресурсы роутера, снижает задержки и не ломает работу умного дома.
Мы рассмотрели три подхода: ручную настройку через ip rule, использование пакета vpn-policy-routing и маршрутизацию по доменам через dnsmasq и ipset. Каждый из них имеет свои плюсы и минусы, но для большинства сценариев оптимальным будет vpn-policy-routing — он проще в управлении и поддержке.
Если ты используешь роутер Routerich AX3000, обрати внимание на статью про ZeroBlock для OpenWrt — там описаны похожие механизмы в контексте этого железа. А если хочешь глубже разобраться в том, как работают VPN-туннели, почитай про VLESS как туннель между проектами.
Настройка раздельной маршрутизации требует внимательности, но результат того стоит: ты получаешь полный контроль над тем, какой трафик куда идёт, и можешь адаптировать сеть под любые задачи.
Понравилась статья?
Поставьте лайк и сохраните полезный материал в закладки.
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
Routerich AX3000: настройка роутера на OpenWrt, Mesh, TorrServer и сетевое хранилище
ZeroBlock для OpenWrt: настройка VPN и маршрутизации на Routerich
Nginx Proxy Manager: установка и первоначальная настройка reverse proxy с HTTPS в Docker
Как выбрать LTE/5G-модем для Routerich AX3000: от простого E3372 до T77W968, T99W175 и FM350
Pi-hole + Unbound: Ваш приватный DNS-сервер с блокировкой рекламы
MQTT брокер Mosquitto: основа умного дома своими руками