Convinci apt-get * not * per usare il metodo IPv6


239

L'ISP a cui lavoro sta configurando una rete IPv6 interna in preparazione per eventualmente collegarsi a Internet IPv6. Di conseguenza, molti server in questa rete ora provano a connettersi a security.debian.org tramite il suo indirizzo IPv6 per impostazione predefinita durante l'esecuzione apt-get updatee ciò comporta il dover attendere un lungo timeout ogni volta che sto scaricando aggiornamenti di qualsiasi tipo .

C'è un modo per dire a apt di preferire IPv4 o ignorare del tutto IPv6?


3
Non dovrebbe tornare immediatamente con un errore di routing?
pjc50,

7
No, è del tutto possibile che la loro rete interna abbia il routing tra più subnet (e gli host abbiano un gateway predefinito IPv6) ma nessuna connettività IPv6 con il mondo esterno.
Andrew Medico,

5
C'è probabilmente un modo per impostare in /etc/gai.confmodo che security.debian.orgi record A vengano restituiti prima del record AAA, ma non so esattamente cosa mettere in quel file.
Gilles

3
@AndrewMedico - ma i gateway predefiniti della loro rete non dovrebbero sapere che non esiste una connettività ipV6 esterna e rifiutare il tentativo in uscita al limite abbastanza rapidamente? Penso che ci sia un problema di rete qui e la domanda che viene posta.
Michael Kohne,

7
Riparare il router perimetrale / il firewall / qualunque sia la causa del problema è il modo "migliore" per gestirlo. Esso dovrebbe essere un ritorno destinazione del pacchetto ICMP irraggiungibile. Questo non sta accadendo o qualcosa lo sta bloccando. In entrambi i casi, il problema dovrebbe essere segnalato alle persone della rete.
Michael Hampton,

Risposte:


319

Aggiungi -o Acquire::ForceIPv4=truedurante l'esecuzione apt-get.

Se vuoi rendere persistente l'impostazione basta creare /etc/apt/apt.conf.d/99force-ipv4 e Acquire::ForceIPv4 "true";inserirla:

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

Opzioni di configurazione Acquire::ForceIPv4e Acquire::ForceIPv6sono state aggiunte alla versione 0.9.7.9 ~ exp1 (vedi bug 611.891 ), che è disponibile in quanto Ubuntu Saucy (uscito nell'ottobre 2013) e Debian Jessie (rilasciato nel mese di aprile 2015).


7
Spostando il "accettato" su questo; mentre la risposta originale a 30 punti è perfettamente corretta, è applicabile su una scala molto più ampia, mentre ciò fornisce l'opzione per limitare solo apt-get.
Shadur,

Si prega di essere adeguatamente descrittivo nella risposta. -o Acquire :: ForceIPv4 = true è l'aggiunta al comando per consentire a un utente di utilizzare ipv4
Kendrick,

Risposta aggiornata seguendo il suggerimento di Kendrick
mmoya,

1
A giudicare dal resto del mio apt.confdevi scriverlo in questo modo: Acquire::ForceIPv4 "true";(con virgolette doppie)
mirabilos,

6
@ZAB perché se non si dispone dell'accesso in scrittura al file, sudo echo 'test' > filenon funzionerebbe perché il reindirizzamento viene eseguito con le autorizzazioni utente
LeartS

81

Come dice Gilles , usa gai.conf. Appunti:

  1. Funziona a un livello molto più basso (rete DNS e IP) rispetto a APT, quindi cambierà il modo in cui tutte le tue applicazioni di rete, almeno, tutte quelle che usano getaddrinfo.
  2. Prima di modificare il tuo gai.conf, dovresti eseguirne il backup e anche leggerlo (non preoccuparti, è breve). Le modifiche seguenti sono probabilmente già menzionate nel tuo file corrente; se il file corrente indica qualcosa di diverso da quanto indicato di seguito, probabilmente dovresti preferire ciò che è nel tuo file corrente.

Ma se questo è quello che vuoi (che probabilmente è), procediamo. Supponiamo di avere due host 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: preferisci IPV4 per tutti gli host

Aggiungi alla /etc/gai.confseguente riga:

precedence ::ffff:0:0/96  100

Dopo aver salvato il file modificato (non è necessario riavviare), dovresti vedere le app di rete (ad es. telnet) Utilizzando IPV4: ad es.

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

Caso 2: preferisce IPV6 per host specifici

Se vogliamo preferire IPV6 solo per www.he.neto la sua rete, possiamo aggiungere una maschera / prefisso per tutti, o solo una parte, del suo indirizzo IPV6 /etc/gai.conf. Ad esempio, la seguente riga:

precedence 2001:470::/32 100

(dopo aver salvato il file modificato) produce

$ 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: preferisce IPV4 per host specifici

Se invertiamo la maschera, sarà vero il contrario? Secondo @GrueMaster, in aggiunta

precedence 2001:470::/96 100

ha funzionato per lui dopo aver disabilitato IPV6 per security.ubuntu.com(altrimenti si blocca per sempre).


Guarda anche:


Riassumi il contenuto nel caso in cui scompaiano i link sopra?
Faheem Mitha,

Quindi, qual è la sintassi per disabilitare IPv6 per un nome particolare o almeno per un indirizzo specifico (intervallo)? Se lo aggiungi al tuo post, sarà la risposta migliore qui.
Gilles,

Grazie. Ho aggiunto 2 righe #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 al mio /etc/gai.conf e apt-get update funziona perfettamente ora.
don luminoso

10

È possibile impostare apt-cacher-ng su una macchina di riserva in modo che funga da proxy / cache per tutti i vostri host. Puoi forzare la configurazione a usare solo host specifici o usare il trucco / etc / hosts suggerito da @badp su quella macchina.

apt-get install apt-cacher-ng

Una volta che hai configurato apt-cache-ng devi solo eliminare la seguente riga (con indirizzo IP / nome host modificato per puntare alla tua macchina cache) in /etc/apt/apt.conf.d/90httpproxy

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

Uso questa configurazione per ridurre l'utilizzo della larghezza di banda, ma dovrebbe risolvere il problema. Sfortunatamente non sono a conoscenza di un modo per disabilitare direttamente le ricerche ipv6 per apt-get stesso.


Non è ancora una soluzione perfetta, ma è altrettanto efficace. Grazie.
Shadur,

5

È possibile aggirare il problema configurando un server proxy DNS che ha eliminato le risposte ip6.


Il tuo resolver locale non cercherà ancora di ottenere il record AAAA? E time out?
Mikel,

4

Che ne dici di aggiungere una riga per /etc/hostssovrascrivere gli indirizzi rilevanti? per esempio,

130.89.149.226  ftp.debian.org      
195.20.242.89   security.debian.org 

13
Salverò questa soluzione per ultimo se non ci fosse assolutamente nessun altro modo; Non mi piace davvero ingombrare /etc/hostscon indirizzi IP che non possiedo.
Shadur,

@Shadur Sì, capisco perfettamente il tuo punto :)
badp

