Páginas aleatorias de James Bottomley

Una de las experiencias recientes de Linux Plumbers Conference me convenció de que si quieres ser parte de una verdadera interacción de audio/video basada en WebRTC de código abierto, necesitas una dirección de Internet que no esté detrás de un NAT. En realidad, el protocolo sigue funcionando siempre y cuando pueda ponerse en contacto con un servidor stun para decirle cuál es su dirección externa y, posiblemente, un servidor turn para proxy de los paquetes si ambos extremos están conectados, pero toda esta búsqueda de servidores externos lleva tiempo, como encontraron aquellos de ustedes que se quejaron de la prueba de eco. La solución a todo esto es conectarse a través de IPv6, que tiene un espacio de direcciones lo suficientemente grande como para admitir que cada dispositivo del planeta tenga su propia dirección. Todas las distribuciones modernas de Linux admiten IPv6 desde el primer momento, por lo que es probable que lo haya usado accidentalmente sin darse cuenta, lo que es una de las bellezas de la autoconfiguración de IPv6 (se supone que simplemente funciona).

Sin embargo, recientemente me mudé y perdí mi conexión a Internet de fibra al cable, pero el cable que sí venía con una dirección IPv6, así que esta es mi historia de hacer que todo funcione. Si realmente no le importan los conceptos básicos del protocolo, puede saltar al cómo. Esta guía también se centra en una configuración de» pila dual » (que tiene direcciones IPv6 e IPv4). Las configuraciones IPv6 puras son posibles, pero debido a que algunas partes de Internet siguen siendo solo IPv4, no están completas a menos que configure un puente de encapsulación IPv4.

Los conceptos básicos de IPv6

IPv6 ha sido un protocolo maduro durante mucho tiempo, por lo que asumí erróneamente que habría una gran cantidad de buenos HOWTOs al respecto. Sin embargo, después de leer 20 descripciones diferentes de cómo funciona el espacio de direcciones IPv6 de 128 bits y no mucho más, me rendí desesperado y leí los RFC en su lugar. Asumo que has leído al menos uno de estos HOWTOS, por lo que no tengo que entrar en prefijos de direcciones IPv6, sufijos, ID de interfaz o subredes, así que comenzaré por donde terminan la mayoría de los HOWTOs.

¿Cómo funciona IPv6?

En IPv4 hay un protocolo llamado protocolo de configuración dinámica de host (DHCP), por lo que siempre que pueda encontrar un servidor DHCP, puede obtener toda la información que necesita para conectarse (dirección local, enrutador, servidor DNS, servidor horario, etc.). Sin embargo, este servicio tiene que ser configurado por alguien e IPv6 está diseñado para configurar una red sin él.

La primera suposición que hace la configuración automática de direcciones sin estado IPv6 (SLAAC) es que está en una subred /64 (por lo que cada subred en IPv6 contiene 1010 veces más direcciones que toda la Internet IPv4). Esto significa que, dado que la mayoría de las subredes reales contienen < 100 sistemas, simplemente pueden elegir una dirección aleatoria y es muy poco probable que choquen con los sistemas existentes. De hecho, hay tres formas actuales de elegir una dirección en el /64:

  1. EUI-64 (RFC 4291) basado en la dirección MAC, que es básicamente la MAC con un bit invertido y ff:fe colocado en el medio.
  2. Privado estable (RFC 7217) que se genera a partir de un hash basado en una clave estática, interfaz, prefijo y un contador (el contador se incrementa si hay un choque). Estas son preferibles a las EUI-64 que revelan cualquier configuración asociada con la dirección MAC (como el tipo de tarjeta de red que tiene)
  3. Direcciones de extensión de privacidad (RFC 4941) que son muy similares a las direcciones privadas estables, excepto que cambian con el tiempo utilizando el mecanismo de desaprobación de direcciones IPv6 y son para sistemas cliente que desean preservar el anonimato.

