Como usar o dnsmasq com servidores DNS atribuídos por DHCP?

6

TL; DR version: Como configuro o dnsmasq para voltar aos servidores DNS apontados pelo servidor DHCP na minha LAN, para permitir a troca de redes sem fio?

No meu laptop de desenvolvedor, comecei recentemente a usar o dnsmasq para poder capturar todo o tráfego para * .dev e redirecioná-lo para uma máquina virtual (usando mod_vhost_alias).

Para que isso funcione, eu precisava definir minhas configurações de rede para que o dnsmasq (em execução em 127.0.0.1) seja usado como o servidor DNS primário e os servidores DNS regulares sejam secundários - causando um retorno a esses servidores DNS quando dnsmasq puder Não manipule uma pesquisa de domínio. Isso funciona bem, exceto pelo fato de que os servidores DNS substitutos agora não são mais configurados por meio do DHCP. Sempre que eu alterno redes sem fio, isso interrompe minha conexão - especialmente em redes que exigem autenticação por meio de uma página da Web (caso contrário, usar um servidor DNS público como 8.8.8.8 seria uma opção).

Eu tentei ler a documentação do dnsmasq, mas nenhuma das opções de zilhão parecia fazer o que eu precisava, ou talvez eu esteja entendendo mal o que algumas das opções fazem.

Nota: esta questão foi originalmente publicada no ServerFault, considerando a natureza de servidor do dnsmasq. Foi imediatamente fechado devido ao Mac OS X não ser um sistema operacional de servidor. Eu não tenho reputação suficiente para iniciar um movimento, então contra o meu melhor julgamento eu estou cruzando para SU.

    
por Sander Bol 06.03.2013 / 09:07

3 respostas

14

Parece que você está tentando alcançar exatamente a mesma coisa que eu acabei de configurar no meu novo MacBook e já trabalhei nas minhas máquinas de desenvolvimento do Linux.

Como você sabe, adicionar 127.0.0.1 manualmente às entradas de DNS nas configurações de rede é um problema, pois precisa ser reaplicado ao mudar as interfaces de rede / conectar-se a pontos de acesso Wi-Fi alternados e também impedir que sua máquina ative automaticamente o DNS. servidores atribuídos através do DHCP. Felizmente, a solução a seguir evita completamente ter que mexer com suas configurações de rede para que você possa usar o DHCP normalmente.

Primeiro, se você adicionou manualmente 127.0.0.1 manualmente e servidores DNS externos à sua interface de rede, agora é a hora de excluí-los e redefini-los de volta aos padrões do DHCP.

Feito isso, você precisa criar a pasta / etc / resolver.

sudo mkdir /etc/resolver

Dentro desta pasta, agora você pode adicionar arquivos de texto nomeados por domínio para corresponder e conter entradas de servidor de nomes a serem usadas para essas solicitações correspondentes. O OS X procurará automaticamente nesta pasta por regras, por isso é tão simples assim.

Portanto, para sua configuração (igual à minha), queremos criar um arquivo de texto chamado / etc / resolver / dev (para capturar todos os pedidos para * .dev) contendo uma entrada padrão de servidor de nomes para 127.0.0.1 (IP local usado por dnsmasq).

sudo bash -c 'echo "nameserver 127.0.0.1" > /etc/resolver/dev'

Agora, todas as solicitações de DNS para domínios * .dev serão passadas para o dnsmasq em 127.0.0.1 e qualquer coisa que não corresponda ao * .dev será tratada normalmente por qualquer servidor DNS que seu DHCP tenha escolhido.

    
por 27.03.2013 / 19:05
1

Aqui está a solução que eu criei:

Estou usando Growl e HardwareGrowler para acionar um script que grava um arquivo de resolução que o dnsmasq está configurado para usar.

Talvez eu esteja entendendo mal (a situação da documentação do Growl é bastante carente), mas eu pensei que o Growl 2.1 tinha a capacidade de acionar um script de shell, diretamente no diretório correto. Eu não consegui fazer isso funcionar, no entanto. Então, em vez disso, estou usando um script de regras do Applescript para executar o script de shell da seguinte maneira ...

Em ~ / Biblioteca / Scripts de Aplicativos / com.Growl.GrowlHelperApp / Rules.scpt:

using terms from application "Growl"
on evaluate notification with notification
    --Rules go in here
    if notification's note title contains "IP Address" then
        set shell_result to do shell script "/usr/local/sbin/set_nameservers.sh"
    end if
    --Ultimately return what you want Growl to do with the notification
end evaluate notification
end using terms from

Em seguida, meu script /usr/local/sbin/set_nameservers.sh:

#!/bin/bash

