Usando dnsmasq com o NetworkManager

15

Era sabido que o NetworkManager não funciona bem com dnsmasq(ref: aqui ). Eu passei por toda a longa discussão aqui, mas ainda não tenho certeza de qual é a maneira recomendada de lidar com a situação.

Tudo o que eu quero fazer é usar dnsmasqpara fornecer DNS e DHCP à minha rede local. Qual seria a maneira recomendada neste caso?

Parece que o problema permanece até no Ubuntu 14.04, e até mesmo o bug é corrigido.

Como solução alternativa, as pessoas estão desativando os escravizados dnsmasq-basepelo NM, pelas seguintes razões:

O NM-escravizado dnsmasqusa opções codificadas (em C) que fornecem funcionalidade extremamente limitada.

  • Ele não escuta no ethX ( --listen-address=127.0.0.1). Portanto, não podemos usar nossos servidores como servidores DNS para nossos PCs de rede local, ou seja, é completamente inútil para LANs.
  • Não armazena em cache solicitações ( --cache-size=0). Sem cache ==> sem aceleração de consultas DNS. Isso novamente é muito significativo para LANs, pois há muitos usuários simultâneos.
  • Finalmente, também precisamos da funcionalidade DHCP e TFTP do dnsmasq, portanto, mesmo que o NM + dnsmasq incluísse um servidor DNS real, teríamos que executar outro dnsmasq

Mas não tenho certeza se eles ainda são válidos e / ou como a correção resolve o (s) problema (s). Além disso, nenhum deles é muito claro exatamente o que eles fizeram e como fizeram para resolver seu problema. Ou seja, a parte da solução está faltando na longa discussão . Alguém pode preencher os espaços em branco, por favor? Ou seja,

O produto dnsmasqfornecido pelo Ubuntu não está funcionando, no lado do servidor, pelos motivos acima. E também, no lado do cliente, "o dnsmasq instalado nesses laptops Ubuntu não pode fazer a consulta DNS da LAN no meu servidor DNS" , porque "o NetworkManager (dos laptops Ubuntu) está fazendo com que eles tenham uma configuração estranha do servidor de nomes 127.0.1.1" ( ref: solução DNS para LAN ou rede doméstica local )

Como fazer com que o dnsmasq funcione sem problemas com o NetworkManager, de modo a fornecer DNS e DHCP (e TFTP) à minha rede local, no servidor e no cliente?

TL'dr

para quem procura a resposta. De todas as respostas abaixo, achei que a solução mais simples é a @ brad's, para o lado do servidor (ainda não há uma boa resposta para o lado do cliente):

a única solução para o problema é desativar o dnsmasq da unidade NM ..., instalar o dnsmasq "padrão" e configurá-lo através do /etc/dnsmasq.confarquivo de configuração padrão .

xpt
fonte
2
Apenas para os googlers (como eu): nas versões mais recentes do ubuntu dnsmasq-core dentro do NetworkManager é um pouco mais amigável. Veja aqui: askubuntu.com/questions/233195/…
A. Rabus

Respostas:

3

Eu também tenho seus problemas.

Em princípio, após o wiki.archlinux , parece que, para ativar o cache, deve ser suficiente criar um arquivo /etc/NetworkManager/dnsmasq.d/cachecontendo simplesmente

$ cat /etc/NetworkManager/dnsmasq.d/cache 
cache-size=1000

Eu tentei isso, mas, após o NM reiniciar, ainda não tenho cache:

# ps ax | grep dns
11724 ?        S      0:00 /usr/sbin/dnsmasq --no-resolv --keep-in-foreground --no-hosts --bind-interfaces --pid-file=/run/sendsigs.omit.d/network-manager.dnsmasq.pid --listen-address=127.0.1.1 --conf-file=/var/run/NetworkManager/dnsmasq.conf --cache-size=0 --proxy-dnssec --enable-dbus=org.freedesktop.NetworkManager.dnsmasq --conf-dir=/etc/NetworkManager/dnsmasq.d

Observe que o arquivo conf citado está sempre vazio: não consegui configurar nenhuma opção usando este procedimento.

Em suma, parece que o dnsmask escravizado pelo NM no 14.04 (que é fornecido pelo pacote dnsmasq-base) está completamente bloqueado, portanto, não é possível ativar o cache, nem qualquer outra coisa (dhcp, tftp).

Se isso estiver certo, acho que, como você diz, a única solução para o problema é desativar o dnsmasq da unidade NM comentando a linha

dns=dnsmasq

no arquivo /etc/NetworkManager/NetworkManager.confe instale o dnsmasq "padrão" e configure-o por meio de seu /etc/dnsmasq.confarquivo de configuração padrão .

Brad
fonte
Bem-vindo ao superusuário brad! Obrigado pela ajuda!
xpt
1
Na verdade, isso habilita o cache, uma vez que está sendo executado --conf-dir=/etc/NetworkManager/dnsmasq.d, o cache-sizeespecificado no arquivo que você criou é usado. Você pode ver a diferença usandodig
sirfz
6