Nota: questi devono essere capovolti, quindi è IP quindi nome host
Mike T

1

Dirottamento di un vecchio argomento, ma recentemente affrontato con lo stesso problema. Quindi, in base ai consigli sopra riportati e all'output di 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

Risolto problema in un modo leggermente diverso - abbassata la precedenza delle reti IPv6 che contengono security.debian.org in /etc/gai.conf :

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

Quindi, IPv6 è ancora preferito tranne per security.debian.org .


1

Dall'8 ottobre 2014, ho avuto lo stesso problema, provando ad aggiornare debian dietro un proxy sulla rete locale. Nella speranza che sia pertinente per gli altri, inserisco la mia risposta qui. Come altri hanno già detto, l'editing /etc/hostsè qualcosa con cui bisogna stare attenti.

Ma personalmente volevo solo fare l'aggiornamento.

Contenuto di /etc/apt/sources.list durante l'aggiornamento (era diverso prima dell'aggiornamento ..):

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

Contenuto di /etc/apt/apt.conf:

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

Aggiunta a / 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

Ora, correre apt-get update ; apt-get upgradecome root ha funzionato bene.

Come menzionato in altre risposte, utilizzare, eseguire il comando host sul dominio per ottenere l'IP corretto da inserire nel file hosts.

Esempio:

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

Questo ha aggiornato correttamente il sistema a Debian GNU/Linux testing (jessie). Potresti non voler eseguire con i repository di test, quindi rimuoverlo semplicemente dai sorgenti. I repository di test offrono aggiornamenti più recenti di diversi pacchetti, ma non sono considerati stabili.


Ancora una volta, la modifica del hostsfile è una soluzione altamente non ottimale.
Shadur,

0

Ho trovato un modo molto migliore per farlo. Apri il tuo sources.listfile e annota i nomi host dei repository. Ottieni i loro indirizzi IPv4 , quindi modifica sources.listcon gli indirizzi IPv4 anziché i nomi host. Apt-get dovrebbe ora contattare i repository sugli indirizzi IPv4 specificati, ignorando IPv6.

Lo svantaggio è che i repository hanno in genere una sorta di bilanciamento del carico e / o impostazione della geolocalizzazione IP, che questo metodo ovviamente ignora. Tuttavia, non dovrebbe importare se solo poche persone lo stanno facendo. Se trovi che un mirror è lento, prova a ottenere un altro indirizzo IP repository (ad esempio, utilizzando un servizio ping online) e usalo.


2
Questa è davvero una pessima soluzione, per i motivi che già descrivi.
Shadur,

-4

Puoi provare questo se funziona per te

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

-> sostituisci il nome della tua interfaccia


Questa è una soluzione per una domanda diversa da quella che ho posto.
Shadur,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.