Como fazer com que o gerenciador de rede configure servidores de nomes específicos de domínio com openresolv + dnsmasq

11

Costumo me conectar a várias redes simultaneamente. Cada uma dessas redes fornece a configuração do servidor de nomes via dhcp. Por exemplo, Rede 1: (eth0):

domain company1.corp #
nameserver 192.168.0.253
nameserver 192.168.0.254

Rede 2 (tun0):

domain company2.corp #
nameserver 10.102.204.51
nameserver 10.102.208.51

# Nomes alterados

Quando conectado às duas redes simultaneamente:

# resolv.conf from NetworkManager
domain company1.corp, company2.corp
nameserver 192.168.0.253
nameserver 192.168.0.254
nameserver 10.102.204.51
# NOTE: the libc resolver may not support more than 3 nameservers.
# The nameservers listed below may not be recognized.
nameserver 10.102.208.51

A resolução de service.company2.corp não funciona porque o primeiro servidor de nomes apenas conhece os nomes de company1.corp.

Tão inspirado neste artigo , eu configurei o openresolv (uma implementação resolvconf) configurando um serviço dnsmasq local na minha instalação do Arch linux.

Se eu configurar os servidores de nomes manualmente usando resolvconf:

# resolvconf -d NetworkManager
# echo "domain company1.corp
nameserver 192.168.0.253
nameserver 192.168.0.254
" | resolvconf -a eth0
# echo "domain company2.corp
nameserver 10.102.204.51
nameserver 10.102.208.51
" | resolvconf -a tun0

Então, sou capaz de resolver nomes de company1.corp e company2.corp (o servidor dnsmasq local lida com isso.)

Observe que após a configuração manual, resolveconf -l mostra as 2 configurações separadamente:

~ # resolvconf -l
# resolv.conf from tun0
domain company2.corp
nameserver 10.102.204.51
nameserver 10.102.208.51

# resolv.conf from eth0
domain company1.corp
nameserver 192.168.0.253
nameserver 192.168.0.254

No entanto, ao permitir que o gerente de rede faça a configuração, as 2 configurações não são separadas, como seria se o gerente de rede estivesse gravando no /etc/resolve.conf

~ # resolvconf -l
# resolv.conf from NetworkManager
# Generated by NetworkManager
domain company1.corp, company2.corp
nameserver 192.168.0.253
nameserver 192.168.0.254
nameserver 10.102.204.51
# NOTE: the libc resolver may not support more than 3 nameservers.
# The nameservers listed below may not be recognized.
nameserver 10.102.208.51

Minha pergunta é como posso fazer com que o gerente de rede chame corretamente resolveconf para que os servidores de nomes de cada interface sejam registrados separadamente. (Infelizmente, pesquisar no Google é inútil porque o Google pensa que "resolveconf" == "resolve.conf")

Gary van der Merwe
fonte
2
No Google, pesquise "resolvconf"com as aspas. Sempre coloque aspas nos nomes próprios no Google.
Gilles 'SO- stop be evil'

Respostas:

14

O NetworkManager tem a funcionalidade de gerenciar um servidor dnsmasq local incorporado. Não é necessário usar o resolvconf / openresolv para fazer isso.

Para habilitar isso:

  • Desative a configuração resolvconf / openresolv dnsmasq se ela foi ativada anteriormente e verifique se não há instâncias do dnsmasq em execução.
  • Verifique se o dnsmasq está instalado
  • Adicionar dns=dnsmasqa /etc/NetworkManager/NetworkManager.conf.
  • Reinicie o NetworkManager

Depois de fazer isso, você verá que o NetworkManager iniciou um processo dnsmasq:

$ pgrep dnsmasq -fl
1697 /usr/bin/dnsmasq --no-resolv --keep-in-foreground --no-hosts --bind-interfaces --pid-file=/var/run/nm-dns-dnsmasq.pid --listen-address=127.0.0.1 --conf-file=/var/run/nm-dns-dnsmasq.conf --cache-size=400 --proxy-dnssec

/etc/resolve.conf deve estar apontando para a instância local do dnsmasq:

$ cat /etc/resolv.conf
# Generated by NetworkManager
domain company1.corp
search company1.corp
nameserver 127.0.0.1

e podemos ver quais servidores o dnsmasq está usando:

# cat /var/run/nm-dns-dnsmasq.conf 
server=/company2.corp/10.102.208.51
server=/10.in-addr.arpa/10.102.208.51
server=192.168.1.244
server=192.168.1.239
Gary van der Merwe
fonte
muito legal, obrigado! solução muito simples e fácil, mas infelizmente não é bem conhecida - não resisti, desculpe
akostadinov
Isso parece funcionar ao combinar uma conexão local com uma ou duas VPNs. Parece que não funciona com duas conexões locais. Atualmente, estou conectado à rede do escritório pela Ethernet, onde, infelizmente, a conexão à Internet upstream falhou. Também estou conectado via USB Ethernet (meu telefone) a uma Internet que funciona. Não consigo que o NetworkManager aplique o nome de domínio ao servidor DNS do escritório.
Oskar Berggren
@OskarBerggren: Na ethernet do seu escritório, na guia IPv4, marque a opção "Use esta conexão apenas para recursos na rede".
Gary van der Merwe 08/08
@ GaryvanderMerwe Isso é exatamente o que eu tentei, esqueci de escrever. Parece haver uma solicitação de bug / recurso relacionada: bugzilla.gnome.org/show_bug.cgi?id=685962
Oskar Berggren
FYI não há uma opção para usar uboundassim também DNSSEC está trabalhando, ver fedoraproject.org/wiki/Networking/NameResolution/DNSSEC
akostadinov
0

Parece que o NetworkManager está simplesmente substituindo /etc/resolv.confe não usando o openresolv. De acordo com o FS # 24635 , o NetworkManager tem suporte para openreslov, mas não foi ativado inicialmente na compilação. Qual versão do Arch Linux você está executando e qual é a versão do pacote networkmanager?

mgorven
fonte
networkmanager 0.9.4.0-6 O NetworkManager está chamando resolveconf e não está gravando no /etc/resolev.conf. O problema é que o NetworkManager está mesclando as informações de DNS e transmitindo-as para resolverconf como uma interface, e não como informações para as interfaces separadas.
Gary van der Merwe
0

Faça como Gary van der Merwe respondeu, mas em

/etc/NetworkManager/NetworkManager.conf

Eu tive que adicionar

[main]
dns=dnsmasq

para o arquivo Não apenas

dns=dnsmasq

Isso ocorre porque todas as configurações desse arquivo devem estar em uma seção e a versão da minha distribuição, manjaro (archlinux), do pacote NetworkManager não preenche o arquivo de configuração. (Suponho que a distribuição de Gary funcione desde que sua linha sugerida funcionou para ele e para outros)

Outra observação, qualquer configuração do dnsmasq deve ir em um arquivo de configuração neste

/etc/NetworkManager/dnsmasq.d/

diretório. Pode ser um diretório diferente na sua máquina. Aprendi o diretório que está sendo usado, observando a linha que o NetworkManager usa para iniciar o daemon dnsmasq. Você pode ver esta linha executando ps aux|grep dnsmasq. Você deve esperar para executá-lo até depois de modificar a configuração do NetworkManager e reiniciar seu serviço.

SultanLegend
fonte