问题

问题

问题

我有一个 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 服务器和区域配置。

相关内容