El siguiente problema en Linux es ¿quién configura la interfaz? La pila IPv6 del Núcleo está diseñada para hacerlo, y lo hará a menos que se le diga que no, pero la mayoría de los controladores de red modernos (como NetworkManager) son fanáticos del control y desactivan la configuración automática del núcleo para que puedan hacerlo ellos mismos. También usan por defecto direcciones privadas estables usando un secreto estático mantenido en el sistema de archivos (/var/lib/NetworkManager / secret_key).

Lo siguiente que hay que entender sobre las direcciones IPv6 es que están divididas en ámbitos, siendo el más importante las direcciones locales de enlace (no enrutables) que convencionalmente siempre tienen el prefijo fe80::/64. La dirección local de enlace se configura primero utilizando uno de los métodos anteriores y luego se usa para sondear la red.

Multidifusión y detección de vecinos

A diferencia de IPv4, IPv6 no tiene capacidad de difusión, por lo que toda la detección se realiza mediante multidifusión. Los nodos que aparecen en la red se suscriben a direcciones de multidifusión particulares, a través de paquetes especiales interceptados por el conmutador, y no recibirán ninguna multidifusión a la que no estén suscritos. Convencionalmente, todas las direcciones de multidifusión local de enlace tienen el prefijo ff02:: / 64 (para otros tipos de direcciones de multidifusión, consulte RFC 4291). Todos los nodos se suscriben a la dirección de multidifusión» todos los nodos » ff02::1 y también deben suscribirse a su propia dirección de multidifusión de nodo solicitada en ff02:: 1: ffXX: XXXX donde los últimos 24 bits corresponden a los 24 bits más bajos de la dirección IPv6 del nodo. Esto último es para evitar la interrupción que solía ocurrir en IPv4 desde las transmisiones ARP, ya que ahora puede dirigirse a un subconjunto específico de nodos para la resolución de direcciones.

El protocolo de resolución de direcciones IPV6 se llama Solicitud de vecinos (NS), descrito en RFC 4861 y se usa con SLAAC descrito en RFC 4862, y se realiza enviando una multidifusión a la dirección de solicitud de vecinos del nodo que desea descubrir que contiene la dirección IPv6 completa que desea conocer, un nodo con las respuestas de dirección coincidentes con su dirección de capa de enlace (MAC) en un paquete de Anuncio de Vecinos (NA).

Una vez que un nodo ha elegido su dirección local de enlace, primero envía un paquete NS a su dirección elegida para ver si alguien responde y si nadie lo hace, asume que está bien mantenerlo, de lo contrario, sigue el protocolo de prevención de colisiones asociado con su forma particular de dirección. Una vez que ha encontrado una dirección única, el nodo configura esta dirección local de enlace y busca un enrutador. Tenga en cuenta que si una red IPv6 no está presente, la detección se detiene aquí, por lo que la mayoría de las interfaces de red siempre muestran una dirección IPv6 local de enlace.

Descubrimiento de enrutadores

Una vez que el nodo tiene su propia dirección local de enlace única, la usa para enviar paquetes de solicitud de enrutador (RS) a la dirección de multidifusión «todos los enrutadores» ff02::2. Cada enrutador de la red responde con un paquete de Publicidad de enrutador (RA) que describe (entre otras cosas) la vida útil del enrutador, la MTU de la red, un conjunto de uno o más prefijos del que es responsable el enrutador, la dirección de enlace del enrutador y un conjunto de indicadores de opción que incluyen el indicador M (Administrado) y O (Otra configuración) y posiblemente un conjunto de servidores DNS.

Cada prefijo anunciado contiene el prefijo y la longitud del prefijo, un conjunto de indicadores que incluyen la A (configuración autónoma) y la L (enlace local) y un conjunto de vidas. Los prefijos Locales de enlace le indican qué prefijos globales usan los usuarios de la red local (puede haber más de uno) y si se le permite hacer SLAAC en el prefijo global (si la bandera A está clara, debe pedirle al enrutador una dirección usando DHCPv6). Si el enrutador tiene una vida útil distinta de cero, puede suponer que es un enrutador predeterminado para la subred.

