Convença o apt-get * not * a usar o método IPv6

239

O ISP em que trabalho está configurando uma rede IPv6 interna em preparação para, eventualmente, conectar-se à Internet IPv6. Como resultado, vários servidores nesta rede agora tentam se conectar ao security.debian.org por meio do endereço IPv6 por padrão durante a execução apt-get update, e isso resulta em ter que esperar um longo tempo de espera sempre que estou baixando atualizações de qualquer tipo .

Existe uma maneira de dizer ao apt que prefere o IPv4 ou ignora completamente o IPv6?

Shadur
fonte
3
Isso não deveria retornar imediatamente com uma falha de roteamento?
Pjc50 23/03
7
Não, é perfeitamente possível que a rede interna deles tenha roteamento entre várias sub-redes (e os hosts tenham um gateway padrão IPv6), mas nenhuma conectividade IPv6 com o mundo externo.
Andrew Medico 23/03
5
Há provavelmente uma maneira de configurar /etc/gai.confde forma que security.debian.orgé um registro são devolvidos antes do registro AAA, mas eu não sei exatamente o que colocar no arquivo.
Gilles
3
@AndrewMedico - mas os gateways padrão de sua rede não deveriam saber que não há conectividade externa IPV6 e rejeitar a tentativa de saída na borda rapidamente? Eu acho que há um problema de rede aqui, bem como a pergunta que está sendo feita.
Michael Kohne
7
Corrigir o roteador de borda / firewall / o que está causando o problema é a "melhor" maneira de lidar com isso. Ele deve estar retornando um pacote inacessível de destino ICMP. Isso não está acontecendo ou algo está bloqueando. De qualquer forma, o problema deve ser relatado ao pessoal da sua rede.
Michael Hampton

Respostas:

319

Adicionar -o Acquire::ForceIPv4=trueao executar apt-get.

Se você quiser tornar a configuração persistente, basta criar /etc/apt/apt.conf.d/99force-ipv4 e colocar Acquire::ForceIPv4 "true";nela:

echo 'Acquire::ForceIPv4 "true";' | sudo tee /etc/apt/apt.conf.d/99force-ipv4

Opções de configuração Acquire::ForceIPv4e Acquire::ForceIPv6foram adicionadas à versão 0.9.7.9 ~ exp1 (consulte o bug 611891 ), disponível desde o Ubuntu Saucy (lançado em outubro de 2013) e Debian Jessie (lançado em abril de 2015).

mmoya
fonte
7
Movendo o "aceito" para este; embora a resposta original de 30 pontos esteja perfeitamente correta, ela é aplicável em uma escala muito mais ampla, enquanto fornece a opção de restringir apenas o apt-get.
Shadur
Por favor, seja adequadamente descritivo em sua resposta. -o Acquire :: ForceIPv4 = true é a adição ao comando para permitir que um usuário use ipv4
Kendrick
Resposta atualizada seguindo a sugestão de Kendrick
mmoya
1
A julgar pelo resto do meu, apt.confvocê precisa escrevê-lo assim: Acquire::ForceIPv4 "true";(com aspas duplas)
mirabilos
6
@ZAB porque se você não tem acesso de gravação para o arquivo, sudo echo 'test' > filenão iria funcionar porque o redirecionamento é executado com as permissões do usuário
LeartS
81

Como Gilles diz , use gai.conf. Notas:

  1. Isso funciona em um nível muito mais baixo (redes DNS e IP) do que o APT, portanto, mudará a forma como todos os seus aplicativos em rede - pelo menos, todo esse uso getaddrinfo.
  2. Antes de editar o seu gai.conf, você deve fazer o backup e também ler (não se preocupe, é breve). As edições abaixo provavelmente já foram mencionadas no seu arquivo atual; se o arquivo atual indicar algo diferente do mencionado abaixo, você provavelmente deve preferir o que está no seu arquivo atual.

Mas se é isso que você deseja (o que provavelmente é), vamos prosseguir. Digamos que temos dois hosts www.he.nete www.ripe.net:

