我在远程位置有许多网络,我希望能够通过VPN访问这些网络。每个网络的拓扑结构只是一个NAT路由器和一个运行SSH服务器的机器。路由器的SSH端口被转发,所以所需要的就是能够访问路由器的IP。我已经配置了一个OpenVPN服务器,并在每个远程网络上设置路由器来访问它。客户端PC也被配置成访问VPN,并且服务器已经被配置,因此它可以使用各种路由器的VPN IP地址来访问它们。
拓扑结构:
这一切工作很好,除了路由器的VPN IP地址是未知的客户端。目前,我必须查看OpenVPN状态日志,然后使用该IP。我宁愿不使用静态I,因为远程网络的数量将会增加。
所以,我的问题是,是否可以在VPN服务器上运行本地DNS服务器,并为连接的客户端自动更新?
我已经看过几篇关于更新虚拟专用网服务器上的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
发布于 2019-11-18 16:21:54
为了其他人寻找类似问题的解决方案,我就是这样解决的。
我在示例配置中添加/取消了以下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-host中)使用openvpn-状态库更新附加的主机文件并重新加载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
复制相似问题