Überzeugen Sie apt-get, die IPv6-Methode nicht zu verwenden

239

Der ISP, bei dem ich arbeite, richtet ein internes IPv6-Netzwerk ein, um eine Verbindung zum IPv6-Internet herzustellen. Infolgedessen versuchen mehrere Server in diesem Netzwerk jetzt, während der Ausführung standardmäßig über ihre IPv6-Adresse eine Verbindung zu security.debian.org herzustellen. Daher muss beim apt-get updateHerunterladen von Updates jeder Art eine längere Zeit abgewartet werden .

Gibt es eine Möglichkeit, apt mitzuteilen, IPv4 zu bevorzugen oder IPv6 insgesamt zu ignorieren?

Shadur
quelle
3
Sollte das nicht sofort mit einem Routing-Fehler zurückkehren?
pjc50
7
Nein, es ist durchaus möglich, dass das interne Netzwerk zwischen mehreren Subnetzen geroutet wird (und Hosts über ein IPv6-Standardgateway verfügen), dass jedoch keine IPv6-Verbindung zur Außenwelt besteht.
Andrew Medico
5
Es gibt wahrscheinlich eine Möglichkeit, A-Einträge /etc/gai.confso einzurichten, dass sie security.debian.orgvor dem AAA-Eintrag zurückgegeben werden, aber ich weiß nicht genau, was ich in diese Datei einfügen soll.
Gilles
3
@AndrewMedico - aber sollten die Standardgateways ihres Netzwerks nicht wissen, dass es keine externe IPV6-Konnektivität gibt, und den ausgehenden Versuch am Rande ziemlich schnell ablehnen? Ich denke, es gibt hier ein Netzwerkproblem sowie die Frage, die gestellt wird.
Michael Kohne
7
Das Reparieren des Edge-Routers / der Firewall / was auch immer das Problem verursacht, ist der "beste" Weg, dies zu handhaben. Es sollte ein nicht erreichbares ICMP-Zielpaket zurückgeben. Dies geschieht entweder nicht oder etwas blockiert es. In jedem Fall sollte das Problem Ihren Netzwerkmitarbeitern gemeldet werden.
Michael Hampton

Antworten:

319

-o Acquire::ForceIPv4=trueBeim Laufen hinzufügen apt-get.

Wenn Sie die Einstellung dauerhaft machen möchten, erstellen Sie einfach /etc/apt/apt.conf.d/99force-ipv4 und geben Sie Acquire::ForceIPv4 "true";es ein:

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

Konfigurationsoptionen Acquire::ForceIPv4und Acquire::ForceIPv6wurden zu Version 0.9.7.9 ~ exp1 (siehe Fehler 611891 ) hinzugefügt, die seit Ubuntu Saucy (veröffentlicht im Oktober 2013) und Debian Jessie (veröffentlicht im April 2015) verfügbar ist.

mmoya
quelle
7
Verschieben des "Akzeptierten" in dieses; Während die ursprüngliche 30-Punkte-Antwort vollkommen korrekt ist, ist sie in einem viel breiteren Maßstab anwendbar, während dies die Option bietet, apt-get nur einzuschränken.
Shadur
Bitte beschreiben Sie Ihre Antwort richtig. -o Acquire :: ForceIPv4 = true ist der Zusatz zum Befehl, mit dem ein Benutzer ipv4 verwenden kann
Kendrick
Antwort aktualisiert nach Kendricks Vorschlag
mmoya
1
Nach dem Rest von mir zu urteilen apt.conf, müssen Sie es so schreiben: Acquire::ForceIPv4 "true";(mit doppelten Anführungszeichen)
mirabilos
6
@ZAB weil, wenn Sie keinen Schreibzugriff auf die Datei haben, sudo echo 'test' > filewürde nicht funktionieren, da die Umleitung mit den Benutzerberechtigungen ausgeführt wird
LeartS
81

