Convencer a apt-get * not * para usar el método IPv6


239

El ISP en el que trabajo está configurando una red IPv6 interna en preparación para eventualmente conectarse a Internet IPv6. Como resultado, varios de los servidores de esta red ahora intentan conectarse a security.debian.org a través de su dirección IPv6 de forma predeterminada cuando se ejecuta apt-get update, y eso hace que tenga que esperar un tiempo de espera prolongado cada vez que descargue actualizaciones de cualquier tipo .

¿Hay alguna manera de decirle a apt si prefiere IPv4 o ignora por completo IPv6?


3
¿No debería volver eso inmediatamente con una falla de enrutamiento?
pjc50

77
No, es completamente posible que su red interna tenga enrutamiento entre múltiples subredes (y los hosts tengan una puerta de enlace predeterminada IPv6) pero no conectividad IPv6 con el mundo exterior.
Andrew Medico

55
Probablemente haya una manera de configurarlo /etc/gai.confpara que security.debian.orgse regrese un registro A antes del registro AAA, pero no sé exactamente qué poner en ese archivo.
Gilles

3
@AndrewMedico, pero ¿no deberían las puertas de enlace predeterminadas de su red saber que no hay conectividad ipV6 externa y rechazar el intento de salida en el borde con bastante rapidez? Creo que hay un problema de red aquí, así como la pregunta que se hace.
Michael Kohne

77
Arreglar el enrutador de borde / firewall / lo que sea que esté causando el problema es la "mejor" manera de manejar esto. Se debe a regresar un destino de paquetes ICMP inalcanzable. Esto no está sucediendo o algo lo está bloqueando. De cualquier manera, el problema se debe informar a las personas de su red.
Michael Hampton

Respuestas:


319

Agregar -o Acquire::ForceIPv4=truecuando se ejecuta apt-get.

Si desea que la configuración sea persistente, simplemente cree /etc/apt/apt.conf.d/99force-ipv4 y colóqueloAcquire::ForceIPv4 "true"; :

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

Opciones de configuración Acquire::ForceIPv4y Acquire::ForceIPv6se han añadido a la versión 0.9.7.9 ~ exp1 (véase el bug 611891 ), que está disponible desde Ubuntu para Salsas (publicado en octubre de 2013) y Debian Jessie (lanzado en abril de 2015).


77
Mover el "aceptado" a este; mientras que la respuesta de 30 puntos originales es perfectamente correcta, es aplicable en una escala mucho más amplia, mientras que esto proporciona la opción de simplemente restringir el apt-get.
Shadur

Por favor, sea adecuadamente descriptivo en su respuesta. -o Adquirir :: ForceIPv4 = verdadero es la adición al comando para permitir que un usuario use ipv4
Kendrick

Respuesta actualizada siguiendo la sugerencia de Kendrick
mmoya

1
A juzgar por el resto de mi, apt.confdebes escribirlo así: Acquire::ForceIPv4 "true";(con comillas dobles)
mirabilos

66
@ZAB porque si no tiene acceso de escritura al archivo, sudo echo 'test' > fileno funcionaría porque la redirección se ejecuta con los permisos del usuario
LeartS

81

Como dice Gilles , úsalo gai.conf. Notas:

  1. Esto funciona a un nivel mucho más bajo (redes DNS e IP) que APT, por lo que cambiará la forma en que todas sus aplicaciones se conectan en red, al menos, todo lo que usan getaddrinfo.
  2. Antes de editar su gai.conf, debe hacer una copia de seguridad y también leerlo (no se preocupe, es corto). Las ediciones a continuación probablemente ya estén mencionadas en su archivo actual; Si el archivo actual indica algo diferente de lo que se menciona a continuación, probablemente debería preferir lo que está en su archivo actual.

Pero si esto es lo que quieres (que probablemente sea), procedamos. Digamos que tenemos dos anfitriones www.he.nety 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: prefiera IPV4 para todos los hosts

Añadir a /etc/gai.confla siguiente línea:

precedence ::ffff:0:0/96  100

Después de guardar el archivo editado (no es necesario reiniciar), debería ver las aplicaciones de red (p. Ej. telnet) Con IPV4: p. Ej.

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

Caso 2: prefiera IPV6 para hosts específicos

Si queremos preferir IPV6 solo para www.he.neto su red, podemos agregar una máscara / prefijo para toda, o solo una parte, de su dirección IPV6 /etc/gai.conf. Por ejemplo, la siguiente línea:

precedence 2001:470::/32 100

(después de guardar el archivo editado) 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: prefiera IPV4 para hosts específicos

Si invertimos la máscara, ¿será verdad lo contrario? Según @GrueMaster, anexar

precedence 2001:470::/96 100

