В этой статье я покажу как можно настроить Split DNS в MacOS, и как изменить конфигурацию Tunnelblick, чтобы автоматически включать Split DNS при подключении к OpenVPN серверу.
Split DNS — это возможность отправлять DNS запросы для определенной зоны на определенные DNS серверы.
👉 Пример использования, с которым столкнулся я #
Есть OpenVPN сервер и есть DNS серверы во внутреннем сетевом контуре, которые обслуживают две доменные зоны foobar.com
и .bar
.
Зона foobar.com
обслуживается как внутренними DNS-серверами, так и внешними (Cloudflare). Это сделано, чтобы иметь “внутри” приватные DNS записи, но с “реальными” доменными именами.
Мы хотим при подключении VPN начинать использовать внутренние DNS, а при отключении возвращаться обратно. Но мы не хотим при подключенном VPN отправлять все DNS запросы на внутренние серверы.
❗ Изменение настроек OpenVPN сервера #
Так как мы будем управлять «раздачей» DNS серверов с помощью Tunnelblick, то нам нужно убрать (убедиться, что этого нет) push DNS серверов из конфигурации OpenVPN сервера.
За это отвечают следующие инструкции в конфигурации, проверяем, что их нет:
root@server01.bar /home/admin # cat /etc/openvpn/openvpn.conf | grep dhcp
push "dhcp-option DNS 35.36.37.0"
push "dhcp-option DNS 35.36.37.1"
push "dhcp-option DOMAIN bar"
🌐 Настройка resolvers в MacOS #
Введя команду scutil --dns
мы можем увидеть список текущих резолверов:
❯ scutil --dns
resolver #1
nameserver[0] : 192.168.31.1
if_index : 8 (en0)
flags : Request A records
reach : 0x00020002 (Reachable,Directly Reachable Address)
...
Это основной текущий резолвер, которой отправляет все DNS запросы на один DNS сервер (мой маршрутизатор).
Мы можем насоздавать своих резолверов путем создания файла /etc/resolver/foobar.com
, с точным именем доменной зоны и адресами DNS серверов внутри:
❯ cat /etc/resolver/foobar.com
nameserver 35.36.37.0
nameserver 35.36.37.1
Снова проверяем резолверы. Теперь все DNS запросы для этой зоны пойдут на внутренние серверы, а остальные — как и было раньше через основной резолвер:
❯ scutil --dns
...
resolver #8
domain : foobar.com
nameserver[0] : 35.36.37.0
nameserver[1] : 35.36.37.1
flags : Request A records
reach : 0x00000002 (Reachable)
🌀 Настройка Tunnelblick #
Чтобы добавлять резолверы автоматически при подключении VPN и удалять при отключении, нам нужно добавить скрипты в конфигурацию Tunnelblick.
🔹 Создаем отдельную директорию mkdir vpn
, а в ней файл скрипта, который будет запускаться при подключении VPN
nano connected.sh
#!/bin/bash -e
mkdir -p /etc/resolver
cat <<EOF > /etc/resolver/foobar.com
nameserver 35.36.37.0
nameserver 35.36.37.1
EOF
cat <<EOF > /etc/resolver/bar
nameserver 35.36.37.0
nameserver 35.36.37.1
EOF
🔹 Создаем скрипт, который будет запускаться при отключении VPN nano post-disconnect.sh
:
#!/bin/bash -e
rm /etc/resolver/foobar.com
rm /etc/resolver/bar
Эти скрипты будут запускаться от пользователя root, если не указано обратное в конфигурации. Документация по скриптам есть на оф. сайте.
🔹 Добавляем в директорию файл с .ovpn
конфигурацией. Предполагается, что мы ее уже имеем.
🔹 Делаем скрипты исполняемыми:
chmod +x connected.sh post-disconnect.sh
🔹 Переименовываем, а точнее добавляем к названию директории расширение .tblk
. У нас получается файл vpn.tblk
, на который можно нажать правым кликом и посмотреть содержимое Show Package Contents.
🔹 Перетаскиваем файл vpn.tblk
мышкой на иконку Tunnelblick в Menu Bar (наверху). Таким образом мы добавляем новую конфигурацию в Tunnelblick. Разработчики обращают внимание именно на этот способ — им виднее.
🔹 Подтверждаем несколько раз, что готовы к вероятности наличия
fork-бомбы или rm -rf
в скриптах, и пробуем подключиться. После успешного подключения проверяем наличие новых резолверов, а так же успешные ping до внутренних DNS.
Важно: проверка DNS записи через
dig
выдаст ошибку NXDOMAIN, потому чтоdig
использует другой механизм резолва адресов.
🙌 Дополнительно #
Обычно я в настройках Tunnelblick-а дополнительно включаю перезапуск сетевых интерфейсов, для большей стабильности работы интернета при засыпании ноутбука и отключениях VPN:
На этом всё 🤝 Если тебе понравилась статья, рекомендую подписаться на телеграм-канал, где анонсятся все новые статьи, а так же выходят интересные посты. Ссылка ниже: