Domain-Name-System

在 OpenVPN 伺服器上設置自動 DNS 伺服器

  • November 18, 2019

我在遠端位置有許多網路,我希望能夠通過 VPN 訪問這些網路。每個網路的拓撲結構只是一個 NAT 路由器,以及一台執行 SSH 伺服器的機器。路由器已轉發 SSH 埠,因此只需要能夠訪問路由器的 IP。我已經配置了一個 OpenVPN 伺服器,並在每個遠端網路上設置了路由器來訪問它。客戶端 PC 也配置為訪問 VPN,並且伺服器已配置為可以使用其 VPN IP 地址訪問各種路由器。

拓撲:

這一切都很好,除了客戶端不知道路由器的 VPN IP 地址。目前,我必須查看 OpenVPN 狀態日誌,然後使用該 IP。我寧願不使用靜態 IP,因為遠端網路的數量會增加。

所以,我的問題是,是否可以在 VPN 伺服器上執行本地 DNS 伺服器,並為連接的客戶端自動更新它?

我看過幾篇關於在 VPN 伺服器上更新 resolv.conf 以及將 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 連接,並使用一個額外的主機文件,我們將保持更新:

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-status庫來更新附加主機文件並重新載入 dnsmasq 配置。這在 /etc/crontab ( * * * * * root /usr/local/sbin/update-openvpn-hosts) 中的 cron 作業中每分鐘呼叫一次。

#!/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 的基本限制。

引用自:https://serverfault.com/questions/904664