Ahora que el nodo ha descubierto uno o más enrutadores, puede configurar su propia dirección global (tenga en cuenta que cada nodo enrutable IPv6 tiene al menos dos direcciones: un enlace local y un global). Cómo lo hace depende del enrutador y de los indicadores de prefijo

Configuración de dirección global

Lo primero que debe saber un nodo es si debe usar SLAAC para la dirección global o DHCPv6. Esto está completamente determinado por la bandera A de cualquier prefijo local de enlace en el paquete RA. Si A está establecido, el nodo puede usar SLAAC y si A está claro, el nodo debe usar DHCPv6 para obtener una dirección. Si se establece A y también la bandera M (Administrada), el nodo puede usar SLAAC o DHCPv6 (o ambos) para obtener una dirección y si la bandera M está clara, pero la bandera O (Otra configuración) está presente, el nodo debe usar SLAAC, pero puede usar DHCPv6 para obtener otra información sobre la red (generalmente DNS).

Una vez que el nodo tiene una dirección global, ahora necesita una ruta predeterminada. Forma la lista de rutas predeterminada de los paquetes RA que tienen una vida útil del enrutador distinta de cero. Todos estos están configurados como rutas predeterminadas a su dirección local de enlace con el recuento de saltos especificado por RA. Finalmente, el nodo puede agregar rutas de prefijo específicas de paquetes RA con cero vidas de enrutador pero prefijos locales no vinculados.

DHCPv6 es un protocolo de configuración bastante complejo (consulte RFC 8415), pero no puede especificar la longitud del prefijo (lo que significa que todas las direcciones obtenidas se configuran como /128) o rutas (estas deben obtenerse de paquetes RA). Esto conduce a una sutileza en la selección de direcciones de salida, en la que siempre se prefiere la más específica, por lo que si configura tanto por SLAAC como por DHCPv6, la dirección SLAAC se agregará como /64 y la dirección DHCPv6 como /128, lo que significa que su dirección IP de salida siempre será la DHCPv6 (aunque si una entidad externa conoce su dirección SLAAC, aún podrá contactarlo en ella).

El Cómo: Configuración de su propio router doméstico

Una de las cosas que pensaría de lo anterior es que IPv6 siempre se configura automáticamente y, si bien es cierto que si simplemente conecta su computadora portátil al puerto ethernet de un módem por cable, se configurará automáticamente, la mayoría de las personas tienen una configuración doméstica más compleja que involucra un enrutador, que necesita un coaxial especial antes de que funcione. Eso significa que necesita obtener funciones adicionales de su ISP utilizando solicitudes DHCPv6 especiales.

Esta sección está escrita desde mi propio punto de vista: Tengo una red IPv4 bastante compleja que tiene una red wifi completamente abierta pero con un ancho de banda limitado (para clientes no confiables) y varias redes internas protegidas (una para mi laboratorio, una para mis teléfonos y una para las cámaras de video domésticas), por lo que necesito al menos 4 subredes para dar a cada dispositivo en mi hogar una dirección IPv6. También uso OpenWrt como mi distribución de enrutador, por lo que toda la información de configuración de IPv6 es altamente específica para él (aunque debe tenerse en cuenta que cosas como NetworkManager también pueden hacer todo esto si está preparado para profundizar en la documentación).

Delegación de prefijos

