问题
我有一个 VPC,需要使用私有 FQDN 访问其中的服务器。可以通过 wireguard VPN 访问 VPC。VPN 服务器还充当运行 BIND9 的 DNS 服务器。我已根据此设置了 DNS 服务器的私有区域教程。在 VPC 内部,DNS 工作正常,我能够通过 DNS 区域中定义的 FQDN 访问服务器。
当通过 VPN 隧道连接到 VPC 时,尽管我已将 VPN 客户端设置为使用我的私有 DNS 服务器,但我无法解析这些 FQDN。我知道 VPN 客户端使用我的私有 DNS 服务器,因为当我运行时,nslookup google.com
我会看到我的 DNS 的 IP 地址,如下面的结果所示:
Server: 10.118.0.2
Address: 10.118.0.2#53
...
如果我从通过 VPN 隧道连接到 VPC 的机器上运行nslookup myprivate.domain.com
,我会收到 NXDOMAIN,对于 也是如此ping
,它会失败并显示错误Name or service not known
。但是,如果我从 VPC 对私有 IP 地址运行 ping,它会正常工作。因此,如果myprivate.domain.com
托管在 的服务器上10.118.0.3
,则在 IP 地址上的 ping 会成功,但在 FQDN 上会失败。
此外,查看在 VPC 内部和通过 VPN 连接的机器上的挖掘结果::
dig dev.myprivatedomain.com ns
来自 VPC:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51703
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 9dccc02158dee7f70100000061a7e0a1ce2597e377b9c301 (good)
;; QUESTION SECTION:
;dev.myprivatedomain.com. IN NS
;; AUTHORITY SECTION:
nabuinternal.com. 604800 IN SOA ns1.myprivatedomain.com. ...
;; Query time: 0 msec
;; SERVER: 10.118.0.2#53(10.118.0.2)
;; WHEN: Wed Dec 01 20:52:49 UTC 2021
;; MSG SIZE rcvd: 93
来自VPN:
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 57158
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;dev.myprivatedomain.com. IN NS
;; AUTHORITY SECTION:
com. 900 IN SOA a.gtld-servers.net. nstld.verisign-grs.com. 1638392201 1800 900 604800 86400
;; Query time: 44 msec
;; SERVER: 10.118.0.2#53(10.118.0.2)
;; WHEN: Wed Dec 01 15:57:05 EST 2021
;; MSG SIZE rcvd: 122
我注意到两者都使用相同的 DNS 服务器,但是当从 VPN 发出请求时,不会返回我的私有域的权限。
综上所述经过几个小时的研究,我仍未发现通过 VPN 连接到 VPC 的客户端缺少什么,无法解析我的私有 DNS 定义的 FQDN。
附加信息
- 服务器是 ubuntu 20.04 LTS
- 绑定9:
BIND 9.16.1-Ubuntu (Stable Release)
- wireguard:
wireguard-tools v1.0.20200513
通过wirespeed安装 - UFW 已启用
VPC内的VPN和DNS服务器ip为10.118.0.2
。
VPN 地址池是10.99.0.0/16
,我已经按以下方式设置了 BIND9 配置:
acl "trusted" {
10.118.0.2; # the vpn and dns server
...
10.99.0.0/16; # vpn address pool
};
options {
directory "/var/cache/bind";
listen-on-v6 { any; };
recursion yes;
allow-recursion { trusted; };
listen-on { 10.118.0.0/20; 10.99.0.0/16; };
allow-transfer { none; };
forwarders {
8.8.8.8;
8.8.4.4;
};
};
该区域配置如下:
$TTL 604800
@ IN SOA ns1.myprivatedomain.com. admin.myprivatedomain.com. (
9 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
; name servers - NS records
IN NS ns1.myprivatedomain.com.
; name servers - A records
ns1.myprivatedomain.com. IN A 10.118.0.2
; 10.118.0.0/20 - A records
dev.myprivatedomain.com. IN A 10.118.0.4
staging.myprivatedomain.com. IN A 10.118.0.3
以及反向区域文件:
$TTL 604800
@ IN SOA ns1.myprivatedomain.com. admin.myprivatedomain.com. (
7 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
; name servers - NS records
IN NS ns1.myprivatedomain.com.
; PTR Records
2.0 IN PTR ns1.myprivatedomain.com. ; 10.118.0.2
4.0 IN PTR dev.myprivatedomain.com. ; 10.118.0.4
3.0 IN PTR staging.myprivatedomain.com. ; 10.118.0.3
UFW 设置为允许 TCP 和 UDP 使用端口 53。
此外,UFW 之前有允许来自 VPN 的流量的规则:
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.99.0.0/16 -o eth1 -j MASQUERADE
先前的规则是为了允许客户端连接到 VPN 隧道并使用私有 DNS 服务器而设置的。如果没有此规则,我将无法访问互联网,除非我将 DNS 地址设置为公共地址(如谷歌的地址)。我在研究过程中发现了此规则,但我对防火墙配置还不是很熟悉,也不完全理解它的含义。它帮助我更接近目标,但我需要进一步阅读它。
以下是 wireguard VPN 客户端配置:
[Interface]
...
DNS = 10.118.0.2
Address = 10.99.0.2/16
[Peer]
...
AllowedIPs = 10.99.0.0/16, 10.118.0.0/20
更新:解决方法
wireguard 服务器是通过另一个软件安装的,该软件打包了它并提供额外的服务(Web 界面、简化的设置)。缺点是我对 wireguard 服务器的配置几乎没有控制权。
因此,我最终删除了该软件并手动安装了 wireguard,这使我能够正确设置 vpn,尤其是使路由规则与我的 VPC 设置配合使用。我需要将 VPN 隧道中的流量从 VPN 接口路由到 VPC 私有接口而不是公共接口。这最终解决了我的问题,而无需修改 DNS 服务器和区域配置。