O que sobrescreve o /etc/resolv.conf em cada inicialização?

23

Recebi os arquivos de um mini linux, que inicializa diretamente firefox. Funciona para tudo o que deveria estar fazendo, só que eu não tenho conexão com a Internet.

Temos 3 servidores DNS na rede, todos funcionando. Eu também posso fazer ping. Mas ao tentar ping google.deou wget google.derecebo um bad addresserro.

nslookup google.de funciona por algum motivo.

Rastreei o problema até o meu resolv.confno sistema inicializado, sem o mesmo conteúdo resolv.confque coloquei no .isoarquivo.

Tentei entender todos os fatores envolvidos na criação e modificação resolv.conf. Não tenho certeza de ter conseguido tudo, mas definitivamente não encontrei minha solução lá.

Então, como último esforço, tentei tornar o resolv.confarquivo imutável usando

:~# chattr +i /etc/resolv.conf

Ao reconstruir e inicializar novamente para minha surpresa, meu arquivo foi renomeado resolv.conf~e, em seu lugar, estava o mesmo arquivo padrão que me assombrava.

O conteúdo do arquivo me faz acreditar que obtém as informações da própria rede. Ao iniciar o .isoVirtualbox sem acesso à Internet, meu arquivo está sendo mantido como está.

Tentei mudar /etc/dhcp/dhclient.confpara não obter as informações da rede, excluindo domain-name-servere domain-name-searchda requestparte do arquivo.

Infelizmente não funcionou.

Não tenho o NetworkManager instalado. O iso é baseado no Ubuntu 14.04.

Provavelmente faltam informações vitais. Estou feliz em fornecê-lo.

ATUALIZAR:

Acho que encontrei o arquivo que limpa resolv.conf.

Parece ser /usr/share/udhcpc/default.script

#!/bin/sh

# udhcpc script edited by Tim Riker <[email protected]>

[ -z "$1" ] && echo "Error: should be called from udhcpc" && exit 1

RESOLV_CONF="/etc/resolv.conf"
[ - n "$broadcast" ] && BROADCAST="broadcast $broadcast"
[ -n "$subnet" ] && NETMASK="netmask $subnet"

case "$1" in
    deconfig)
        /bin/ifconfig $interface 0.0.0.0
        for i in /etc/ipdown.d/*; do
            [ -e $i ] && . $i $interface
        done
        ;;

    renew|bound)
        /bin/ifconfig $interface $ip $BROADCAST $NETMASK

        if [ -n "$router" ] ; then
            echo "deleting routers"
            while route del default gw 0.0.0.0 dev $interface ; do
                :
            done

            metric=0
            for i in $router ; do
                route add default gw $i dev $interface metric $((metric++))
            done
        fi

        echo -n > $RESOLV_CONF # Start ----------------  
        [ -n "$domain" ] && echo search $domain >> $RESOLV_CONF
        for i in $dns ; do
            echo adding dns $i
            echo nameserver $i >> $RESOLV_CONF
        done
        for i in /etc/ipup.d/*; do
            [ -e $i ] && . $i $interface $ip $dns 
        done # End ------------------
        ;;
esac

exit 0

Faz parte do udhcpcprograma. Um pequeno cliente dhcp, que faz parte dobusybox

Irá investigar mais.


ATUALIZAÇÃO2 E SOLUÇÃO:

Comentei a parte (#Start to #End), que aparentemente sobrescreve o /etc/resolv.confarquivo e com certeza. Esse foi o culpado. Portanto, um script obscuro causou todo esse problema.

Alterei a pergunta para refletir, o que realmente precisava ser conhecido para resolver meu problema, para que fosse mais fácil encontrar pessoas com o mesmo problema e para que eu pudesse aceitar uma resposta.

Obrigado pela ajuda aqui para descobrir as coisas.

Minix
fonte
1
Definir o sinalizador imutável em resolv.conf não funciona como o esperado, pois o arquivo não foi alterado. A entrada do diretório em / etc foi alterada quando o arquivo foi renomeado. Você teria que definir / etc para ser imutável - algo que você realmente não quer fazer.
doneal24
@ DougO'Neal eu vejo. Obrigado pela atenção.
Minix

Respostas:

24

1) Você não deve atualizar manualmente o seu resolv.conf, porque todas as alterações serão substituídas pelos dados fornecidos pelo servidor DHCP local. Se você quiser que seja estático, execute sudo dpkg-reconfigure resolvconfe responda "não" a atualizações dinâmicas. Se você quiser adicionar novas entradas, editar /etc/resolvconf/resolv.conf.d/basee executar sudo resolvconf -u, ele acrescentará suas entradas e as entradas do servidor DHCP.

2) Tente editar seu / etc / network / interfaces e adicione suas entradas, como

auto eth0 
iface eth0 inet dhcp 
dns-search google.com 
dns-nameservers dnsserverip 

e depois reinicie /etc/init.d/networking restartou sudo ifdown -aesudo ifup -a

3) Seu sistema usa udhcp, que é um programa cliente DHCP muito pequeno. O cliente udhcp negocia uma concessão com o servidor DHCP e notifica um conjunto de scripts quando uma concessão é obtida ou perdida. Você pode ler sobre o seu uso aqui ou apenas editar este script (como você fez).

Kirill-a
fonte
1
Eu adicionei as entradas no /etc/resolvconf/resolv.conf.d/basee executei resolvconf -u. Infelizmente não funcionou.
Minix
Você tentou executar o sudo dpkg-reconfigure resolvconf? Após executar o resolvconf -u, suas entradas não estavam no arquivo de resultado? Como você os adicionou, como "nameserver 127.0.0.1" ou "search google.com"?
kirill-a
Eu corri dpkg-reconfigure resolvconf. As entradas não estavam lá. E eu tenho entradas com ambos nameserver ipe search domain.
Minix
Não, a execução dpkg-reconfigure resolvconfnão adicionará entradas, mas você pode desativar as atualizações automáticas. Se você desativar as atualizações, poderá editar o resolv.conf manualmente e não deverá ser substituído.
kirill-a
Meu mal por formulá-lo tão desajeitadamente, eu estava respondendo seu comentário frase por frase. Após a execução, resolvconf -uas entradas não foram adicionadas.
Minix
4

Eu também encontrei isso. Comentar domain-name-servertambém não foi corrigido para mim.

Além disso, eu não estou usando resolvconf, simplesmente /etc/resolv.conf.

Eu não tentei usar chattr +ipara bloquear resolv.confporque parece muito hacky. Além disso, quero que o Puppet seja capaz de modificar resolv.confquando necessário.

A melhor solução que encontrei substitui o comportamento padrão do dhclientuso de seus ganchos documentados.

Crie um novo arquivo /etc/dhcp/dhclient-enter-hooks.d/nodnsupdatecom o seguinte conteúdo:

#!/bin/sh
make_resolv_conf() {
    :
}

Em seguida, torne o arquivo executável:

chmod +x /etc/dhcp/dhclient-enter-hooks.d/nodnsupdate

Agora, quando o dhclient é executado - na reinicialização ou quando você é executado manualmente sudo ifdown -a ; sudo ifup -a- ele carrega esse script nodnsupdate. Esse script substitui uma função interna chamada make_resolv_conf()que normalmente substituiria resolv.confe, em vez disso, não faz nada.

Isso funcionou para mim no Ubuntu 12.04.

richardkmiller
fonte
Não funcionou no Ubuntu 18.04 :( /etc/resolv.conffoi substituído após a reinicialização.
Dan Dascalescu 21/10
3

Ubuntu 16.04 Se as interfaces de rede da instância do servidor forem controladas pelo DHCP, o programa dhclient substituirá seu /etc/resolv.confarquivo sempre que o serviço de rede for reiniciado.

Você pode corrigir o problema editando o /etc/dhcp/dhclient.confarquivo e adicionando declarações “substituem” para domain-name , domínio de pesquisa e domain-name-servers como segue:

supersede domain-name "local.com";
supersede domain-search "local.com";
supersede domain-name-servers 192.168.56.103;

Nesse caso específico, o servidor de nomes está localizado em "192.168.56.103" e o nome do domínio é "local.com"

Observe que cada linha é terminada por ponto e vírgula e o nome do domínio é colocado entre aspas duplas.

Sand1512
fonte
Infelizmente isso não funcionou no Ubuntu 18.04. Após a reinicialização, /etc/resolv.conffoi substituído por 127.0.0.53.
Dan Dascalescu 21/10
Pode ser que você possa tentar este askubuntu.com/questions/1031279/…
Sand1512
Verifique também se você está executandodnsmasq
Sand1512
0

vá para este diretório:

  cd /etc/resolvconf/resolv.conf.d

Abra o arquivo chamado head e insira os IPs ou nomes DNS. Abra o arquivo chamado tail e coloque o domínio lá. Reinicie.

user245423
fonte
Esse diretório não existe por padrão no Ubuntu 18.04. Você precisa instalar um serviço que o cria?
Dan Dascalescu 21/10
0

Nas VMs do Azure, o /etc/resolv.conf não é diretamente editável.

Tente adicionar todos os DNS nos arquivos de configuração de rede / etc / sysconfig / network-scripts / ifcfg-eth0 e assim por diante, como abaixo:

DOMAIN = example.com

DNS1 = 10. . . *
DNS2 = 10. . . *
DNS3 = 10. . . *

e reinicie o serviço de rede depois de salvar os arquivos. você verá que a configuração também será adicionada ao resolve.conf.

Krishan
fonte
0

Para tornar as alterações relacionadas ao DNS resolv.confpermanentes, você precisa alterar o arquivo de configuração DHCP nomeado dhclient.conf. Você pode encontrar o arquivo em /etc/dhcp/dhclient.conf.

Abra o arquivo para edição (não se esqueça de usar o sudo). Você verá linhas como estas:

#supersede domain-name "fugue.com home.vix.com";
#prepend domain-name-servers 127.0.0.1;

Remova o "#" anterior e use os servidores de nome de domínio e / ou nome de domínio que você deseja. Salve isso. Agora as alterações relacionadas ao DNS serão permanentes.

Os créditos vão para: https://itsfoss.com/resolvconf-permanent-ubuntu/

MAChitgarha
fonte
Esta resposta já havia sido dada 2 anos antes .
Dan Dascalescu 21/10
0

Use o comando abaixo para impedir que o resolv.conf ou qualquer arquivo seja substituído após a reinicialização

nome do arquivo chattr -V + i, por exemplo, chattr -V + i /etc/resolv.conf

Para reverter a alteração Use o comando abaixo:

chattr -i filename - para reativar a inserção no arquivo

chattr (Change Attribute) é um utilitário Linux de linha de comando usado para definir / desabilitar certos atributos em um arquivo no sistema Linux para garantir exclusão ou modificação acidental de arquivos e pastas importantes, mesmo que você esteja logado como usuário root.

Ashish Jain
fonte
Eu acredito que o usuário na pergunta realmente tentou chattr, mas obverveu que isso não teve efeito.
Kusalananda
Isso funcionará com certeza, a opção que o usuário tentou é editar o arquivo e não torná-lo imutável
Ashish Jain
Por favor, execute o comando com o nome de arquivo sudo chattr -V + i, por exemplo, sudo chattr -V + i /etc/resolv.conf
Ashish Jain
-1

No ubuntu 18.04, usando o NetworkManager. Você precisa remover o arquivo 'resolv.conf' e deixar o NetworkManager gerar um para você.

Para remover o arquivo no tipo de terminal sudo rm -f /etc/resolv.conf; isso excluirá o arquivo para você.

Reinicialize o sistema e o NetworkManager gerará um arquivo resolv.conf para você.

mabvutosicho
fonte