Convaincre apt-get * not * d'utiliser la méthode IPv6

239

Le fournisseur de services Internet auquel je travaille est en train de mettre en place un réseau IPv6 interne en vue de la connexion éventuelle à Internet IPv6. En conséquence, plusieurs des serveurs de ce réseau essaient maintenant de se connecter à security.debian.org via son adresse IPv6 par défaut lors de l'exécution apt-get update, ce qui oblige à attendre un long délai d'attente chaque fois que je télécharge des mises à jour de quelque sorte que ce soit. .

Existe-t-il un moyen de prédire qu’il est préférable de préférer IPv4 ou d’ignorer complètement IPv6?

Shadur
la source
3
Cela ne devrait-il pas revenir immédiatement avec une erreur de routage?
Pjc50
7
Non, il est tout à fait possible que leur réseau interne dispose d'un routage entre plusieurs sous-réseaux (et que les hôtes disposent d'une passerelle par défaut IPv6), mais pas de connectivité IPv6 vers le monde extérieur.
Andrew Medico
5
Il y a probablement un moyen de mettre en place /etc/gai.confafin que security.debian.orgest un enregistrement sont retournés avant que l'enregistrement AAA, mais je ne sais pas exactement quoi mettre dans ce fichier.
Gilles
3
@AndrewMedico - mais les passerelles par défaut de leur réseau ne devraient-elles pas savoir qu'il n'y a pas de connectivité ipV6 externe et rejeter assez rapidement la tentative de sortie du réseau? Je pense qu'il y a un problème de réseau ici ainsi que la question posée.
Michael Kohne
7
Réparer le routeur de bord / le pare-feu / tout ce qui cause le problème est la "meilleure" façon de gérer cela. Il devrait renvoyer un paquet inaccessible de destination ICMP. Cela ne se produit pas ou quelque chose le bloque. Dans les deux cas, le problème doit être signalé aux personnes de votre réseau.
Michael Hampton

Réponses:

319

Ajouter -o Acquire::ForceIPv4=truelors de l'exécution apt-get.

Si vous voulez rendre le paramètre persistant, créez simplement /etc/apt/apt.conf.d/99force-ipv4 et insérez- Acquire::ForceIPv4 "true";le:

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

Les options de configuration Acquire::ForceIPv4et Acquire::ForceIPv6ont été ajoutées à la version 0.9.7.9 ~ exp1 (voir bug 611891 ) qui est disponible depuis Ubuntu Saucy (publié en Octobre 2013) et Debian Jessie (sorti en Avril 2015).

mmoya
la source
7
Déplacer les "acceptés" vers celui-ci; Bien que la réponse originale en 30 points soit parfaitement correcte, elle est applicable à une échelle beaucoup plus large, ce qui permet de limiter simplement apt-get.
Shadur
S'il vous plaît être correctement descriptif dans votre réponse. -o Acquire :: ForceIPv4 = true est l'ajout de la commande permettant à un utilisateur d'utiliser ipv4
Kendrick,
Réponse mise à jour à la suite de la suggestion de Kendrick
mmoya
1
À en juger par le reste de mes apt.confécrits, vous devez l'écrire comme ceci: Acquire::ForceIPv4 "true";(avec des guillemets)
mirabilos
6
@ZAB parce que si vous n'avez pas accès en écriture au fichier, sudo echo 'test' > filecela ne fonctionnerait pas car la redirection est exécutée avec les permissions de l'utilisateur
LeartS
81

