link local (fe80: :) endereços sem escopo fazem o seu caminho em /etc/resolv.conf e causam problemas

3

Estou com problemas de conectividade intermitentes. Um endereço local de link ipv6 é automaticamente adicionado ao meu /etc/resolv.conf, e isso parece fazer com que o resolvedor da libc falhe na resolução. Gostaria de saber como impedir que esse endereço seja inserido lá ou encontrar uma solução alternativa adequada.

Minha configuração: Eu tenho uma configuração de implantação de desktop do Ubuntu 14.04 com ipv4 e ipv6. Ele tem apenas uma conexão com fio (sem wifi) para uma porta lan de um roteador doméstico que executa o OpenWrt. A rede da área de trabalho é gerenciada pelo NetworkManager, que executa sua própria cópia local do dnsmasq. Todos os arquivos do gerenciador de rede em / etc estão "em estoque", não os toquei.

Quando eu reinicio minha rede via gerenciador de rede, tudo funciona bem (mas apenas por alguns minutos). Minha configuração de trabalho do resolv.conf parece assim:

user@foo:/$ cat /etc/resolv.conf
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by     
resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 127.0.1.1
search lan

Meu roteador (192.168.1.1 ou fe80 :: beef) também executa uma cópia do dnsmasq e está configurado para anunciar 192.168.1.1 (próprio) para seus clientes dhcp na v4. Na v6, ele envia periodicamente mensagens de anúncio de roteador (icmpv6.type == 134) com uma opção de servidor DNS recursivo para fe80 :: beef. O serviço DNS dnsmasq do roteador está escutando nos dois endereços: .1.1 e :: beef (o endereço do link ipv6 da bridge lan do roteador).

# working dns server. ran from the desktop.
user@foo:/$ dig google.com +time=1 @fe80::beef > /dev/null ; echo $?
0

A qualquer momento, se eu for para "Informações de conexão" no NetworkManager, meu DNS primário e roteador no Ipv4 serão definidos como 182.168.1.1. A GUI do NetworkManager não mostra nenhuma informação sob o cabeçalho da seção "ipv6" - mas o meu nic recebe endereços ipv6 (slaac e stateful dhcpv6) que eu posso ver com ip addr show .

O problema: Depois de redefinir minha rede via gerenciador de rede (alternar "Habilitar Rede") e aguardar (ou seja, aguardar até a próxima mensagem de anúncio do roteador, suspeito), uma nova entrada faz o caminho até /etc/resolv.conf :

user@foo:~$ cat /etc/resolv.conf
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver fe80::beef
nameserver 127.0.1.1
search lan

O problema é que, quando isso acontecer, algumas ferramentas do usuário (incluindo o firefox e o google-chrome) não conseguirão resolver nomes de domínio (não armazenados em cache).

Até onde eu sei, trabalhar com endereços locais de links requer que o escopo de um link seja mencionado explicitamente. O rastreamento a seguir mostra como connect falha sem o escopo do link (default_do_escopo de 0).

user@foo:~$ strace ping google.com
execve("/bin/ping", ["ping", "google.com"], [/* 73 vars */]) = 0
...