Wie Gilles sagt , benutze gai.conf. Anmerkungen:

  1. Dies funktioniert auf einer viel niedrigeren Ebene (DNS- und IP-Netzwerk) als APT, sodass sich die Art und Weise ändert, in der Ihr gesamtes Anwendungsnetzwerk - zumindest alle, die es verwenden getaddrinfo.
  2. Bevor Sie Ihre bearbeiten gai.conf, sollten Sie sie sichern und auch lesen (keine Sorge, sie ist kurz). Die folgenden Änderungen sind wahrscheinlich bereits in Ihrer aktuellen Datei erwähnt. Wenn die aktuelle Datei etwas anderes anzeigt als das, was unten angegeben ist, sollten Sie wahrscheinlich den Inhalt Ihrer aktuellen Datei bevorzugen.

Aber wenn es das ist, was Sie wollen (was es wahrscheinlich ist), lassen Sie uns fortfahren. Angenommen, wir haben zwei Gastgeber www.he.netund 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

Fall 1: Bevorzugen Sie IPV4 für alle Hosts

An /etc/gai.conffolgende Zeile anhängen :

precedence ::ffff:0:0/96  100

Nach dem Speichern der bearbeiteten Datei (kein Neustart erforderlich) sollten Netzwerkanwendungen (z. B. telnet) mit IPV4 angezeigt werden: z.

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

Fall 2: Bevorzugen Sie IPV6 für bestimmte Hosts

Wenn wir IPV6 nur für www.he.netoder sein Netzwerk bevorzugen möchten , können wir eine Maske / ein Präfix für alle oder nur einen Teil seiner IPV6-Adresse anhängen /etc/gai.conf. ZB die folgende Zeile:

precedence 2001:470::/32 100

(nach dem Speichern der bearbeiteten Datei) erzeugt

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

Fall 3: Bevorzugen Sie IPV4 für bestimmte Hosts

Wenn wir die Maske umkehren, ist das Gegenteil der Fall? Laut @GrueMaster, anhängend

precedence 2001:470::/96 100

arbeitete für ihn nach der Deaktivierung von IPV6 für security.ubuntu.com(sonst bleibt es für immer).


Siehe auch:

Lmwangi
quelle
Vielleicht Inhalt zusammenfassen, falls die oben genannten Links verschwinden?
Faheem Mitha
Welche Syntax gibt es, um IPv6 für einen bestimmten Namen oder zumindest für eine bestimmte Adresse (einen bestimmten Bereich) zu deaktivieren? Wenn Sie dies zu Ihrem Beitrag hinzufügen, ist dies hier die beste Antwort.
Gilles
Vielen Dank. Ich #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 habe meiner /etc/gai.conf 2 Zeilen hinzugefügt und apt-get update funktioniert jetzt perfekt.
Don Bright
10

Sie können apt-cacher-ng auf einem Ersatzcomputer einrichten, um als Proxy / Cache für alle Ihre Hosts zu fungieren. Sie können die Konfiguration zwingen, nur bestimmte Hosts zu verwenden, oder den von @badp vorgeschlagenen / etc / hosts-Trick auf diesem einen Computer anwenden.

apt-get install apt-cacher-ng

Sobald Sie apt-cache-ng eingerichtet haben, müssen Sie nur die folgende Zeile (mit geänderter IP-Adresse / geändertem Hostnamen, um auf Ihren Cacher-Computer zu zeigen) in /etc/apt/apt.conf.d/90httpproxy einfügen

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

Ich benutze dieses Setup, um die Bandbreitennutzung zu reduzieren, aber es sollte Ihr Problem umgehen. Leider ist mir keine Möglichkeit bekannt, IPv6-Lookups für apt-get selbst direkt zu deaktivieren.

Richm
quelle
Immer noch keine perfekte Lösung, aber so gut wie es wahrscheinlich wird. Vielen Dank.
Shadur
5

Sie können dies umgehen, indem Sie einen DNS-Proxyserver einrichten, der IP6-Antworten verwirft.

pjc50
quelle
Wird Ihr lokaler Resolver nicht immer noch versuchen, den AAAA-Rekord zu erhalten? Und Auszeit?
Mikel
4

