IPv4 vs IPv6: diferencias y configuración dual-stack en Linux

¿Cuál es la diferencia entre IPv4 e IPv6?

IPv4 e IPv6 son dos versiones del Protocolo de Internet utilizadas para identificar dispositivos en una red.

Característica IPv4 IPv6
Longitud de dirección 32 bits 128 bits
Formato de dirección Decimal con puntos: 203.0.113.10 Hexadecimal con dos puntos: 2001:0db8:85a3::8a2e:0370:7334
Total de direcciones ~4.300 millones ~340 sextillones (3,4 × 10³⁸)
Configuración Manual o DHCP SLAAC (automática), DHCPv6 o manual
NAT Ampliamente usado (necesario por escasez de direcciones) No es necesario (cada dispositivo obtiene una dirección pública)
Tamaño del encabezado Variable (20–60 bytes) Fijo (40 bytes, más simple)
IPSec Opcional Integrado (obligatorio en la especificación)
Broadcast No (usa multicast en su lugar)

Tipos de direcciones IPv6

Tipo Prefijo Descripción
Global Unicast 2000::/3 Direcciones públicas y enrutables (equivalente a IPv4 públicas)
Link-Local fe80::/10 Autoasignadas, válidas solo dentro del segmento de red local
Unique Local (ULA) fd00::/8 Direcciones privadas (equivalente a 10.x.x.x, 192.168.x.x en IPv4)
Loopback ::1 Equivalente a 127.0.0.1

Verificar su configuración IP actual

Ver direcciones IPv4 e IPv6

ip addr show

Ver solo IPv4

ip -4 addr show

Ver solo IPv6

ip -6 addr show

Verificar rutas predeterminadas

ip -4 route show    # Rutas IPv4
ip -6 route show    # Rutas IPv6

Configuración dual-stack

Dual-stack significa ejecutar IPv4 e IPv6 simultáneamente en la misma interfaz. Este es el enfoque recomendado para la transición a IPv6 mientras se mantiene la compatibilidad con IPv4.

Netplan (Ubuntu 18.04+)

network:
  version: 2
  ethernets:
    ens18:
      addresses:
        - 203.0.113.10/24
        - 2001:db8::10/64
      routes:
        - to: default
          via: 203.0.113.1
        - to: default
          via: 2001:db8::1
      nameservers:
        addresses:
          - 8.8.8.8
          - 2001:4860:4860::8888

Aplicar con:

sudo netplan apply

/etc/network/interfaces (Debian)

auto eth0
iface eth0 inet static
    address 203.0.113.10
    netmask 255.255.255.0
    gateway 203.0.113.1

iface eth0 inet6 static
    address 2001:db8::10
    netmask 64
    gateway 2001:db8::1

Aplicar con:

sudo systemctl restart networking

NetworkManager (AlmaLinux / RHEL)

sudo nmcli connection modify "System eth0" \
  ipv4.addresses 203.0.113.10/24 \
  ipv4.gateway 203.0.113.1 \
  ipv4.method manual \
  ipv6.addresses 2001:db8::10/64 \
  ipv6.gateway 2001:db8::1 \
  ipv6.method manual
sudo nmcli connection up "System eth0"

Probar conectividad IPv6

ping -6 ipv6.google.com
ping6 ipv6.google.com     # sintaxis antigua
traceroute -6 ipv6.google.com
curl -6 https://ipv6.google.com

Deshabilitar IPv6 (si es necesario)

En algunos casos, puede necesitar deshabilitar IPv6 temporalmente:

sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1
sudo sysctl -w net.ipv6.conf.default.disable_ipv6=1

Para hacerlo persistente, agregue a /etc/sysctl.conf:

net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

Luego aplique: sudo sysctl -p

Consideraciones de firewall

Si usa UFW, este maneja IPv4 e IPv6 automáticamente (si IPv6 está habilitado en /etc/default/ufw). Sus reglas se aplican a ambos protocolos:

sudo ufw allow ssh    # Permite SSH tanto en IPv4 como IPv6

Si usa iptables directamente, tenga en cuenta que las reglas IPv6 requieren ip6tables:

sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT     # IPv4
sudo ip6tables -A INPUT -p tcp --dport 22 -j ACCEPT    # IPv6