É possível substituir as configurações colocando-as em /etc/NetworkManager/dnsmasq.d/*.conf. As configurações do arquivo de configuração têm precedência sobre os sinalizadores da linha de comando. Eles são aplicados quando o NetworkManager inicia o dnsmasq. Corra sudo service network-manager restartpara reaplicar. (Se houver alguma dúvida: a resposta de Brad perdeu o fato de ps ax | grep dnsmostrar uma --conf-dirdiscussão)

Por exemplo:

echo cache-size=1000 |sudo tee -a /etc/NetworkManager/dnsmasq.d/cache.conf

Pelo que me lembro, o NetworkManager desabilita o cache do dnsmasq por padrão devido a preocupações com o envenenamento do cache. Para uma máquina em que todos os usuários são confiáveis, pode não ser um problema.

O NetworkManager não se integra resolvconfe o servidor da NM 127.0.1.1não será usado localmente se o pacote resolvconf estiver instalado. O resolvconf faz parte das instalações padrão do ubuntu-minimal e padrão; O NetworkManager reimplementa essa funcionalidade de maneira mais integrada e com menos scripts.

NetworkManager faz ter certeza de não interferir com uma instância dnsmasq global (ligação a uma auto-retorno secundário IP e configuração bind-interfacesatravés /etc/dnsmasq.d/network-manager). Se você instalar uma instância global do dnsmasq e manter a instância do NM, verifique novamente /etc/resolv.confpara ver qual o host usará por padrão.

Embora você possa personalizar a instância dnsmasq do NetworkManager, como mostrado acima, se desejar um servidor DNS vinculado a interfaces públicas, instale o dnsmasqpacote (o NetworkManager usa apenas dnsmasq-base, que não configura uma instância global) e faça sua configuração /etc/dnsmasq.d/*.conf. A instância escrava do NetworkManager destina-se apenas a vincular-se à interface de loopback e configurá-la além desse escopo arriscaria quebrá-la.


Em resumo, para alguém que apenas deseja cache de DNS local:

sudo apt-get remove dnsmasq resolvconf dhcpcd5 rdnssd
echo cache-size=1000 |sudo tee -a /etc/NetworkManager/dnsmasq.d/cache.conf

Para uma LAN simples, o compartilhamento de conexão do NetworkManager ainda deve ser suficiente. Mas para uma LAN configurada personalizada, com TFTP e assim por diante:

sudo apt-get install resolvconf dnsmasq
echo 192.168.0.50,192.168.0.150,12h |sudo tee -a /etc/dnsmasq.d/lan.conf
echo enable-tftp |sudo tee -a /etc/dnsmasq.d/lan.conf
sudo service dnsmasq restart
Tobu
fonte
Obrigado. Embora você deva descrever mais detalhadamente o que seus comandos "em resumo" fazem, ou seja, as instruções também removem 4 pacotes, se você os tiver atualmente. Mais links e discussões em reddit.com/r/Ubuntu/comments/2j0va4/…
nealmcb
Concordo plenamente com o @nealmcb, Tobu, por favor, explique por que "para alguém que deseja apenas o cache local do DNS" , ele precisa remover o dnsmasqpacote. então qual é o próximo echocomando? desde que a dnsmasqvontade se foi.
xpt
@xpt Tobu sugere remover dnsmasq, mas você ainda deve ter dnsmasq-baseinstalado devido ao NM.
Thalis Kalfigkopoulos
0

Eu queria atribuir um MAC específico a um endereço IP específico e, para fins de estabilidade, manter o Network Manager / dnsmasq padrão o máximo possível.

https://cgit.freedesktop.org/NetworkManager/NetworkManager/tree/src/dnsmasq/nm-dnsmasq-manager.c tem o comentário sobre o uso de --conf-file para ignorar configurações, mas posteriormente no arquivo que temos

/* dnsmasq exits if the conf dir is not present */
    if (g_file_test (CONFDIR, G_FILE_TEST_IS_DIR))
        nm_cmd_line_add_string (cmd, "--conf-dir=" CONFDIR);

No Ubuntu 16.04 LTS, depois de configurar um ponto de acesso Wi-Fi e compartilhar outra conexão, ps auxgww | grep dnsmasqmostra que o último argumento da linha de comando de cada um dos processos dnsmasq é:

--conf-dir=/etc/NetworkManager/dnsmasq-shared.d

Portanto, é possível criar arquivos de configuração nesse diretório que são compartilhados entre todas as chamadas do dnsmasq iniciadas pelo Network Manager.

Criei /etc/NetworkManager/dnsmasq-shared.d/Hue

dhcp-host=0c:4d:e9:a0:ce:cf,192.168.1.221

e reiniciado, embora executando

sudo service network-manager restart

teria funcionado.

Isso resultou no meu dispositivo obtendo o endereço IP apropriado.