$ host www.he.net
www.he.net is an alias for he.net.
he.net has address 216.218.186.2
he.net has IPv6 address 2001:470:0:76::2

$ host www.ripe.net
www.ripe.net has address 193.0.6.139
www.ripe.net has IPv6 address 2001:67c:2e8:22::c100:68b

Caso 1: prefira IPV4 para todos os hosts

Anexe à /etc/gai.confseguinte linha:

precedence ::ffff:0:0/96  100

Depois de salvar o arquivo editado (não é necessário reiniciar), você verá aplicativos de rede (por exemplo, telnet) usando IPV4: por exemplo,

$ telnet www.ripe.net 81
Trying 193.0.6.139...
^C
$ telnet www.he.net 81
Trying 216.218.186.2...

Caso 2: prefira o IPV6 para hosts específicos

Se quisermos preferir o IPV6 apenas para www.he.netou sua rede, podemos anexar uma máscara / prefixo para todos, ou apenas parte do seu endereço IPV6 /etc/gai.conf. Por exemplo, a seguinte linha:

precedence 2001:470::/32 100

(depois de salvar o arquivo editado) produz

$ telnet www.ripe.net 81
Trying 193.0.6.139...
^C
$ telnet www.he.net 81
Trying 2001:470:0:76::2...
^C

Caso 3: prefira IPV4 para hosts específicos

Se invertermos a máscara, o inverso será verdadeiro? De acordo com @GrueMaster, anexando

precedence 2001:470::/96 100

trabalhou para ele depois de desativar o IPV6 para security.ubuntu.com(caso contrário, ele fica para sempre).


Veja também:

Lmwangi
fonte
Talvez resuma o conteúdo caso os links acima desapareçam?
Faheem Mitha
Então, qual é a sintaxe para desativar o IPv6 para um nome específico ou pelo menos para um endereço específico (intervalo)? Se você adicionar isso à sua postagem, será a melhor resposta aqui.
Gilles
Obrigado. #security.debian.org has IPv6 address 2610:148:1f10:3::73 \n #security.debian.org has IPv6 address 2001:4f8:8:36::6 \n precedence 2001:4f8::/96 100 \n precedence 2610:148::/96 100 Adicionei 2 linhas ao meu /etc/gai.conf e o apt-get update funciona perfeito agora.
don bright
10

Você pode configurar o apt-cacher-ng em uma máquina sobressalente para atuar como proxy / cache para todos os seus hosts. Você pode forçar a configuração a usar apenas hosts específicos ou usar o truque / etc / hosts sugerido por @badp nessa máquina.

apt-get install apt-cacher-ng

Depois de ter configurado o apt-cache-ng, você só precisa soltar a seguinte linha (com o endereço IP / nome do host alterado para apontar para a sua máquina cacher) em /etc/apt/apt.aptf.d/90httpproxy

Acquire::http { Proxy "http://[192.168.1.254]:3142"; };

Eu uso essa configuração para reduzir o uso da largura de banda, mas deve solucionar o seu problema. Infelizmente, não conheço uma maneira de desabilitar diretamente as pesquisas do ipv6 para o apt-get.

Richm
fonte
Ainda não é uma solução perfeita, mas é a melhor possível. Obrigado.
Shadur 24/03
5

Você pode contornar isso configurando um servidor proxy DNS que descarte as respostas ip6.

pjc50
fonte
Seu resolvedor local ainda não tentará obter o registro AAAA? E tempo fora?
Mikel
4

Que tal adicionar uma linha para /etc/hostssubstituir os endereços relevantes? por exemplo,

130.89.149.226  ftp.debian.org      
195.20.242.89   security.debian.org 
badp
fonte
13
Vou guardar esta solução para o final, se não houver outra maneira; Eu realmente não gosto de desordenar /etc/hostscom endereços IP não me possui.
Shadur 23/03
@Shadur Sim, eu posso ver totalmente o seu ponto :)
badp
Nota: estes precisam ser invertidos, por isso é IP e, em seguida, nome do host
Mike T
1

