
O problema
Tenho uma VPC na qual preciso acessar os servidores usando FQDNs privados. A VPC é acessível por meio de uma VPN wireguard. O servidor VPN também serve como servidor DNS executando BIND9. Eu configurei o servidor DNS com uma zona privada de acordo com istotutorial. De dentro da VPC, o DNS funciona conforme o esperado e consigo acessar os servidores pelos FQDNs definidos na zona DNS.
Ao conectar-me à VPC por meio do túnel VPN, não consigo resolver esses FQDNs, embora tenha configurado meu cliente VPN para usar meu servidor DNS privado. Eu sei que o cliente VPN usa meu servidor DNS privado porque quando executo nslookup google.com
vejo o endereço IP do meu DNS, como você pode ver o resultado abaixo:
Server: 10.118.0.2
Address: 10.118.0.2#53
...
Se eu executar o nslookup myprivate.domain.com
de uma máquina conectada ao VPC através do túnel VPN, recebo um NXDOMAIN, o mesmo vale para o ping
, ele falha com o erro Name or service not known
. No entanto, se eu executar o ping no endereço IP privado da VPC, ele funcionará. Portanto, se myprivate.domain.com
estiver hospedado no servidor em 10.118.0.3
, o ping será bem-sucedido no endereço IP, mas falhará no FQDN.
Além disso, veja os resultados da escavação quando estiver dentro da VPC e quando estiver em uma máquina conectada por meio da 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
DA 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
Percebo que ambos usam o mesmo servidor DNS, mas quando solicitado pela VPN, a autoridade do meu domínio privado não é retornada.
Para concluir, após várias horas de pesquisa, não consigo descobrir o que está faltando para os clientes que se conectam à VPC por meio da VPN conseguirem resolver os FQDNs definidos pelo meu DNS privado.
Informações adicionais
- O servidor é Ubuntu 20.04 LTS
- Vincular 9:
BIND 9.16.1-Ubuntu (Stable Release)
- wireguard:
wireguard-tools v1.0.20200513
instalado através de wirespeed - UFW ativado
O IP do servidor VPN e DNS na VPC é 10.118.0.2
.
O pool de endereços VPN é 10.99.0.0/16
e eu defini as configurações do BIND9 da seguinte maneira:
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;
};
};
A zona está configurada desta forma:
$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
e o arquivo da zona reversa:
$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
O UFW está configurado para permitir a porta 53 para TCP e UDP.
Além disso, o UFW possui regras anteriores para permitir o tráfego da VPN:
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.99.0.0/16 -o eth1 -j MASQUERADE
A regra anterior foi configurada para permitir que um cliente se conectasse ao túnel VPN e usasse o servidor DNS privado. Sem essa regra, não consigo acessar a Internet, a menos que defina o endereço DNS como público, como o do Google. Encontrei essa regra durante minha pesquisa, porém ainda não estou muito familiarizado com as configurações de firewall e ainda não entendo completamente suas implicações. Isso me ajudou a chegar mais perto de meu objetivo, mas preciso ler mais sobre isso.
Abaixo está a configuração do cliente 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
ATUALIZAÇÃO: TRABALHO
O servidor wireguard foi instalado através de outro software que o empacotou e forneceu serviços adicionais (interface web, configuração facilitada). A desvantagem é que eu tinha pouco controle sobre a configuração do servidor wireguard.
Conseqüentemente, acabei removendo o software e instalando o wireguard manualmente, o que me permitiu configurar corretamente a VPN, principalmente para que as regras de roteamento funcionassem com a configuração da minha VPC. Eu precisava rotear o tráfego no túnel VPN da interface VPN para a interface privada da VPC em vez da interface pública. Isso acabou resolvendo meu problema sem precisar modificar as configurações do servidor DNS e da zona.