В офисной локальной сети внутреннее имя отвечает мгновенно. В момент включения 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

Проверьте также публичное имя через тот же резолвер. Защита должна по-прежнему вести себя правильно для имён вне исключения, и если эта проверка не удалась, изменение оказалось шире задуманного. Не трогайте проверку сертификатов на всём протяжении, потому что имя, которое разрешается правильно, всё равно должно совпадать с сертификатом, который представляет сервис.

Запишите в заявке отклонённый ответ, домен, резолвер и того, кто владеет политикой. Именно эта запись превращает загадочный внутренний сбой в изменение конфигурации, которое кто-то может проверить.

Похожие статьи