openvpn и dnsmasq
Oct. 11th, 2024 04:41 pmУ наших конторских сисадминов есть привычка некоторым сайтам в локальной сети офиса давать имена в домене второго уровня, том же, который используется и для внешних сайтов. И использовать механизм view в bind для того чтобы эти имена резолвились в адреса только внури офиса+vpn
Пои этом, естественно, точка входа vpn - в том же домене второго уровня.
Возникает проблема, заключающаяся в том, что когда у меня поднят конторский vpn, адреса в конторском домене должны резолвиться, через dns-серверы, доступные только через vpn, а когда не поднят - через дефолтные сервера.
Это не было бы проблемой, если бы в тот момент когда у меня поднят конторский vpn, мне не нужны были бы никакие сайты кроме конторских и сайтов публичного интернета, которые конторским DNS прекрасно резолвятся.
Но у меня есть локальная сеть дома, у меня есть куча виртуалок на любой из машин, на которых я работаю, у меня есть семейная VPN.
Поэтому нужно сделать так чтобы через конторские DNS-сервера резолвились только конторские домены, а все остальные - через дефолтные.
Очевидное решение - в скрипте который up в openvpn написать несколько параметров конфигурации dnsmasq и его передернуть. А в скрипте down - эти параметры затереть. Чтобы при следующей попытке запуска openvpn, она бы разрезолвила адреса конторских точек входа через публичные dns. Менее очевидное решение - добавлять убавлять сервера на лету через DBUS я пока не осилил. Функции для добавления серверов я в DBUS API dnsmasq вижу, а для удаления нет. Поэтому я лучше через файлы.
Правда, выясняется что systemd запускает openvpn с большими ограничениями по части доступа в файловую систему (и правильно делает). Поэтому писать приходится в /run/openvpn. И чтобы dnsmasq это прочитал, добавить ему в конфиг (в dnsmasq.d он это кушать отказался) строчку
servers-file=/run/openvpn/pgpro.dns
соответственно скрипт up выглядит так:
# !/bin/sh
DOMAIN=postgrespro.ru
env |sed -n "s!foreign_option_[0-9]=dhcp-option DNS !/$DOMAIN/!p" > /run/openvpn/pgpro.dns
systemctl restart dnsmasq
exit 0
А скрипт down как
# !/bin/sh
echo > /run/openvpn/pgpro.dns
systemctl restart dnsmasq
exit 0
Возможно надо еще будет в /etc/tmpfiles.d добавить создание пустого файлика при старте системы. Чтобы dnsmasq не пугался если вдруг его не обнаружится.