Seqüestrando tópico antigo, mas confrontado com o mesmo problema recentemente. Portanto, com base nos conselhos fornecidos acima e na saída de host e whois :

# host security.debian.org
security.debian.org has address 212.211.132.250
security.debian.org has address 195.20.242.89
security.debian.org has address 212.211.132.32
security.debian.org has IPv6 address 2001:8d8:580:400:6564:a62:0:2
security.debian.org has IPv6 address 2001:a78:5:0:216:35ff:fe7f:be4f
security.debian.org has IPv6 address 2001:a78:5:1:216:35ff:fe7f:6ceb

Problema resolvido de uma maneira um pouco diferente - reduziu a precedência das redes IPv6 que contêm security.debian.org em /etc/gai.conf :

# Make IPv6 for security.debian.org undesirable
precedence 2001:8d8:580::/48    5
precedence 2001:a78:5::/48      5

Portanto, o IPv6 ainda é o preferido, exceto pelo security.debian.org .

Timur Bakeyev
fonte
1

Em 08 de outubro de 2014, tive o mesmo problema, tentando atualizar o debian atrás de um proxy na rede local. Na esperança de que seja relevante para os outros, posto aqui a minha resposta. Como outros já mencionaram, a edição /etc/hostsé algo com o qual devemos ter cuidado.

Mas, pessoalmente, eu só queria que a atualização fosse feita.

Conteúdo de /etc/apt/sources.list ao fazer a atualização (era diferente antes da atualização ..):

deb http://http.debian.net/debian/ testing main
deb-src http://http.debian.net/debian/ testing main

deb http://mirrors.kernel.org/debian/ wheezy main
deb-src http://mirrors.kernel.org/debian/ wheezy main

deb http://security.debian.org/ wheezy/updates main
deb-src http://security.debian.org/ wheezy/updates main

Conteúdo do /etc/apt/apt.conf:

Acquire::http::proxy "http://192.168.1.10:7777/";
Acquire::http::Timeout "10";
Acquire::ftp::Timeout "10";

Adição ao / etc / hosts:

#Workaround for making apt-get work (08-10-2014)
195.20.242.89 security.debian.org
130.89.148.12 ftp.debian.org

Agora, rodar apt-get update ; apt-get upgradecomo root funcionou bem.

Conforme mencionado em outras respostas, use, execute o comando host no domínio para obter o ip correto para inserir no arquivo hosts.

Exemplo:

$ host ftp.debian.org
ftp.debian.org has address 130.89.148.12

Isso atualizou com êxito o sistema para Debian GNU/Linux testing (jessie). Você pode não querer executar com os repositórios de teste e simplesmente removê-lo das fontes. Os repositórios de teste oferecem atualizações mais recentes de vários pacotes, mas não são considerados estáveis.

NordicViking
fonte
Mais uma vez, modificar o hostsarquivo é uma solução altamente subótima.
Shadur 27/09/17
0

Eu encontrei uma maneira muito melhor de fazer isso. Abra seu sources.listarquivo e anote os nomes de host dos repositórios. Obtenha os endereços IPv4 e edite sources.listcom os endereços IPv4 em vez dos nomes de host. Agora o Apt-get deve entrar em contato com os repositórios pelos endereços IPv4 que você especificou, ignorando o IPv6.

Existe a desvantagem de que os repositórios geralmente têm algum tipo de balanceamento de carga e / ou localização geográfica de IP configurada, que esse método obviamente evita. No entanto, não importa se apenas algumas pessoas estão fazendo isso. Se você encontrar um espelho lento, tente obter outro endereço IP de repositório (por exemplo, usando um serviço de ping online) e use-o.

D. Strout
fonte
2
Essa é uma solução muito ruim, na verdade, pelas razões que você já descreve.
Shadur
-4

Você pode tentar isso se funcionar para você

user@ubuntuvm:~$ sudo bash
root@ubuntuvm:~# echo 1 > /proc/sys/net/ipv6/conf/eth0/disable_ipv6 

-> substitua o nome da sua interface

Chetan
fonte
Esta é uma solução para uma pergunta diferente da que eu fiz.
Shadur 12/07/2015