Приватные имена VPN не работают? Подозреваемый — защита от ребиндинга DNS
Резолвер, отвергающий ответы из приватного пространства, ломает внутренние имена, а не туннель. Прочитайте ответ, сузьте исключение, защиту оставьте в других местах.
В офисной локальной сети внутреннее имя отвечает мгновенно. В момент включения VPN оно перестаёт работать, приложение сообщает о тайм-ауте, а сам туннель без жалоб пропускает трафик. Изменился резолвер, и у этого резолвера есть собственное мнение о приватных адресах.
Защита от ребиндинга существует, чтобы остановить один конкретный трюк. Намеренно опубликованное приватное имя выглядит достаточно похоже, чтобы защита сработала.
Сначала прочитайте ответ, потом политику
Запросите имя у того резолвера, который VPN действительно раздаёт, а не у того, который ваш ноутбук использует дома. Сравните ответ с ожидаемой записью и отметьте, пуст ли он, отклонён или полон публичных адресов, которых никто не планировал.
Симптомы пересекаются, поэтому диагноз определяет форма ответа. NXDOMAIN — отсутствующая запись, REFUSED — правило доступа, публичный адрес для внутреннего имени — ошибка политики или split-DNS, а правильный приватный адрес, который клиент не может использовать, — совсем другая проблема. Отклонённое соединение или зависший запрос сам по себе ничего не доказывает, поэтому первой командой в таких заявках должен быть запрос, а не перезапуск. Запишите ответ, прежде чем что-то менять.
Что защита на самом деле останавливает
Ребиндинг DNS работает, меняя то, во что разрешается имя, после того как клиент уже ему доверился. Страница загружается с имени, контролируемого атакующим, ответ переключается на приватный адрес, и браузер обманом заставляют говорить с чем-то в локальной сети, с чем он никогда не принял бы прямое соединение. Защита состоит в том, чтобы отвергать ответы, указывающие в приватное пространство, когда резолвер никогда не просили обслуживать приватное пространство имён. Эта асимметрия и есть вся атака.
dnsmasq документирует именно такое поведение вместе с исключениями для доменов. В своём руководстве он описывает rebind-domain-ok как способ назвать домены, которые могут законно возвращать такие адреса. Читайте это как сигнал, что задуманное исправление — ограниченное разрешение, а не глобальный переключатель.
Ограничьте исключение пространством имён
Сначала исправьте пространство имён, потом исключение. Убедитесь, что сбойное имя принадлежит домену, которым управляет организация, и что запись поддерживается намеренно. Неожиданный адрес, лишь похожий на знакомый диапазон локальной сети, заслуживает подозрения, а не исключения, поэтому проверьте владельца зоны, прежде чем писать любое разрешение.
# ask the resolver the VPN pushed, and show the full answer
dig +noall +answer db.corp.example @10.40.0.1
dig +short db.corp.example @10.40.0.1
# dnsmasq: what does the running configuration already allow?
grep -R 'rebind' /etc/dnsmasq.d /etc/dnsmasq.conf
Затем добавьте самое узкое разрешение, охватывающее нужные имена: один домен или один делегированный поддомен, в конфигурации резолвера, который опрашивают клиенты VPN. Отключение защиты для всех имён на этом резолвере лишает обороны всех сразу, включая имена, которым она никогда не требовалась.
Split DNS входит в то же решение. Если приватное пространство имён должно отвечать только на внутреннем резолвере, опубликуйте его там и перестаньте утекать его в публичные резолверы, чтобы исключение покрывало один путь, а не каждый путь.
Повторно проверьте ресурс и защиту
Запросите снова, затем подключитесь к сервису и проверьте, что видит клиент. Правильный приватный ответ с работающей сессией означает, что исключение применилось. Правильный ответ с зависшей сессией означает, что следующий подозреваемый — маршрут или идентичность сервиса.
# the internal name and the public control should behave differently
dig +short db.corp.example @10.40.0.1
dig +short www.example.com @10.40.0.1
# and the service itself, with the certificate it presents
curl -sS -o /dev/null -w '%{http_code}\n' https://db.corp.example/health
Проверьте также публичное имя через тот же резолвер. Защита должна по-прежнему вести себя правильно для имён вне исключения, и если эта проверка не удалась, изменение оказалось шире задуманного. Не трогайте проверку сертификатов на всём протяжении, потому что имя, которое разрешается правильно, всё равно должно совпадать с сертификатом, который представляет сервис.
Запишите в заявке отклонённый ответ, домен, резолвер и того, кто владеет политикой. Именно эта запись превращает загадочный внутренний сбой в изменение конфигурации, которое кто-то может проверить.