
Проблема
У меня есть VPC, в котором мне нужно получить доступ к серверам с помощью частных FQDN. VPC доступен через Wireguard VPN. VPN-сервер также служит DNS-сервером с BIND9. Я установил DNS-сервер с частной зоной в соответствии с этимруководствоИзнутри VPC DNS работает так, как и ожидалось, и я могу связаться с серверами по полным доменным именам, определенным в зоне DNS.
При подключении к VPC через VPN-туннель я не могу разрешить эти FQDN, хотя я настроил свой VPN-клиент на использование моего частного DNS-сервера. Я знаю, что VPN-клиент использует мой частный DNS-сервер, потому что при запуске nslookup google.com
я вижу IP-адрес своего DNS, как вы можете видеть ниже:
Server: 10.118.0.2
Address: 10.118.0.2#53
...
Если я запускаю nslookup myprivate.domain.com
с машины, подключенной к VPC через VPN-туннель, я получаю NXDOMAIN, то же самое касается ping
, он завершается ошибкой Name or service not known
. Однако, если я запускаю ping на частном IP-адресе из VPC, он работает. Так что если myprivate.domain.com
размещен на сервере в 10.118.0.3
, ping проходит успешно на IP-адресе, но не проходит на 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 полномочия для моего частного домена не возвращаются.
В заключениеПосле нескольких часов исследований мне так и не удалось выяснить, чего не хватает клиентам, подключающимся к VPC через VPN, чтобы иметь возможность разрешать полные доменные имена, определенные моим частным DNS.
Дополнительная информация
- Сервер — Ubuntu 20.04 LTS
- Связка 9:
BIND 9.16.1-Ubuntu (Stable Release)
- wireguard:
wireguard-tools v1.0.20200513
установлен через Wirespeed - UFW включен
IP-адрес VPN- и DNS-сервера в VPC — 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 настроен на разрешение использования порта 53 как для TCP, так и для UDP.
Кроме того, в UFW есть правила, разрешающие трафик из VPN:
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.99.0.0/16 -o eth1 -j MASQUERADE
Предыдущее правило было настроено для того, чтобы позволить клиенту подключаться к VPN-туннелю и использовать частный DNS-сервер. Без этого правила я не смогу получить доступ к Интернету, если только не установлю DNS-адрес на публичный, например, адрес Google. Я нашел это правило во время своего исследования, однако я еще не очень хорошо знаком с конфигурациями брандмауэра и пока не до конца понимаю его значение. Оно помогло мне приблизиться к моей цели, но мне нужно больше почитать об этом.
Ниже представлена конфигурация VPN-клиента Wireguard:
[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 был установлен через другое программное обеспечение, которое упаковывало его и предоставляло дополнительные услуги (веб-интерфейс, упрощенная настройка). Недостатком было то, что у меня было мало контроля над конфигурацией сервера Wireguard.
В результате я в конечном итоге удалил программное обеспечение и установил Wireguard вручную, что позволило мне правильно настроить vpn, особенно для правил маршрутизации, которые работали с моей настройкой VPC. Мне нужно было направить трафик в туннеле VPN с интерфейса VPN на частный интерфейс VPC вместо публичного интерфейса. Это в конечном итоге решило мою проблему без необходимости изменять конфигурации DNS-сервера и зоны.