# locking variables
LOCKDIR="/tmp/nameservers.lock"
PIDFILE="${LOCKDIR}/nameservers.pid"

# Temporary file for discovered nameservers
TMP_NAMESERVERS_FILE="${LOCKDIR}/nameservers.conf"
# List of public nameservers to add to the list
PUB_NAMESERVERS_FILE="/etc/nameservers_public.conf"
# The nameserver list read in by dnsmasq
SYS_NAMESERVERS_FILE="/etc/nameservers.conf"

# Commands
GROWL="/usr/local/bin/growlnotify"

# Setup a lock in case Growl triggers this script multiple times due to multiple network changes
if mkdir "${LOCKDIR}"; then
    echo "$$" >"${PIDFILE}";
    echo "# DHCP supplied nameserves:" > "${TMP_NAMESERVERS_FILE}";

    # 1) For each interface listed by the networksetup command...
    while IFS=" " read -r -a interfaces;
    do
        ((int_count = ${#interfaces[@]} - 1));
        for ((i = 0; i <= int_count; i++));
        do
        # 2) Try to get a nameserver from DHCP. (Only the first of multiple is returned)
        nameserver='/usr/sbin/ipconfig getoption ${interfaces[i]} domain_name_server'
        # 3) If a nameserver was returned, add it to our configuration.
        if [ ${nameserver} ]; then
            echo "nameserver" ${nameserver} >> ${TMP_NAMESERVERS_FILE};
        fi
        done
    done <<< 'networksetup -listallhardwareports | grep Device | sed 's/Device: //g''

# 4) If a file of public nameservers exists, add these to our configuration.
if [ -e ${PUB_NAMESERVERS_FILE} ]; then
    cat ${PUB_NAMESERVERS_FILE} >> ${TMP_NAMESERVERS_FILE};
fi
cp ${TMP_NAMESERVERS_FILE} ${SYS_NAMESERVERS_FILE};

# Display a Growl notification showing what our new nameserver config looks like.
${GROWL} -d "us.loranz.steve.set_nameservers" \
         -N "Nameserver Configuration" \
         -m "'cat ${SYS_NAMESERVERS_FILE}'" \
         "System nameservers set to:";

rm -rf "${LOCKDIR}";
else
# Display an informational message if we failed to establish a lock.
${GROWL} -d "us.loranz.steve.set_nameservers" \
         -N "Nameserver Configuration Failed" \
         -m "$0 ($$) failed to run, lock already established by process: " 'cat ${PIDFILE}' \
         "Failed to set nameservers:";
exit 1;
fi

exit 0

Em seguida, configurei o HardwareGrowler para mostrar eventos de rede e o Growl para disparar uma ScriptAction para o endereço IP alterado, o link de rede para baixo e o link de rede para cima.

Por fim, eu configurei meu servidor de nomes nas preferências de rede como 127.0.0.1, de modo que eu esteja atingindo o dnsmasq.

O dnsmasq é então configurado com as seguintes opções:

resolv-file=/etc/nameservers.conf
all-servers

A primeira linha aponta o dnsmasq para o arquivo que o script acima está preenchendo com servidores de nomes descobertos via DHCP e qualquer servidor público que você queira.

A segunda linha deve permitir que o dnsmasq envie uma consulta para todos os servidores de nomes que conhece e aceite a primeira resposta. O resolvedor do Mac OS X deve evitar a necessidade dos arquivos do resolvedor e da pesquisa de domínio DHCP ... e confiar nisso faria de você um internauta melhor do que consultar todos os servidores da sua lista a cada vez. Eu posso remover essa opção depois de mais alguns testes e apreciaria qualquer insight que alguém tenha sobre isso.

    
por 15.02.2014 / 02:30
0

Se eu entendi bem o cenário - e posso estar fora da base, não entendo completamente o que você está tentando fazer ou onde está ocorrendo o problema - acho que há duas partes / elementos para resolver o problema -

  1. Use o endereço IP associado à placa de rede na sua caixa para DNSMasq, em vez depois 127.0.0.1.

  2. O DNSMasq lê o /etc/resolv.conf para ler os servidores de nomes que deve usar onde não é autoritário. (Se você quiser, você pode alterá-lo para ler outro arquivo com a opção --resolv-file (-r) .Praticamente você precisaria especificar servidores DNS recursivos que podem ser consultados de qualquer lugar - por exemplo, Googles on 8.8.8.8 que Eu ficaria extremamente surpreso se houvesse uma maneira "integrada" para o DNSMasq pegar os servidores de nomes automaticamente de um servidor DHCP - embora isso possa acontecer indiretamente se seu Cliente DHCP estiver reescrevendo seu arquivo resolv.conf - mas isso não parece ser o caso para você.

por 06.03.2013 / 10:01