Como configurar systemd-resolved e systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

26

Estou conectado à rede local com acesso à Internet através do gateway. Há um servidor DNS na rede local que é capaz de resolver nomes de host de computadores da rede local.

Gostaria de configurar systemd-resolved e systemd-networkd para que as solicitações de pesquisa de nomes de host locais sejam direcionadas (roteadas) exclusivamente para o servidor DNS local e as solicitações de pesquisa de todos os outros nomes de host sejam direcionadas exclusivamente para outro servidor DNS remoto.

Vamos supor que não sei onde estão os arquivos de configuração ou se devo adicionar mais arquivos e exigir que o (s) caminho (s) sejam especificados na resposta.

Piotr Dobrogost
fonte

Respostas:

28

No arquivo de configuração da interface de rede local, precisamos especificar que queremos obter o endereço do servidor DNS local do servidor DHCP usando a DHCP=opção :

[Network]
DHCP=yes

ou especifique seu endereço explicitamente usando a DNS=opção :

[Network]
DNS=10.0.0.1

Além disso, precisamos especificar (na mesma seção) domínios locais usando a Domains=opção

Domains=domainA.example domainB.example ~example

Especificamos domínios locais domainA.example domainB.examplepara obter o seguinte comportamento (na página de manual systemd-resolved.service, systemd-resolved ):

As pesquisas de um nome de host que termina em um dos domínios por interface são roteadas exclusivamente para as interfaces correspondentes.

Desta forma hostX.domainA.exampleserá resolvido exclusivamente pelo nosso servidor DNS local.

Especificamos com ~exampleque todos os domínios terminados em exampledevem ser tratados como domínios somente de rota para obter o seguinte comportamento (da descrição dessa confirmação):

Os servidores DNS que possuem domínios somente de rota devem ser usados ​​apenas para os domínios especificados.

Desta forma hostY.on.the.internetserá resolvido exclusivamente por nosso servidor DNS remoto e global.

Nota

Idealmente, ao usar o protocolo DHCP, os nomes de domínio local devem ser obtidos no servidor DHCP em vez de serem especificados explicitamente no arquivo de configuração da interface de rede acima. Ver UseDomains=opção . No entanto, ainda existem problemas pendentes com esse recurso - consulte a opção systemd-networkd DHCP search domains .

Precisamos especificar o servidor DNS remoto como nosso servidor DNS global em todo o sistema. Podemos fazer isso em /etc/systemd/resolved.confarquivo:

[Resolve]
DNS=8.8.8.8 8.8.4.4 2001:4860:4860::8888 2001:4860:4860::8844

Não se esqueça de recarregar a configuração e reiniciar os serviços:

$ sudo systemctl daemon-reload
$ sudo systemctl restart systemd-networkd
$ sudo systemctl restart systemd-resolved

Cuidado!

As garantias acima aplicam-se apenas quando os nomes estão sendo resolvidos por systemd-resolved - consulte a página de manual para nss-resolve, libnss_resolve.so.2 e a página de manual de systemd-resolved.service, systemd-resolved .

Veja também:

Referências:

Piotr Dobrogost
fonte
6
Você considerou não usar .localneste exemplo? Certamente, com o avahi, isso deveria ser reservado para o MDNS e o uso indevido era um grande não-não. Seria mais claro para mim usar example.comou .exemplo .
Fonte # jedi #
1
@sourcejedi Para referência, .localé definido como domínio especial no RFC 6762 - DNS Multicast na seção Nomes DNS Multicast . Obrigado, consertado.
Piotr Dobrogost
Nota não relacionada: você também pode aceitar respostas automaticamente.
Intelfx # 9/18
2
Eu acho que seria útil adicionar o local do arquivo de configuração para a interface de rede local . Não tenho certeza de estar certo, é /etc/systemd/network/*.network? Encontrado aqui superuser.com/a/1365864
Pierre Cordier
1
Observo que a resposta "No arquivo de configuração ..." não responde aos OP "Vamos assumir que não sei onde estão os arquivos de configuração ..." Como alguém que chegou aqui no mesmo estado de ignorância sobre o localização de arquivos de configuração específicos, esta resposta está incompleta.
Eric Towers
1

Apenas para expandir a excelente resposta de @piotrDobrogost, não esqueça de configurar /etc/nsswitch.confpara usar systemd-resolvedcomo uma fonte de resolução de DNS. Sua hostsdiretiva deve ter a seguinte aparência para seu caso de uso específico:

/etc/nsswitch.conf

hosts:  files resolve dns

Portanto, se você limitar a resolução apenas aos domínios especificados na Domainsdiretiva /etc/systemd/resolved.confcomo detalhes da Piotr acima, o DNS deverá ser consultado na ordem das fontes de resolução de nomes especificadas /etc/nsswitch.confquando os domínios NÃO forem encontrados na Domainsdiretiva:

O link a seguir faz referência ao requisito de especificar a resolução , /etc/nsswitch.confportanto, systemd-resolvedé consultado durante a resolução de nomes:

https://github.com/systemd/systemd/issues/940

Documentação do SystemD que considero terrível. Eu tive que juntar um entendimento de vários links, incluindo a resposta de Piotr acima ;-)

F1Linux
fonte
Ao usar o modo recomendado de operação de systemd-resolved, onde /etc/resolve.confhá um link simbólico para o /run/systemd/resolve/stub-resolv.confarquivo, que por sua vez contém o endereço do resolvedor de stub DNS do systemd-resolve, não há necessidade de colocar a resolvediretiva no /etc/nsswitch.confarquivo, pois as solicitações de DNS serão direcionadas (devido à nss-dnsdiretiva padrão ) a resolvedor de stub que age de acordo com as regras do systemd-resolved .
Piotr Dobrogost
@PiotrDobrogost Como você pode controlar a ordem em que as fontes de resolução DNS são consultadas sem o uso de /etc/nsswitch.conf``? In the specimen config above, / etc / hosts` (" arquivos ") seria verificado o mapeamento estático de IP: name e, se não fosse encontrado, o stub resolvido pelo sistema seria consultado em seguida . Não consigo ver como seria possível, portanto, preparar fontes de resolução de DNS sem usar /etc/nsswitch.conf. Estou perdendo um truque aqui?
F1Linux 13/10
Não estou dizendo que /etc/nsswitch.confnão é necessário. Estou dizendo que, quando alguém usa o resolvedor de DNS stub do resolvido pelo systemd , basta ter a dnsdiretiva listada na hosts:linha (presumivelmente após a filediretiva). Não há necessidade de resolvediretiva, pois é o resolvedor de stub que é o ponto de entrada para a lógica do systemd-resolved e não o nss-resolvemódulo de plug-in ...
Piotr Dobrogost
... Em outras palavras, você pode alcançar a lógica do systemd-resolved através da resolvediretiva ➟ módulo de plug-in NSS nss-resolve NSS ➟ resolvido pelo sistema ou através da dnsdiretiva ➟ módulo de plug-in NSS nss-dns NSS module módulo stub DNS resolvido pelo systemd- resolved systemd-resolved
Piotr Dobrogost
@PiotrDobrogost Acho que chegou ao filesentão resolvecoisinha em /etc/nsswitch.confDa 2ª parte da sua pergunta. Relendo-o, parece que você estava apenas falando sobre verificar o cache local em busca de um IP: mapeamento de nomes e, em seguida, procurar um encaminhador, se não for encontrado. Geralmente, defino a filesprimeira fonte de resolução do DNS para contornar o DNS para permitir que eu teste e não atinja os hosts de produção- T
F1Linux