Wie wäre es mit dem Hinzufügen einer Zeile zum /etc/hostsÜberschreiben der relevanten Adressen? z.B,

130.89.149.226  ftp.debian.org      
195.20.242.89   security.debian.org 
badp
quelle
13
Ich werde diese Lösung für den letzten Moment aufbewahren, wenn sich herausstellt, dass es absolut keinen anderen Weg gibt. Ich mag es wirklich nicht, /etc/hostsmit IP-Adressen zu wuseln, die ich selbst nicht besitze.
Shadur
@ Shadur Ja, ich kann Ihren Standpunkt total sehen :)
badp
Hinweis: Diese müssen umgedreht werden, es ist also IP, dann Hostname
Mike T
1

Hijacking altes Thema, aber vor kurzem mit dem gleichen Problem konfrontiert. Also, basierend auf den oben gegebenen Ratschlägen und der Ausgabe von host und 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

Das Problem wurde auf eine etwas andere Art gelöst - die Priorität der IPv6-Netzwerke, die security.debian.org in /etc/gai.conf enthalten, wurde verringert :

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

Daher wird IPv6 mit Ausnahme von security.debian.org weiterhin bevorzugt .

Timur Bakeyev
quelle
1

Ab dem 08. Oktober 2014 hatte ich das gleiche Problem, als ich versuchte, Debian hinter einem Proxy im lokalen Netzwerk zu aktualisieren. In der Hoffnung, dass es für andere relevant ist, poste ich meine Antwort hier. Wie andere bereits erwähnt haben, ist das Bearbeiten /etc/hostsetwas, mit dem man vorsichtig sein sollte.

Aber ich persönlich wollte nur das Update haben.

Inhalt von /etc/apt/sources.list beim Update (war vor dem Update anders ..):

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

Inhalt von /etc/apt/apt.conf:

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

Ergänzung zu / 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

Jetzt hat es apt-get update ; apt-get upgradegut funktioniert , als root zu laufen .

Verwenden Sie, wie in anderen Antworten erwähnt, den Befehl host in der Domäne, um die richtige IP-Adresse zum Einfügen in die Datei hosts abzurufen.

Beispiel:

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

Dadurch wurde das System erfolgreich auf aktualisiert Debian GNU/Linux testing (jessie). Möglicherweise möchten Sie nicht mit den Test-Repositorys ausgeführt werden, sondern diese einfach aus den Quellen entfernen. Das Test-Repository bietet Ihnen aktuellere Aktualisierungen mehrerer Pakete, wird jedoch nicht als stabil angesehen.

NordicViking
quelle
Auch hier ist das Ändern der hostsDatei eine höchst suboptimale Lösung.
Shadur
0

Ich habe einen viel besseren Weg gefunden, dies zu tun. Öffnen Sie Ihre sources.listDatei und notieren Sie sich die Hostnamen der Repos. Rufen Sie ihre IPv4- Adressen ab und bearbeiten Sie sie sources.listmit den IPv4-Adressen und nicht mit den Hostnamen. Apt-get sollte sich nun über die von Ihnen angegebenen IPv4-Adressen mit den Repositorys in Verbindung setzen und IPv6 umgehen.

Es gibt den Nachteil, dass Repos normalerweise eine Art von Lastausgleich und / oder IP-Geolokalisierung haben, die diese Methode natürlich umgeht. Es sollte jedoch keine Rolle spielen, wenn nur ein paar Leute es tun. Wenn Sie feststellen, dass ein Spiegel langsam ist, versuchen Sie, eine andere Repo-IP-Adresse abzurufen (z. B. mithilfe eines Online-Ping-Dienstes), und verwenden Sie diese.

D. Strout
quelle
2
Das ist aus den Gründen, die Sie bereits beschrieben haben, eine wirklich schlechte Lösung.
Shadur
-4

Sie können dies versuchen, wenn es für Sie funktioniert

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

-> ersetzen Sie Ihren Schnittstellennamen

Chetan
quelle
Dies ist eine Lösung für eine andere Frage, als ich sie gestellt habe.
Shadur