Dado que DHCPv6 solo entrega una dirección /128, esto no es suficiente porque es la dirección IP del enrutador en sí. Para convertirse en enrutador, debe solicitar la delegación de parte del espacio de direcciones IPv6 a través de la opción Asociación de Identidades para la Eliminación de Prefijos (IA_PD) de DHCPv6. Una vez hecho esto, el ISP asumirá que la dirección IP del enrutador es la ruta para todos los prefijos delegados. La sutileza aquí es que si desea más de una subred, debe pedirla específicamente (el cliente debe especificar la longitud de prefijo exacta que está buscando) y como es una longitud de prefijo, y su subred predeterminada debe ser /64, si solicita una longitud de prefijo de 64, solo tiene una subred. Si solicita 63, tiene 2 y así sucesivamente. El problema es ¿cómo sabes cuántas subredes está dispuesto a darte el ISP? Desafortunadamente, no hay forma de encontrar esto (tuve que hacer una búsqueda en Internet para descubrir que mi ISP, Comcast, estaba dispuesto a delegar una longitud de prefijo de 60, es decir, 16 subredes). Si la búsqueda no le dice cuánto está dispuesto a delegar su ISP, puede intentar comenzar en 48 y llegar a 64 en incrementos de 1 para ver cuál es la delegación más grande con la que puede salirse con la suya (Ha habido informes de ISP que lo bloquean en la longitud del prefijo delegado por primera vez, así que no comience en 64). La sutileza final es que el prefijo que se delega puede no ser el mismo prefijo que la dirección que obtuvo su enrutador (mi configuración actual de comcast tiene mi enrutador en 2001:558:600a: but pero mi prefijo delegado es 2601:600:8280:66d0:/60). Tenga en cuenta que puede ejecutar odhcp6c manualmente con la opción-P si tiene que sondear a su ISP para averiguar qué tamaño de prefijo puede obtener.

Configurar el enrutador para Delegación de Prefijos

En términos de OpenWrt, la configuración de WAN DHCP(v6) del enrutador está controlada por /etc/default/network. Ya tendrá una interfaz WAN (probablemente llamada «wan») para DHCPv4, por lo que simplemente agregue una interfaz wan6 adicional para obtener un IPv6 adicional y convertirse en dual stack. En mi configuración esto se ve como

config interface 'wan6' option ifname '@wan' option proto 'dhcpv6' option reqprefix 60

La ligera rareza es el ifname: @wan simplemente le dice a la configuración que use el mismo ifname que la interfaz ‘wan’. Nombrarlo de esta manera es esencial si su wan es un puente, pero es una buena práctica de todos modos. La otra opción ‘reqprefix’ le dice a DHCPv6 que solicite una delegación de prefijos / 60.

Repartir Prefijos Delegados

Esto resulta ser notablemente simple. En primer lugar, debe asignar un prefijo delegado a cada una de sus otras interfaces en el enrutador, pero puede hacerlo sin agregar una nueva interfaz OpenWrt para cada una de ellas. Mi red IPv4 interna tiene todas las direcciones estáticas, por lo que agrega tres directivas a cada una de las interfaces:

config interface 'lan' ... interface designation (bridge for me) option proto 'static' ... ipv4 addresses option ip6assign '64' option ip6hint '1' option ip6ifaceid '::ff'

ip6assign ‘N’ significa que usted es una red / N (esto es siempre /64 para mí) y ip6hint ‘N’ significa usar N como su id de subred y ip6ifaceid ‘S’ significa usar S como el sufijo IPv6 (Esto por defecto es ::1, así que si está de acuerdo con eso, omita esta directiva). Así que dado que tengo un prefijo 2601:600:8280: 66d0::/60, la dirección global de esta interfaz será 2601:600:8280: 66d1:: ff. Ahora, la prueba de fuego, si lo ha entendido bien, esta dirección global debería poder conectarse desde cualquier lugar de Internet IPv6 (si no lo es, es probable que sea un problema de firewall, consulte a continuación).

Publicidad como enrutador

Simplemente delegar un prefijo delegado en una interfaz de enrutador local es insuficiente . Ahora necesita que su enrutador responda a las solicitudes de enrutador en ff02:: 2 y opcionalmente haga DHCPv6. Desafortunadamente, OpenWrt tiene dos mecanismos para hacer esto, generalmente ambos instalados: odhcpd y dnsmasq. Lo que encontré fue que ninguna de mis directivas en /etc/config/dhcp entraría en vigor hasta que desactivara odhcpd completamente

