
問題
我有一個 VPC,需要使用私有 FQDN 存取伺服器。 VPC 可透過wireguard VPN 存取。 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
...
如果我nslookup myprivate.domain.com
從透過 VPN 隧道連接到 VPC 的電腦運行 ,我會收到一個 NXDOMAIN,同樣的情況也適用ping
,它會失敗並出現錯誤Name or service not known
。但是,如果我在 VPC 的私人 IP 位址上執行 ping,則它可以工作。因此,如果myprivate.domain.com
託管在位於 的伺服器上10.118.0.3
,則 ping 在 IP 位址上成功,但在 FQDN 上失敗。
此外,請查看在 VPC 內部與透過 VPN 連接的電腦時的挖掘結果:
dig dev.myprivatedomain.com ns
: FROM 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 位址設定為像 google 這樣的公共位址。我在研究過程中發現了這條規則,但是我對防火牆配置還不是很熟悉,而且我還不完全理解它的意義。它幫助我更接近我的目標,但我需要進一步閱讀它。
以下是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 伺服器和區域配置。