stat("/etc/resolv.conf", {st_mode=S_IFREG|0644, st_size=220, ...}) = 0
socket(PF_INET6, SOCK_DGRAM|SOCK_NONBLOCK, IPPROTO_IP) = 3
connect(3, {sa_family=AF_INET6, sin6_port=htons(53), inet_pton(AF_INET6, "fe80::beef", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28) = -1 EINVAL (Invalid argument)
close(3)                                = 0
socket(PF_INET6, SOCK_DGRAM|SOCK_NONBLOCK, IPPROTO_IP) = 3
connect(3, {sa_family=AF_INET6, sin6_port=htons(53), inet_pton(AF_INET6, "fe80::beef", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28) = -1 EINVAL (Invalid argument)
close(3)                                = 0
write(2, "ping: unknown host google.com\n", 29ping: unknown host google.com) = 29
exit_group(2)                           = ?
+++ exited with 2 +++

O DNS falha, mas eu tenho conectividade de outra forma:

user@foo:~$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=60 time=7.77 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=60 time=7.81 ms
....

user@foo:~$ ping6 2607:f8b0:400a:808::200e  # google.com AAAA
PING 2607:f8b0:400a:808::200e(2607:f8b0:400a:808::200e) 56 data bytes
64 bytes from 2607:f8b0:400a:808::200e: icmp_seq=1 ttl=57 time=7.94 ms
64 bytes from 2607:f8b0:400a:808::200e: icmp_seq=2 ttl=57 time=7.86 ms
...

Adicionar o escopo (% eth0) ao final do endereço no resolv.conf corrige o problema:

nameserver fe80::beef%eth0
nameserver 127.0.1.1
search lan

Mas, claro, essa mudança será eliminada na próxima vez.

Existe alguma maneira de:

  • Força o ipv4 apenas a consultar o DNS (acho que não executarei uma configuração do ipv6 em breve)?
  • Especifique um escopo de interface padrão no resolvedor (por exemplo, "% eth0")?
  • Altere o dnsmasq (ou radvd, ou rdnss) do roteador para não anunciar seu endereço ipv6 para DNS (somente seu ipv4)?

Editar: falha na tentativa de correção

Se eu mover o link simbólico /etc/resolv.conf para /etc/resolv.conf.old e escrever meu próprio /etc/resolv.conf estático contendo apenas o servidor dnsmasq local ip (nameserver 127.0.1.1), descubro que o arquivo ainda está sendo modificado por outra coisa que adiciona uma linha de "pesquisa".

user@foo:~$ cat /etc/resolv.conf  # my new file, not the symlink
# Edited by hand to avoid using the ipv6 link local scopeless address
# check resolv.conf.old to see normal file
#nameserver fe80::beef
nameserver 127.0.1.1
search lan

Depois de um tempo:

user@foo:~$ cat /etc/resolv.conf  # my new file prefixed by something
search lan.
# Edited by hand to avoid using the ipv6 link local scopeless address
# check resolv.conf.old to see normal file
#nameserver fe80::beef
nameserver 127.0.1.1
search lan

Após uma reinicialização:

user@foo:~$ cat /etc/resolv.conf  # eh. same line added again.
search lan.
search lan.
# Edited by hand to avoid using the ipv6 link local scopeless address
# check resolv.conf.old to see normal file
#nameserver fe80::beef
nameserver 127.0.1.1
search lan

a menos que eu comece a jogar com o chattr + i e outros truques para evitar que o script (ou seja o que for) toque em /etc/resolv.conf, sinto que esta opção semi-estática não está realmente limpa. A prestação de contas quando esses arquivos são alterados ou o registro em log seria um acréscimo. syslog não tem nada.

Observação: em uma tentativa de ocultar algumas informações particulares, modifiquei os sufixos de endereço e os nomes de host acima

    
por init_js 31.08.2016 / 23:32

1 resposta

0
___ qstntxt ___

Estou com problemas de conectividade intermitentes. Um endereço local de link ipv6 é automaticamente adicionado ao meu /etc/resolv.conf, e isso parece fazer com que o resolvedor da libc falhe na resolução. Gostaria de saber como impedir que esse endereço seja inserido lá ou encontrar uma solução alternativa adequada.

Minha configuração: Eu tenho uma configuração de implantação de desktop do Ubuntu 14.04 com ipv4 e ipv6. Ele tem apenas uma conexão com fio (sem wifi) para uma porta lan de um roteador doméstico que executa o OpenWrt. A rede da área de trabalho é gerenciada pelo NetworkManager, que executa sua própria cópia local do dnsmasq. Todos os arquivos do gerenciador de rede em / etc estão "em estoque", não os toquei.

Quando eu reinicio minha rede via gerenciador de rede, tudo funciona bem (mas apenas por alguns minutos). Minha configuração de trabalho do resolv.conf parece assim:

--- /etc/wide-dhcpv6/dhcp6c-script.orig 2016-09-04 17:12:35.405042056 -0700
+++ /etc/wide-dhcpv6/dhcp6c-script.new  2016-09-04 22:57:05.213169351 -0700
@@ -6,20 +6,48 @@

 [ -f /etc/default/wide-dhcpv6-client ] && . /etc/default/wide-dhcpv6-client

+# Guess interface to use as scope_id. Ideally, dhcp6c would pass the
+# name of the interface on which the DHCPv6 reply was received.
+scope=""
+for IFACE in $INTERFACES; do
+    scope="$IFACE"
+    break;
+done
+
+# exact line match. grep would interpret domain periods as special
+# chars.  The naive loop avoids relying on other non-coreutils
+# commands (sed, awk, etc.).
+has_line () {
+    local line
+    while read line; do
+    if [ "$line" = "" ]; then
+       return 0
+    fi
+    done
+    return 1
+}
+    
+
 if [ -n "$new_domain_name" -o -n "$new_domain_name_servers" ]; then
     old_resolv_conf=/etc/resolv.conf
     new_resolv_conf=/etc/resolv.conf.dhcp6c-new
     rm -f $new_resolv_conf
     if [ -n "$new_domain_name" ]; then
-        echo search $new_domain_name >> $new_resolv_conf
+   has_line "search $new_domain_name" < $old_resolv_conf || {
+       echo "search $new_domain_name" >> $new_resolv_conf
+   }
     fi
     if [ -n "$new_domain_name_servers" ]; then
         for nameserver in $new_domain_name_servers; do
+       if [ -n "$scope" -a "${nameserver##fe80::}" != "$nameserver" ]; then
+          nameserver="$nameserver%$scope"
+       fi
+
             # No need to add an already existing nameserver
-            res=$(grep "nameserver $nameserver" $old_resolv_conf)
-            if [ -z "$res" ]; then
-                echo nameserver $nameserver >> $new_resolv_conf
-            fi
+       has_line "nameserver $nameserver" < $old_resolv_conf || {
+                echo "nameserver $nameserver" >> $new_resolv_conf
+       }
         done
     fi

Meu roteador (192.168.1.1 ou fe80 :: beef) também executa uma cópia do dnsmasq e está configurado para anunciar 192.168.1.1 (próprio) para seus clientes dhcp na v4. Na v6, ele envia periodicamente mensagens de anúncio de roteador (icmpv6.type == 134) com uma opção de servidor DNS recursivo para fe80 :: beef. O serviço DNS dnsmasq do roteador está escutando nos dois endereços: .1.1 e :: beef (o endereço do link ipv6 da bridge lan do roteador).

# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 192.168.1.1
nameserver fe80::beef%eth0
search lan

A qualquer momento, se eu for para "Informações de conexão" no NetworkManager, meu DNS primário e roteador no Ipv4 serão definidos como 182.168.1.1. A GUI do NetworkManager não mostra nenhuma informação sob o cabeçalho da seção "ipv6" - mas o meu nic recebe endereços ipv6 (slaac e stateful dhcpv6) que eu posso ver com wide-dhcpv6-client .

O problema: Depois de redefinir minha rede via gerenciador de rede (alternar "Habilitar Rede") e aguardar (ou seja, aguardar até a próxima mensagem de anúncio do roteador, suspeito), uma nova entrada faz o caminho até dhcp6c :

# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver fd00:cafe::1
nameserver 127.0.1.1
search lan

O problema é que, quando isso acontecer, algumas ferramentas do usuário (incluindo o firefox e o google-chrome) não conseguirão resolver nomes de domínio (não armazenados em cache).

Até onde eu sei, trabalhar com endereços locais de links requer que o escopo de um link seja mencionado explicitamente. O rastreamento a seguir mostra como /etc/init.d/wide-dhcpv6-client falha sem o escopo do link (default_do_escopo de 0).

# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 192.168.1.1
nameserver fd00:cafe::1
nameserver fe80::beef%eth0
search lan

O DNS falha, mas eu tenho conectividade de outra forma:

#!/bin/bash

# logs all interactions to /sbin/resolvconf into syslog
# this script is named /sbin/resolvconf, temporarily.
# moved resolvconv binary to resolvconf.real, temporarily.

BIN=/sbin/resolvconf.real
LOGGER=/usr/bin/logger

ppid () { ps -p ${1:-$$} -o ppid= 2>/dev/null | sed 's/ //g'; }

PROC=$$

"$LOGGER" "resolvconf.wrapper args: $@"

for ((i=0; i<4; i++)); do
    PROC=$(ppid $PROC)
    if [[ "$PROC" == 0 || "$PROC" == "" ]]; then
    break;
    fi
    if [[ "$i" -eq 0 ]]; then
    "$LOGGER" "resolvconf.wrapper invoked by: pid=$PROC $(/bin/ps -p $PROC -o command=)"
    else
    "$LOGGER" "resolvconf.wrapper child of: pid=$PROC $(/bin/ps -p $PROC -o command=)"
    fi
done

# peek at stdin (which contains the config)
if [[ "" == "-a" ]] && [[ -n "" ]]; then
    tmp=$(/bin/mktemp)
    while read REST; do
    logger "resolvconf.wrapper feeding: $REST"
    echo $REST >> "$tmp"
    done
    exec < "$tmp"
    rm "$tmp"
fi

exec -a /sbin/resolvconf "$BIN" "$@"

Adicionar o escopo (% eth0) ao final do endereço no resolv.conf corrige o problema:

Sep  3 02:32:29 calm logger: resolvconf.wrapper invoked by: pid=12610 sh -c /sbin/resolvconf -a NetworkManager
Sep  3 02:32:29 calm logger: resolvconf.wrapper child of: pid=11910 NetworkManager
Sep  3 02:32:29 calm logger: resolvconf.wrapper child of: pid=1 /sbin/init
Sep  3 02:32:29 calm logger: resolvconf.wrapper feeding: # Generated by NetworkManager
Sep  3 02:32:29 calm logger: resolvconf.wrapper feeding: domain base
Sep  3 02:32:29 calm logger: resolvconf.wrapper feeding: search base base.
Sep  3 02:32:29 calm logger: resolvconf.wrapper feeding: nameserver 127.0.1.1
...
Sep  3 02:14:23 calm logger: resolvconf.wrapper gparent: pid=1553 /usr/sbin/dhcp6c -Pdefault eth0
Sep  3 02:14:23 calm logger: resolvconf.wrapper invoked by: pid=15926 /bin/sh /etc/wide-dhcpv6/dhcp6c-script
Sep  3 02:14:23 calm logger: resolvconf.wrapper args: -a eth0
Sep  3 02:14:23 calm logger: resolvconf.wrapper feeding: search base.
Sep  3 02:14:23 calm logger: resolvconf.wrapper feeding: nameserver fd00:cafe::1

Mas, claro, essa mudança será eliminada na próxima vez.

Existe alguma maneira de:

  • Força o ipv4 apenas a consultar o DNS (acho que não executarei uma configuração do ipv6 em breve)?
  • Especifique um escopo de interface padrão no resolvedor (por exemplo, "% eth0")?
  • Altere o dnsmasq (ou radvd, ou rdnss) do roteador para não anunciar seu endereço ipv6 para DNS (somente seu ipv4)?

Editar: falha na tentativa de correção

Se eu mover o link simbólico wide-dhcpv6-client para /etc/wide-dhcpv6/dhcp6c.conf e escrever meu próprio /etc/wide-dhcpv6/dhcp6c-script estático contendo apenas o servidor dnsmasq local ip (nameserver 127.0.1.1), descubro que o arquivo ainda está sendo modificado por outra coisa que adiciona uma linha de "pesquisa".

%pre%

Depois de um tempo:

%pre%

Após uma reinicialização:

%pre%

a menos que eu comece a jogar com o chattr + i e outros truques para evitar que o script (ou seja o que for) toque em /etc/resolv.conf, sinto que esta opção semi-estática não está realmente limpa. A prestação de contas quando esses arquivos são alterados ou o registro em log seria um acréscimo. syslog não tem nada.

Observação: em uma tentativa de ocultar algumas informações particulares, modifiquei os sufixos de endereço e os nomes de host acima

    
___ tag123dhcp ___ O protocolo DHCP (Dynamic Host Configuration Protocol) é um protocolo de configuração de rede que atribui endereços IP e configuração de gateway automaticamente. ___ tag123ipv6 ___ Versão 6 do protocolo da internet, que substituirá a versão 4. ___ tag123dnsmasq ___ O DNSmasq é um servidor DNS forwarder, DHCP e TFTP leve, projetado para fornecer serviços de DNS (e opcionalmente DHCP e TFTP) a uma rede de pequena escala. ___ qstnhdr ___ link local (fe80: :) endereços sem escopo fazem o seu caminho em /etc/resolv.conf e causam problemas ___ tag123networking ___ Gerenciando e usando conectividade de rede em um sistema Ubuntu ___
por init_js 02.09.2016 / 07:28
Eclipse piscando na nova linha ___ qstntxt ___

Tentando pensar em informações que vocês podem se importar ...

  • instalado junto com o windows 7, partição criada no gerenciamento de disco do windows 7

  • atualizações baixadas e materiais proprietários, quaisquer que sejam as duas caixas de seleção durante a instalação

  • especificações: MOBO - Gigabyte H170N || ARMAZENAMENTO - Samsung 850 EVO || CPU - i5-6600 || GPU - MSI 1070 Gaming X

  • a lentidão começa no grub, afetando a tela de login também

  • afeta tudo, digita, clica, movimenta janelas ao redor, há um atraso de vários segundos depois de tudo - exceto o mouse, que tem um atraso de entrada claro, mas apenas de algumas centenas de milissegundos e desenha no visor 24 quadros por segundo, em vez de 1 quadro por segundo, como o resto da interface parece.

O mouse e o teclado funcionam, o wifi funciona, ele pode acessar as pastas do windows, se algo não estiver funcionando, eu não notei. Mas se eu clicar em qualquer coisa, demora um ou dois segundos para responder, e você vê isso ser desenhado na tela de cima para baixo. Se um item for fechado a partir da barra à esquerda, a animação será SUPER agitada, como assistir 5 quadros ao longo de 1 a 2 segundos.

Eu sinto que isso é uma solução simples, como um problema de driver ou algo óbvio. Alguma idéia?

EDIT: OMG é fixo. Eu sinto que isso poderia acontecer com alguém, então aqui está o que eu fiz. Fui para as configurações do sistema & gt; Detalhes & gt; Instalar atualizações. Levou um minuto ou dois fazendo algumas coisas, então me pediu para reiniciar. Tem sido muito rápido (como deveria ser neste sistema high end) desde a reinicialização, e suponho que vai durar. Boa sorte lá fora noobs.

    
___