/etc/init.d/odhcpd stop/etc/init.d/odhcpd disable

y dado que uso dnsmasq extensivamente en otros lugares (DNS dividido para redes internas/externas), eso me resultó bien. En primer lugar describiré qué opciones necesita en dnsmasq y, en segundo lugar, cómo puede lograr esto utilizando entradas en el archivo OpenWrt /etc/config/dhcp (me parece útil porque siempre es aconsejable verificar lo que OpenWrt ha puesto en /var/etc/dnsmasq.conf archivo).

La primera opción de dnsmasq que necesita es ‘enable-ra’, que es un parámetro global que indica a dnsmasq que maneje los anuncios de enrutadores. El siguiente parámetro que necesita es el ‘ra-param’ por interfaz, que especifica los parámetros de publicidad del enrutador global y debe aparecer una vez por cada interfaz en la que desee anunciarse. Finalmente, la opción ‘dhcp-range’ permite una configuración más detallada del tipo de banderas RA y DHCPv6 opcional.

SLAAC o DHCPv6 (o ambos)

En muchos sentidos, esto es una cuestión de elección personal. Si permites SLAAC, los hosts que quieran usar direcciones de extensión de privacidad (como los teléfonos Android) pueden hacerlo, lo cual es bueno. Si también permite la selección de direcciones DHCPv6, tendrá una lista de direcciones asignadas a los hosts y dnsmasq hará la resolución DNS para ellos (aunque puede hacer DNS para las direcciones SLAAC siempre que se le informe sobre ellas). Existe una etiqueta especial ‘ constructor ‘para la opción’ dhcp-range ‘ que le indica que construya la dirección suministrada (ya sea para RA o DHCPv6) a partir del prefijo global IPv6 de la interfaz especificada, que es la forma de distribuir nuestras direcciones de prefijo delegadas. Los modos para ‘dhcp-range’ son ‘ ra-only ‘para no permitir DHCPv6 por completo,’ slaac ‘para permitir la selección de direcciones DHCPv6 y’ ra-stateless ‘ para no permitir la selección de direcciones DHCPv6 pero permitir otra información de configuración de DHCPv6.

Basado en prueba y error (y finalmente examinando el scripting en /etc / init.d / dnsmasq) las opciones de OpenWrt necesarias para lograr las opciones de dnsmasq anteriores son

config dhcp lan option interface lan option start 100 option limit 150 option leasetime 1h option dhcpv6 'server' option ra_management '1' option ra 'server'

con ‘ra_management’ como opción clave con ‘0’ que significa SLAAC con opciones DHCPv6, ‘1’ que significa SLAAC con DHCPv6 completo, ‘2’ que significa solo DHCPv6 y ‘3’ que significa solo SLAAC. Otra rareza de OpenWrt es que no parece haber una forma de establecer el rango de arrendamiento: siempre es solo estático o ::1000 a ::ffff.

Configuración del cortafuegos

