Перейти к основному содержимому

Split DNS в MacOS, OpenVPN и Tunnelblick

·592 слов·3 минут
гайды софт
Юрий Семеньков
Автор
Юрий Семеньков
DevOps, tech, geek, mentor
Оглавление

В этой статье я покажу как можно настроить 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:

На этом всё 🤝 Если тебе понравилась статья, рекомендую подписаться на телеграм-канал, где анонсятся все новые статьи, а так же выходят интересные посты. Ссылка ниже:

@etogeek

Related

Outline — VPN на своем сервере за 5 минут
·633 слов·3 минут
гайды софт
Перенос git репозитория
·135 слов·1 минута
софт гайды
Как практиковаться начинающему DevOps-инженеру
·825 слов·4 минут
работа гайды