OpenVPN 内网域名访问问题分析

​ 在连接了openvpn的情况下能够访问公司资源了,但是仅限IP。需要实现域名的方式访问。

初次尝试在 WLAN 网卡上手动设置 DNS

​ WLAN 网卡 DNS 设置为 192.168.99.205nslookup显示

1
2
3
4
DNS request timed out
timeout was 2 seconds
服务器 UnKnown
Address 10.8.0.1

image-20250908112555239

​ 说明没走wlan的配置的dns服务器。本来也应该如此,因为访问内网资源的流量必须走虚拟网卡。WLAN 设置的 DNS 没有被使用

尝试在 VPN 虚拟网卡上手动设置 DNS*

​ 将虚拟网卡 DNS 设置为 192.168.99.205。nslookup 内网域名成功解析但是ping 内网域名失败,服务无法访问

image-20250908112816052

虚拟网卡手动配置可能没有正确注册到系统 DNS或者路由表、接口优先级不完全匹配、内网流量无法通过虚拟网卡正确路由。接下来尝试使用 OpenVPN 的 dhcp-option 在客户端配置文件或服务器推送 DNS。

通过 OpenVPN 配置文件下发 DNS

​ 在客户端配置文件中增加

1
dhcp-option DNS 192.168.99.205

从新连接后 VPN 后无需手动修改网卡、内网域名解析正常,服务可访问。OpenVPN 自动修改虚拟网卡的 DNS 设置并注册到系统、保证内网域名解析请求优先通过 VPN 虚拟网卡。dhcp-option DNS 使 VPN 成为系统 DNS 的首选。


dns问题分析工具

1️⃣ 查看当前 DNS 设置

查看所有网卡 DNS 服务器地址

1
Get-DnsClientServerAddress

image-20250908164244299

查看指定网卡 DNS 地址

1
Get-DnsClientServerAddress -InterfaceAlias "以太网 8"

image-20250908164304911

查看 DNS 后缀(ConnectionSpecificSuffix)

1
Get-DnsClient | Select-Object InterfaceAlias,ConnectionSpecificSuffix

image-20250908164332110

查看接口 Metric(优先级)

1
Get-NetIPInterface | Sort-Object InterfaceMetric

2️⃣ 设置/修改 DNS

修改网卡 DNS 服务器

1
Set-DnsClientServerAddress -InterfaceAlias "以太网 8" -ServerAddresses 192.168.99.205

设置 DNS 搜索后缀(ConnectionSpecificSuffix)

1
Set-DnsClient -InterfaceAlias "以太网 8" -ConnectionSpecificSuffix "test.regen"

添加多个 DNS 服务器(按优先顺序)

1
Set-DnsClientServerAddress -InterfaceAlias "以太网 8" -ServerAddresses ("192.168.99.205","202.96.209.5")

3️⃣ 刷新和测试 DNS

刷新 DNS 缓存

1
ipconfig /flushdns

测试 DNS 解析

1
nslookup jira.test.regen 192.168.99.205

测试网络可达性(IP)

1
ping 192.168.99.205

测试端口(例如 DNS UDP 53)

1
Test-NetConnection 192.168.99.205 -Port 53 -Udp

4️⃣ 路由相关命令(确保 DNS 请求走 VPN 网卡)

查看路由表

1
route print

手动添加到 VPN 网卡的静态路由(示例)

1
route add 192.168.99.205 mask 255.255.255.255 <VPN_TAP_IP>

5️⃣ 调试和抓包

  • 抓包工具:Wireshark / Microsoft Network Monitor
  • 观察 DNS 请求是否发到 VPN 网卡
  • 查看 response 是否缺失(DNS response missing)

6️⃣ OpenVPN 客户端相关配置

在 OpenVPN 配置文件(.ovpn)中:

1
2
3
4
5
6
7
8
# 下发 VPN 内网 DNS
dhcp-option DNS 192.168.99.205

# 下发 DNS 搜索后缀
dhcp-option DOMAIN test.regen

# 阻止系统走外部 DNS(Windows 专用)
block-outside-dns

一般情况下详细的DNS解析流程

假设你在浏览器中输入 www.example.com 并按下回车。

第1步:检查浏览器缓存

  • 浏览器会首先检查自己的缓存中是否曾经解析过这个域名并有有效的IP地址。如果有,直接使用,解析结束。缓存时间由DNS记录中的TTL值决定。

第2步:检查操作系统缓存与Hosts文件

  • 如果浏览器缓存没有,浏览器会调用操作系统的DNS解析器(如Windows中的 gethostbyname 函数)。
  • 操作系统会先检查自己的本地DNS缓存。如果缓存中有,直接返回结果。
  • 操作系统还会检查本地的 hosts文件(在Windows系统位于 C:\Windows\System32\drivers\etc\hosts,在Linux/macOS位于 /etc/hosts)。如果文件中有对应的映射关系,则会直接使用该IP地址。

第3步:请求递归DNS服务器 (ISP或公共DNS)

  • 如果前两步都没有找到记录,操作系统会将查询请求发送到配置好的递归DNS服务器(通常在路由器或ISP那里自动获取,也可能是你手动设置的如 8.8.8.8)。
  • 至此,递归DNS服务器接过了“跑腿”的任务,后续的复杂查询过程都由它来完成,你的电脑只需等待它的最终回复。

第4步:递归服务器查询根域名服务器

  • 递归服务器首先也不知道 www.example.com 的IP。于是,它从“根”开始问起。
  • 它询问任意一个根域名服务器:“www.example.com 的IP是多少?”
  • 根域名服务器回复说:“我不知道 .com 之下的具体地址,但我可以告诉你负责 .com 这个顶级域的TLD服务器的地址列表。” 于是,它返回一个包含 .com TLD服务器的地址列表。

第5步:递归服务器查询TLD服务器

  • 递归服务器拿到 .com TLD服务器的地址后,就去找其中一个询问:“www.example.com 的IP是多少?”
  • .com TLD服务器查看自己的记录,然后回复:“我不知道 example.com 域的具体地址,但我可以告诉你负责 example.com 这个域的权威域名服务器的地址列表。”

第6步:递归服务器查询权威域名服务器

  • 递归服务器又拿着权威服务器的地址,去找其中一个询问:“www.example.com 的IP是多少?”
  • 这次,权威域名服务器终于知道答案了!它查看自己的区域文件,找到与 www.example.com 对应的A记录(或CNAME记录),然后将最终的IP地址返回给递归服务器。

第7步:递归服务器将结果返回给客户端并缓存

  • 递归服务器终于拿到了IP地址!它非常高兴,首先将这个结果在自己的缓存中保存一段时间(由权威服务器返回的TTL值决定),以便下次有其他用户请求相同域名时能快速回复。
  • 然后,它将这个IP地址返回给你的操作系统。

第8步:客户端建立连接

  • 操作系统收到IP后,自己也缓存一下这个结果。
  • 然后将IP地址交给浏览器。
  • 最终,浏览器拿到了 www.example.com 的IP地址,它就可以通过这个IP地址与目标服务器建立TCP连接,发起HTTP请求,获取并渲染网页内容。