发布
社区首页 >问答首页 >在OpenVPN服务器上设置自动DNS服务器

在OpenVPN服务器上设置自动DNS服务器
EN

Server Fault用户
提问于 2018-03-26 19:08:31
回答 1查看 2.8K关注 0票数 5

我在远程位置有许多网络,我希望能够通过VPN访问这些网络。每个网络的拓扑结构只是一个NAT路由器和一个运行SSH服务器的机器。路由器的SSH端口被转发,所以所需要的就是能够访问路由器的IP。我已经配置了一个OpenVPN服务器,并在每个远程网络上设置路由器来访问它。客户端PC也被配置成访问VPN,并且服务器已经被配置,因此它可以使用各种路由器的VPN IP地址来访问它们。

拓扑结构:

这一切工作很好,除了路由器的VPN IP地址是未知的客户端。目前,我必须查看OpenVPN状态日志,然后使用该IP。我宁愿不使用静态I,因为远程网络的数量将会增加。

所以,我的问题是,是否可以在VPN服务器上运行本地DNS服务器,并为连接的客户端自动更新?

我已经看过几篇关于更新虚拟专用网服务器上的resolv.conf的文章,以及将DNS细节推送给客户端的文章,但我不确定缺少的实际运行和更新DNS服务器的部分。

服务器配置:

代码语言:javascript
代码运行次数:0
复制
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
EN

回答 1

Server Fault用户

回答已采纳

发布于 2019-11-18 16:21:54

为了其他人寻找类似问题的解决方案,我就是这样解决的。

我在示例配置中添加/取消了以下OpenVPN服务器设置(/etc/openvpn/server.conf),以告诉客户端使用其DNS服务器,并允许客户端相互通信:

代码语言:javascript
代码运行次数:0
复制
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连接,并使用一个额外的主机文件,我们将不断更新该文件:

代码语言:javascript
代码运行次数:0
复制
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-host中)使用openvpn-状态库更新附加的主机文件并重新加载dnsmasq配置。这在/etc/crontab (* * * * * root /usr/local/sbin/update-openvpn-hosts)中的cron作业中每分钟调用一次。

代码语言:javascript
代码运行次数:0
复制
#!/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的一个基本限制。

票数 4
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/904664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档