在 OpenVPN 伺服器上設置自動 DNS 伺服器
我在遠端位置有許多網路,我希望能夠通過 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 的基本限制。