У меня есть несколько удаленных сетей, к которым я хочу получить доступ через 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.