Sim, isso está errado, porque significa que todas as chamadas do dnsmasq pelo NetworkManager receberão essa declaração, mas, neste caso, é inofensivo, porque só importa se o MAC aparecer na rede em questão. Se a rede não for 192.168.1, haverá problemas.

Isso é mais robusto do que substituir / usr / sbin / dnsmasq por um script, conforme proposto em https://gist.github.com/magnetikonline/6236150

A solução certa seria modificar como o dnsmasq é chamado para usar corretamente os arquivos de configuração do dnsmasq. Entendo o desejo de ter o Network Manager "apenas funcionando", mas tornar as ferramentas à prova de idiotas significa que apenas os idiotas podem usá-las.

Christopher Brooks
fonte
obrigado pela resposta Christopher, no entanto, eu realmente não sou capaz de seguir ... "Eu queria atribuir um MAC específico a um endereço IP específico e para fins de estabilidade" ... "ps auxgww | grep dnsmasq mostra que o último argumento da linha de comando de cada um dos processos dnsmasq " ... " que criei ... teria funcionado " ... " Sim, isso está errado " ... Ou seja, eu realmente não consigo seguir sua linha de pensamento , para fazer sentido o que você está tentando dizer aqui.
xpt
0

Minha solução pode quebrar o Network Manager e manter tudo de maneira simples. Com a maneira quebrada do NM de lidar com o dnsmasq, eu apenas o substitui pelo meu método abaixo.

Uma solução alternativa para o problema era simplesmente fazer o seguinte:

sudo apt install dnsmasq
cp /etc/dnsmasq.conf ~/

Edite o ~/dnsmasq.confarquivo no diretório do usuário como deseja e salve-o.

sudo rm -v /etc/dnsmasq.conf
sudo cp -v ~/dnsmasq.conf /etc/
sudo chattr +i /etc/dnsmasq.conf
sudo systemctl restart dnsmasq.service

Criei um alias simples do bash e coloquei na parte inferior do meu arquivo ~ / .bash_aliases para facilitar a edição do arquivo dnsmasq.conf. Aqui está o alias:

alias="sudo chattr -i /etc/dnsmasq.conf && sudo nano -w /etc/dnsmasq.conf && sudo chattr +i /etc/dnsmasq.conf && sudo systemctl restart dnsmasq.service"

Claro, você pode escolher qualquer editor que você goste do segundo comando sudo no pseudônimo, mas eu usei o nano lá para facilitar a todos. Salve o arquivo, feche e reabra a guia / janela do terminal de comando. Isso deve permitir que o alias esteja disponível para as abas / janelas do terminal recém-abertas.

Basta executar a eddmcpartir da sua conta de usuário e ela solicitará sua senha para executar os comandos elevados.

Observe que eu sempre chattr +io arquivo. Isso significa que o Network Manager não substituirá sua configuração por ela própria.

Nas conexões Ethernet com fio, não deve haver problemas. Descobri desde que uso o dnsmasq para cache de DNS em laptops com conexão sem fio que tenho que reiniciar manualmente o dnsmasq.service após conectar-me a um ponto de acesso. Acho que o Network Manager pode executar tarefas como reiniciar serviços ao conectar, mas ainda não examinei isso.

jpyper
fonte
0

Apesar das reivindicações aqui e em outros lugares, o NetworkManager ignora completamente todos e quaisquer arquivos de configuração do dmsmasq - mesmo aqueles em seu próprio diretório /etc/NetworkManager/dnsmasq-shared.d. A prova está no código fonte do NetworkManager ... Aqui está o comentário relevante:

/ * O dnsmasq pode ler a partir do local padrão do arquivo de configuração, que, se esse local for um arquivo de configuração válido, ele será combinado com as opções aqui e causará efeitos colaterais indesejáveis. Como enviar endereços IP falsos como gateway ou qualquer outra coisa. Diga ao dnsmasq para não usar nenhum arquivo de configuração. * /

Aqui está o link para o código fonte relevante (linhas 139-144).

bsalnick
fonte
2
Um link para apontar para o código fonte, para que os leitores possam validar isso e ler o código associado, seria útil, se possível.
jamesc
1
Então, sim, não se pode especificar um arquivo de configuração explícito. --conf-file é codificado para / dev / null. No entanto, se você observar a linha de comando completa usada para iniciar o dnsmasq por meio do NetworkManager, verá que o conf-dir é usado: '/ usr / sbin / dnsmasq --no-resolv --keep-in-foreground --no-hosts --bind-interfaces --pid-file = / var / run / NetworkManager / dnsmasq.pid --listen-address = 127.0.0.1 --cache-size = 400 --claro-no-recarregar --conf-file = / dev / null --proxy-dnssec --enable-dbus = org.freedesktop.NetworkManager.dnsmasq --conf-dir = / etc / NetworkManager / dnsmasq.d ', significando que todos os arquivos no diretório fornecido são lidos.
Hardy