Comme Gilles dit , utilisez gai.conf. Remarques:

  1. Cela fonctionne à un niveau beaucoup plus bas (réseau DNS et IP) qu'APT, donc cela changera la manière dont toutes vos applications se connectent au réseau - au moins, tout ce qui est utilisé getaddrinfo.
  2. Avant de modifier votre fichier gai.conf, vous devez le sauvegarder et également le lire (ne vous inquiétez pas, c'est court). Les modifications ci-dessous sont probablement déjà mentionnées dans votre fichier actuel. Si le fichier en cours indique quelque chose de différent de ce qui est mentionné ci-dessous, vous devriez probablement préférer le contenu de votre fichier en cours.

Mais si c'est ce que vous voulez (ce qui est probablement le cas), poursuivons. Disons que nous avons deux hôtes www.he.netet 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

Cas 1: préférez IPV4 pour tous les hôtes

Ajouter à /etc/gai.confla ligne suivante:

precedence ::ffff:0:0/96  100

Après avoir enregistré le fichier modifié (sans avoir besoin de redémarrer), vous devriez voir les applications en réseau (par exemple, telnet) utilisant IPV4: par exemple,

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

Cas 2: préférez IPV6 pour des hôtes spécifiques

Si nous souhaitons préférer IPV6 uniquement à www.he.netson réseau ou à son réseau, nous pouvons ajouter un masque / préfixe pour tout ou partie de son adresse IPV6 /etc/gai.conf. Par exemple, la ligne suivante:

precedence 2001:470::/32 100

(après avoir sauvegardé le fichier édité) produit

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

Cas 3: préférez IPV4 pour des hôtes spécifiques

Si nous inversons le masque, l'inverse sera-t-il vrai? Selon @GrueMaster, ajouter

precedence 2001:470::/96 100

travaillé pour lui après avoir désactivé IPV6 pour security.ubuntu.com(sinon, il cale pour toujours).


Voir également:

Lmwangi
la source
Peut-être résumer le contenu au cas où les liens ci-dessus disparaissent?
Faheem Mitha
Alors, quelle est la syntaxe pour désactiver IPv6 pour un nom particulier, ou au moins pour une adresse particulière (plage)? Si vous ajoutez cela à votre message, ce sera la meilleure réponse ici.
Gilles
Merci. J'ai ajouté 2 lignes #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 à mon fichier /etc/gai.conf et apt-get update fonctionne parfaitement maintenant.
Don lumineux
10

Vous pouvez configurer apt-cacher-ng sur un ordinateur de secours pour qu’il joue le rôle de proxy / cache pour tous vos hôtes. Vous pouvez forcer la configuration à n’utiliser que des hôtes spécifiques ou le truc / etc / hosts suggéré par @badp sur cet ordinateur.

apt-get install apt-cacher-ng

Une fois que vous avez configuré apt-cache-ng, il vous suffit de supprimer la ligne suivante (avec l'adresse IP / le nom d'hôte modifié pour pointer sur votre machine cachée) dans /etc/apt/apt.conf.d/90httpproxy

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

J'utilise cette configuration pour réduire l'utilisation de la bande passante, mais il convient de contourner votre problème. Malheureusement, je ne connais pas de moyen de désactiver directement les recherches ipv6 pour apt-get lui-même.

Richm
la source
Pas encore une solution parfaite, mais aussi bonne que possible. Merci.
Shadur
5

Vous pouvez contourner ce problème en configurant un serveur proxy DNS qui a abandonné les réponses ip6.

pjc50
la source
Votre résolveur local n'essaiera-t-il toujours pas d'obtenir le record AAAA? Et le temps mort?
Mikel
4

Que diriez-vous d'ajouter une ligne en /etc/hostsremplaçant les adresses pertinentes? par exemple,

130.89.149.226  ftp.debian.org      
195.20.242.89   security.debian.org 
badp
la source
13
Je garderai cette solution pour la fin s'il s'avère qu'il n'y a absolument aucun autre moyen. Je n'aime vraiment pas encombrer /etc/hostsd'adresses IP que je ne possède pas moi-même.
Shadur
@Shadur Oui, je vois très bien ce que vous
dites
Note: ceux-ci doivent être retournés, donc c'est IP puis le nom d'hôte
Mike T
1

Détournement de vieux sujet, mais confronté au même problème récemment. Donc, sur la base des conseils donnés ci-dessus et des résultats de host et 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

Problème résolu d'une manière légèrement différente - réduction de la priorité des réseaux IPv6 contenant security.debian.org dans /etc/gai.conf :

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

Ainsi, IPv6 est toujours préféré, sauf pour security.debian.org .

Timur Bakeyev
la source
1

Le 8 octobre 2014, j'avais le même problème en essayant de mettre à jour Debian derrière un proxy sur un réseau local. Dans l'espoir que cela intéressera les autres, je poste ici ma réponse. Comme d'autres l'ont mentionné, l'édition /etc/hostsest une chose à laquelle il faut faire attention.

Mais personnellement, je voulais juste faire la mise à jour.

Contenu de /etc/apt/sources.list lors de la mise à jour (c'était différent avant la mise à jour ..):

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

Contenu de /etc/apt/apt.conf:

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

Ajout à / 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

Maintenant, courir en apt-get update ; apt-get upgradetant que root a bien fonctionné.

Comme mentionné dans d'autres réponses, utilisez, exécutez la commande host sur le domaine pour obtenir l'adresse IP correcte à insérer dans le fichier hosts.

Exemple:

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

Cela a mis à jour le système avec succès Debian GNU/Linux testing (jessie). Vous voudrez peut-être ne pas utiliser les référentiels de test, puis le supprimer simplement des sources. Les référentiels de test fournissent des mises à jour plus récentes de plusieurs packages, mais ne sont pas considérés comme stables.

NordicViking
la source
Là encore, la modification du hostsfichier est une solution hautement sous-optimale.
Shadur
0

J'ai trouvé un meilleur moyen de le faire. Ouvrez votre sources.listfichier et notez les noms d’hôtes du dépôt. Obtenez leurs adresses IPv4 , puis modifiez-les sources.listavec les adresses IPv4 plutôt qu'avec les noms d'hôte. Apt-get devrait maintenant contacter les référentiels via les adresses IPv4 spécifiées, en contournant IPv6.

L'inconvénient est que les opérations de pension ont généralement une sorte d'équilibrage de charge et / ou de géolocalisation IP, que cette méthode contourne bien sûr. Cependant, peu importe si seulement quelques personnes le font. Si vous constatez qu'un miroir est lent, essayez d'obtenir une autre adresse IP de référentiel (par exemple, en utilisant un service de ping en ligne) et utilisez-la.

D. Strout
la source
2
En fait, c'est une très mauvaise solution pour les raisons que vous avez déjà décrites.
Shadur
-4

Vous pouvez essayer si cela fonctionne pour vous

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

-> remplacez le nom de votre interface

Chetan
la source
C'est une solution pour une question différente de celle que j'ai posée.
Shadur