funcionó para él después de deshabilitar IPV6 security.ubuntu.com(de lo contrario, se detiene para siempre)


Ver también:


¿Quizás resumir contenido en caso de que desaparezcan los enlaces anteriores?
Faheem Mitha

Entonces, ¿cuál es la sintaxis para deshabilitar IPv6 para un nombre en particular, o al menos para una dirección (rango) en particular? Si agrega eso a su publicación, será la mejor respuesta aquí.
Gilles

Gracias. #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 Agregué 2 líneas a mi /etc/gai.conf y apt-get update funciona perfecto ahora.
Don brillante

10

Puede configurar apt-cacher-ng en una máquina de repuesto para que actúe como proxy / caché para todos sus hosts. Puede forzar la configuración para que solo use hosts específicos o use el truco / etc / hosts sugerido por @badp en esa máquina.

apt-get install apt-cacher-ng

Una vez que haya configurado apt-cache-ng, solo necesita colocar la siguiente línea (con la dirección IP / nombre de host alterado para apuntar a su máquina de almacenamiento en caché) en /etc/apt/apt.conf.d/90httpproxy

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

Utilizo esa configuración para reducir el uso de ancho de banda, pero debería solucionar su problema. Desafortunadamente, no conozco una forma de deshabilitar directamente las búsquedas de ipv6 para apt-get.


Todavía no es una solución perfecta, pero es tan buena como probablemente sea. Gracias.
Shadur

5

Podría solucionar este problema configurando un servidor proxy DNS que eliminó las respuestas de ip6.


¿Su resolutor local aún no intentará obtener el registro AAAA? Y tiempo de espera?
Mikel

4

¿Qué tal agregar una línea para /etc/hostsanular las direcciones relevantes? p.ej,

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

13
Guardaré esta solución para el final si resulta que no hay otra manera; Yo realmente no me gusta que saturan /etc/hostscon direcciones IP que no es dueño de mí mismo.
Shadur

@Shadur Sí, puedo ver totalmente tu punto :)
badp

Nota: estos deben invertirse, por lo que es IP y luego nombre de host
Mike T

1

Secuestrando el viejo tema, pero recientemente enfrenté el mismo problema. Entonces, en base a los consejos dados anteriormente y la salida del host y 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

Se resolvió el problema de una manera ligeramente diferente: se redujo la precedencia de las redes IPv6 que contienen security.debian.org en /etc/gai.conf :

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

Por lo tanto, todavía se prefiere IPv6, excepto para security.debian.org .


1

A partir del 8 de octubre de 2014, tuve el mismo problema, tratando de actualizar Debian detrás de un proxy en la red local. Con la esperanza de que sea relevante para los demás, publico mi respuesta aquí. Como otros han mencionado, la edición /etc/hostses algo con lo que uno debe tener cuidado.

Pero personalmente solo quería que se realizara la actualización.

Contenido de /etc/apt/sources.list al hacer la actualización (era diferente antes de la actualización ...):

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

Contenido de /etc/apt/apt.conf:

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

Adición 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

Ahora, correr apt-get update ; apt-get upgradecomo root funcionó bien.

Como se menciona en otras respuestas, use, ejecute el comando host en el dominio para obtener la ip correcta para insertar en el archivo hosts.

Ejemplo:

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

Esto actualizó con éxito el sistema a Debian GNU/Linux testing (jessie). Es posible que no desee ejecutar con los repositorios de prueba, luego simplemente elimínelo de las fuentes. Los repositorios de prueba le ofrecen actualizaciones más recientes de varios paquetes, pero no se considera estable.


Nuevamente, modificar el hostsarchivo es una solución altamente subóptima.
Shadur

0

He encontrado una forma mucho mejor de hacer esto. Abra su sources.listarchivo y anote los nombres de host de los repositorios. Obtenga sus direcciones IPv4 , luego edite sources.listcon las direcciones IPv4 en lugar de los nombres de host. Apt-get ahora debe contactar a los repositorios a través de las direcciones IPv4 que especificó, sin pasar por IPv6.

Existe la desventaja de que los repos generalmente tienen algún tipo de equilibrio de carga y / o configuración de geolocalización de IP, que este método, por supuesto, evita. Sin embargo, no debería importar si solo unas pocas personas lo están haciendo. Si encuentra que un espejo es lento, intente obtener otra dirección IP de repositorio (por ejemplo, utilizando un servicio de ping en línea) y úselo.


2
Esa es una solución realmente mala, en realidad, por las razones que ya describiste.
Shadur

-4

Puedes probar esto si te funciona

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

-> reemplaza el nombre de tu interfaz


Esta es una solución para una pregunta diferente a la que hice.
Shadur
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.