ago 252013
 

Recentemente ho installato una VPS con Debian 7 su Linode e come prima cosa ho voluto fare un aggiornamento del sistema, ma ho trovato un piccolo problema in questo:

# apt-get update
0% [Connecting to ftp.us.debian.org (2610:148:1f10:3::89)] [Connecting to security.debian.org (2607:ea00:101:3c0b:207:e9ff:fe00:e595)]
Get:1 http://ftp.us.debian.org wheezy Release.gpg [1,672 B]                                                                           
...
Get:15 http://security.debian.org wheezy/updates/main Translation-en [56.6 kB]
Fetched 16.3 MB in <strong>4min 0s</strong> (67.5 kB/s)                                                                                                                                     
Reading package lists... Done

Quindi 4 minuti per aggiornare solo i miei repository (ed avevo solo il valore predefiniti per una Debian 7 appena installata), questo è dovuto al fatto che le VPS di Linode sono IPv6 Ready e quindi i server di questa azienda tentano di connettersi a security.debian. org tramite il suo indirizzo IPv6 di default quando si esegue un apt-get update, che si traduce in dover aspettare un lungo timeout ogni volta che si tenta di scaricare gli aggiornamenti di qualsiasi tipo.

Ma per fortuna cambiare il sistema operativo in modo che apt-get utilizzi IPv4 non è così difficile.



Diciamo che abbiamo il nome del server security.debian.org questi sono tutti gli indirizzi IP associati a questo nome sul DNS:

# host security.debian.org
security.debian.org has address 128.101.240.212
security.debian.org has address 149.20.20.6
security.debian.org has address 128.31.0.36
security.debian.org has IPv6 address 2607:ea00:101:3c0b:207:e9ff:fe00:e595
security.debian.org has IPv6 address 2001:4f8:8:36::6
security.debian.org mail is handled by 10 chopin.debian.org.

Come si può vedere questo nome ha sia indirizzi IPv4 che IPv6, per verificare che l’indirizzo si sta utilizzando per impostazione predefinita è possibile utilizzare il comando telnet sulla porta 80 (http)

# telnet security.debian.org 80
Trying 2607:ea00:101:3c0b:207:e9ff:fe00:e595...

Quello che vogliamo fare ora è dire a apt-get di utilizzare come prioritario l’indirizzo IPv4, e per fare questo è possibile modificare il file /etc/gai.conf , dalla sua pagina man:

NOME
       gai.conf - file di configurazione di getaddrinfo(3) 
 
DESCRIZIONE
      Una chiamata a getaddrinfo (3) potrebbe restituire risposte multiple. Secondo la RFC 3484 queste risposte devono essere ordinate in modo che la risposta con il più alto tasso di successo sia la prima della lista. L'RFC fornisce un algoritmo per l'ordinamento. Le regole statiche non sono sempre sufficienti, però. Per questo motivo la RFC fa anche in modo che gli amministratori di sistema abbiano la possibilità di cambiare dinamicamente l'ordinamento. Per l'implementazione con le glibc questo può essere realizzato con il file /etc/gai.conf.

Ora per farlo corto vi dirò che dovete aggiungete in fondo al file /etc/gai.conf questa direttiva:

precedence ::ffff:0:0/96  100

E per verificare che tutto funzioni come previsto utilizzare il comando telnet , ancora una volta:

root@li419-225:~# telnet security.debian.org 80
Trying 128.31.0.36...

Come si può vedere il sistema sta ora utilizzando l’ip in formato ipv4 per connettersi al sito security.debian.org.

Congratulazioni ora la tua VPS utilizzerà preferibilmente il protocollo IPV4, se ora si utilizzano i comandi apt-get vedrete una risposta molto più veloce e nessun timeout.
Una volta che si desidera ripristinare il default IPv6 (come prima scelta), non resta che togliere quella linea e tutto funzionerà con IPv6.

Riferimenti:

unix.stackexchange.com


Popular Posts:

flattr this!

  2 Responses to “Come convincere apt-get di NON usare IPV6”

  1. This is sad but a good workaround. I think someone should make sure that it works with IPv6 :-)

  2. I had the same problem on one of my virtual machines running Ubuntu 12.04 LTS (hosted by a different VPS provider).

    The real problem was that the host had “IPv6 Privacy Extensions” enabled. This tries to give you randomly generated IPv6 addresses. The randomly generated addresses did however not have any internet connectivity, so trying to reach any host from them, or reaching those randomly generated IPv6 addresses always failed.

    You can easily check how many IPv6 addresses your host is reporting at the moment with the command:

    ip -6 address show eth0

    Most hosting providers only give you one public IPv6 address, thus you should most likely only have one row with a public IPv6 address. Please note that addresses fe80::/64 are link local addresses.

    In my case I saw a lot of IPv6 addresses and tried to ping6 them all from another host, and the ping6 failed for each except the “real one” that was set up by my VPS provider.

    Alternatively, you can check if you have the privacy extension enabled by checking the output of

    cat /proc/sys/net/ipv6/conf/all/use_tempaddr

    The values are:

    0 - don’t use privacy extensions.
    1 - generate privacy addresses
    2 - prefer privacy addresses and use them over the normal addresses.

    In Ubuntu, I found that the easiest way to get rid of the randomly generated IPv6 addresses was to just remove the file /etc/sysctl.d/10-ipv6-privacy.conf, that was actually how the VPS provider had set it up on the other virtual machine, that was running problem free. I preferred to reboot the machine to see it was working as expected after a reboot, but you should be able to just restart your networking or disable the privacy extension on the fly (google for “use_tempaddr”).

    The main two configs that have to be changed is to set number 2 to 0 in the lines:

    net.ipv6.conf.all.use_tempaddr = 2
    net.ipv6.conf.default.use_tempaddr = 2

    But as I said, on Ubuntu the easiest way is just to remove the file /etc/sysctl.d/10-ipv6-privacy.conf

 Leave a Reply

(required)

(required)


*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>