Назад | Перейти на главную страницу

Настройка автоматического DNS-сервера на сервере OpenVPN

У меня есть несколько удаленных сетей, к которым я хочу получить доступ через VPN. Топология каждой сети - это просто NAT-маршрутизатор и машина, на которой запущен SSH-сервер. Маршрутизатор имеет перенаправленный порт SSH, поэтому все, что нужно, - это иметь доступ к IP-адресу маршрутизатора. Я настроил сервер OpenVPN и настроил маршрутизаторы в каждой удаленной сети для доступа к нему. Клиентский ПК также настроен для доступа к VPN, а сервер настроен таким образом, чтобы он мог получать доступ к различным маршрутизаторам, используя их IP-адреса VPN.

Топология:

Все это отлично работает, за исключением того, что IP-адреса VPN-маршрутизаторов неизвестны клиенту. В настоящее время я должен посмотреть журнал статуса OpenVPN, а затем использовать этот IP-адрес. Я бы предпочел не использовать статические IP-адреса, так как количество удаленных сетей будет расти.

Итак, мой вопрос: можно ли запустить локальный DNS-сервер на VPN-сервере и автоматически ли он обновляться для подключающихся клиентов?

Я видел несколько статей об обновлении resolv.conf на VPN-сервере, а также о передаче данных DNS клиентам, но я не уверен в том, что отсутствует часть фактического запуска и обновления DNS-сервера.

Конфигурация сервера:

port 1194
proto udp
dev tun
ca ca.crt
cert cert.crt
key key.key  # This file should be kept secret
dh dh2048.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
client-to-client
keepalive 10 120
cipher AES-256-CBC
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
status openvpn-status.log
verb 3

Для других, ищущих решение подобной проблемы, я решил ее вот так.

Я добавил / раскомментировал следующие настройки сервера OpenVPN (/etc/openvpn/server.conf) в пример конфигурации, чтобы сообщить клиентам использовать свой DNS-сервер и разрешить клиентам общаться друг с другом:

topology subnet
push "dhcp-option DOMAIN myvpn.example.com"
push "dhcp-option DNS 10.8.0.1"
client-to-client

Затем я настроил dnsmasq (/etc/dnsmasq.conf) следующим образом, который прослушивает VPN-соединение и использует дополнительный файл hosts, который мы будем обновлять:

domain-needed
bogus-priv
local-service

listen-address=127.0.0.1
listen-address=10.8.0.1

local=/myvpn.example.com/
addn-hosts=/etc/hosts.openvpn

Наконец, следующий скрипт Python (помещенный в / usr / local / sbin / update-openvpn-hosts) использует openvpn-статус библиотека для обновления файла дополнительных хостов и перезагрузки конфигурации dnsmasq. Это вызывается каждую минуту из задания cron в / etc / crontab (* * * * * root /usr/local/sbin/update-openvpn-hosts).

#!/usr/bin/env python3

"""Create hosts file from OpenVPN client list."""

import subprocess

import openvpn_status

with open('/etc/openvpn/openvpn-status.log') as logfile:
    status = openvpn_status.parse_status(logfile.read())

with open('/etc/hosts.openvpn', 'w') as hostsfile:
    for routing in status.routing_table.values():
        line = '{0} {1} {1}.myvpn.example.com\n'.format(routing.virtual_address, routing.common_name)
        hostsfile.write(line)

subprocess.run(['systemctl', 'reload', 'dnsmasq'])

Следует помнить, что при подключении к VPN все Запросы DNS будут маршрутизироваться через сервер VPN, а не только для клиентов VPN. Это фундаментальное ограничение DNS.