Una de las cosas que hace tropezar a la gente es el hecho de que Linux tiene dos cortafuegos completamente separados: uno para IPv4 y otro para IPv6. Si alguna vez ha escrito reglas personalizadas para ellos, lo más probable es que lo haya hecho en el firewall OpenWrt /etc/.user file y utilizó el comando iptables, lo que significa que solo agregó las reglas al firewall IPv4. Para agregar la misma regla para IPv6, debe duplicarla utilizando el comando ip6tables. Otro problema importante, si está utilizando un seguimiento de conexiones para la detección de golpes de puerto, como yo, es que el seguimiento de conexiones de Linux tiene dificultades con la multidifusión IPv6, por lo que los paquetes que salen a una multidifusión pero regresan como unidifusión (como lo hacen la mayoría de los protocolos de detección) obtienen el estado de conexión incorrecto. Para solucionar esto, finalmente tuve que tener una regla de ENTRADA que aceptara todos los ICMPv6 y DHCPv6 (puertos udp 546 y 547 ). Las otras consideraciones del firewall son que ahora todo el mundo tiene su propia dirección IP, no hay necesidad de NAT (se puede persuadir a OpenWrt para que se encargue de esto automáticamente, pero si está duplicando las reglas IPv4 manualmente, no duplique las reglas NAT). El último es probablemente más aplicable a mí: mi interfaz wifi está diseñada para ser una extensión de Internet local y se espera que todas las máquinas que se conectan a ella puedan protegerse a sí mismas, ya que migrarán a entornos hostiles como wifi de aeropuerto, por lo que expongo completamente los dispositivos conectados a wifi a Internet general para todos los puertos, incluidas las sondas de puertos. Para mis dispositivos internos, tengo una regla RELACIONADA y ESTABLECIDA para asegurarme de que no se sondeen, ya que no están diseñados para migrar fuera de la red interna.

Ahora los problemas con OpenWrt: dado que desea NAT en IPv4 pero no en IPv6, debe tener dos zonas wan separadas para ellos: si intenta combinarlas (como lo hice al principio), OpenWrt agregará una regla NO VÁLIDA IPv6-ctstate que evitará que la detección de vecinos funcione debido a los problemas de conexión con la multidifusión IPv6, por lo que mis zonas wan lo son (bueno, esto es mentira porque mi firewall ahora está hecho a mano, pero esto es lo que comprobé que funcionó antes de colocar el firewall hecho a mano):

config zone option name 'wan' option network 'wan' option masq '1' ...config zone option name 'wan6' option network 'wan6' ...

Y las reglas de enrutamiento para la zona lan (totalmente accesible) son

config forwarding option src 'lan' option dest 'wan'config forwarding option src 'lan' option dest 'wan6'config forwarding option src 'wan6' option dest 'lan'

: Conectar los Clientes IPv6

Ahora que tiene su enrutador configurado, todo debería funcionar. Si lo hizo, la interfaz wifi de su computadora portátil ahora debería tener una dirección IPv6 global

ip -6 address show dev wlan0

Si vuelve vacía, debe habilitar IPv6 en su distribución. Si solo tiene una dirección local de enlace (fe80:: prefix), IPv6 está habilitado, pero su enrutador no está anunciando (problemas sospechosos de firewall con los paquetes de detección o mala configuración de dnsmasq). Si ves una dirección global, estás acabado. Ahora debería poder ir a https://testv6.com y obtener una puntuación de 10/10.

La pieza final del rompecabezas es preferir su nueva conexión IPv6 cuando DNS ofrece una opción de direcciones IPv4 o IPv6. Todos los clientes Linux modernos deberían preferir IPv6 cuando estén disponibles si están conectados a una red de doble pila, así que intente try si hace ping, digamos, www.google.com y vea una dirección IPv6 que ha terminado. Si no, debe adentrarse en el turbio mundo del etiquetado de direcciones IPv6 (RFC 6724) y gai.conf.

Conclusión

Agregar IPv6 a la configuración existente de IPv4 no es actualmente una operación simple de conexión y conexión. Sin embargo, siempre que entienda un puñado de diferencias entre los dos protocolos, tampoco es un problema insuperable. También he pasado por alto muchos de los problemas que podría encontrar con su ISP. Algunas personas han informado que sus ISP solo entregan una dirección IPv6 sin delegación de prefijos, en cuyo caso creo que encontrar un nuevo ISP sería lo más sabio. Otros informan que el ISP solo delegará un prefijo /64, por lo que su opción aquí es ejecutar solo una subred (probablemente suficiente para muchas redes domésticas), o una subred mayor que /64 y prohibir SLAAC, que definitivamente no es una configuración recomendada. Sin embargo, siempre que su ISP sea razonable, esta publicación de blog debería ayudarlo a comenzar.

Write a Comment

Tu dirección de correo electrónico no será publicada.