В общем случае средствами лишь маршрутизации — никак. Это технически возможно, но никто этого еще не сделал (и я расстраиваюсь этому факту не первый год!).
Выходов несколько:
1. Добавлять IP-адреса доменов в момент резолва в лист маршрутизации VPN
Необходимо настроить DNS-сервер так, чтобы в момент запроса поддомена необходимых доменов (например,
*.instagram.com
) полученные IP-адреса добавлялись в список маршрутизации через VPN.
Это можно сделать, например, с помощью dnsmasq
ipset
.
Необходимо настроить маршрутизацию по списку ipset, а dnsmasq будет добавлять новые адреса, которые запрашивает пользователь, в этот список.
Недостаток способа заключается в необходимости использовать только DNS на роутере (DNS-over-HTTPS или любой сторонний резолвер не подойдёт — IP-адреса не будут добавляться в ipset и маршрутизации в VPN не будет), а также в том, что
любой добавленный
IP-адрес будет маршрутизирован в VPN: если два домена используют один и тот же IP-адрес, разделить их маршрутизацию не получится, оба будут маршрутизироваться через VPN.
В OpenWrt настраивается с помощью пакета
pbr
. Он не поддерживает регулярные выражения, как вы заметили, но они и не нужны: просто напишите любой домен, и словно это зона, все поддомены домена будут маршрутизированы в VPN. По-моему, pbr даже по-другому и не работает (нельзя маршрутизировать конкретный домен без его поддоменов).
Пример с доменами Netflix. Обнаружить все домены Instagram можно с помощью F12 - Network в браузере.
2. Обнаруживать домены в трафике, перемаршрутизировать через список маршрутизации VPN позже
Вариация первого метода с модулями вроде
xt_tls, позволяющим обнаружить обращение к определённому домену из TLS-трафика, чтобы также добавить IP-адрес в ipset для маршрутизации в VPN.
Преимущество в том, что клиент может использовать любой DNS-сервер. Недостаток в том, что первый раз соединение всегда либо зависнет, либо разорвётся, и только второе и последующие заработают через VPN.
Вот здесь можно почитать, почему так происходит.
В OpenWrt модуль отсутствует.
3. Терминировать трафик на «умный» прокси-сервер, который поддерживает маршрутизацию по доменам
Весь TCP/UDP-трафик перенаправляется на локальный прокси-сервер, способный выявлять домены прямо из трафика и маршрутизировать их в зависимости от правил. Примеры подобных прокси: v2fly, xray, sing-box, и др. (все есть в OpenWrt).
Недостаток метода в том, что весь трафик будет обрабатываться userspace-программой: на низкопроизводительных роутерах это может привести к серьезному замедлению, некоторые VoIP-программы не будут звонить (из-за несовпадения UDP-порта, который создала программа, и UDP-порта, который использует прокси), и поддерживаются только UDP и TCP, другие протоколы (ICMP, GRE, IPIP, что угодно) через такой прокси работать не будут.
Преимущество в лёгкой настройке и довольно стабильной работе.
Алгоритм определения доменов, необходимых для маршрутизации, не отличается от описанного в #1.