VPN-маршрутизация по доменам против IP-маршрутов: что подходит?
Имя хоста в поле раздельного туннеля — не маршрут. Сравните доменные правила и явные префиксы по обновлению, охвату поддоменов и тому, что происходит при изменении DNS.
IP-маршрут соответствует префиксу адреса, и ядро применяет его, не задавая лишних вопросов. Правило VPN на основе домена соответствует имени, а значит, что-то в стеке должно решать, какие адреса это имя означает сейчас, и поддерживать это решение актуальным. Это разные механизмы с разными режимами отказа, и поставщики используют одно и то же слово для обоих. Сравнивать их в списках функций — упускать суть; сравнивайте их по тому, что происходит, когда ответ меняется.
Полезное разделение — между правилом, которое разрешает, и правилом, которое не разрешает.
С чем на самом деле совпадает каждое правило
Правило префикса совпадает с адресами назначения в таблице маршрутизации. Ничего не разрешается, ничего не истекает, и совпадение точное для каждого пакета. Правило домена совпадает с запросом приложения об имени, которое RFC 1034 определяет как дерево меток, а не как адрес. Некоторые продукты разрешают имя один раз и устанавливают полученные адреса как маршруты, что превращает правило в IP-правило с прикреплённым таймером обновления.
Прежде чем отлаживать, выясните, какое из двух у вас, потому что отказ выглядит совершенно по-разному в каждом случае.
Где правило домена живёт в стеке
Если продукт реализует доменные правила через локальный прокси, трафик должен доходить до этого прокси, а приложения, игнорирующие системный прокси, полностью обходят правило. Если он реализует их разрешением имён и добавлением маршрутов, адреса свежи только до последнего обновления. Если он цепляется к резолверу, поведение DNS становится частью политики маршрутизации, и резервный резолвер может тихо это отменить.
Читайте модель поставщика, а не ярлык настройки. Два клиента с полем под названием Split Tunnel могут делать три разные вещи.
Сравните, что ломается
Три вещи ломаются по-разному. Смена адресов: имя хоста CDN может разрешиться в другой набор адресов за считаные минуты, поэтому скопированный список быстро устаревает. Охват поддоменов: правило для example.com может покрывать api.example.com, а может и нет, и документация обычно прямо говорит, какой случай. Сбой разрешения: когда резолвер отказывает, разрешающий клиент может перейти к туннелированию трафика или к его прямой отправке.
Только второе — вопрос конфигурации. Остальные два — вопросы проектирования о том, сколько продукт готов угадывать.
| Behaviour | Prefix rule | Domain rule |
|---|---|---|
| Match basis | destination address | requested name or resolved addresses |
| Staleness | none | depends on refresh policy |
| Subdomain scope | not applicable | product-defined |
| Resolver outage | unaffected | product-defined fallback |
| Where to debug | routing table | client log plus resolver state |
Когда префикс — лучший ответ
Для стабильной частной подсети явный префикс понятнее, быстрее и проще для аудита. Он также переживает отказ резолвера, потому что ничего не нужно разрешать. Прибегайте к доменному правилу, когда сервис размещён на хостинге, когда адреса вращаются или когда вы действительно не можете перечислить набор назначений. Не прибегайте к нему только потому, что имя хоста — это то, что вы случайно знаете.
Угаданный статический список — худшее из обоих: он выглядит поддерживаемым и тихо пропускает трафик в тот день, когда провайдер добавляет хост.
Проверьте свежим запросом
Протестируйте холодным запросом после обычного переподключения, потому что страница из кеша может никогда не затронуть правило. Разрешите имя, затем проверьте, куда на самом деле ушло соединение. dig +short app.example.com даёт текущий набор адресов, а список соединений клиента говорит, какой интерфейс нёс поток.
Повторите после интервала обновления, который документирует продукт. Если набор адресов смещается, а правило за ним не следует, вы нашли реальное поведение.
Держите политику резолвера отдельно. Доменному правилу нужны корректные данные об именах, но само по себе оно не решает, какой резолвер отвечает на запрос.