Xen en Ubuntu 18.04 con IPv4 (NAT) e IPv6

Xen en Ubuntu 18.04 con IPv4 (NAT) e IPv6

Estoy alquilando un servidor dedicado en Hetzner e instalé el servidor Ubuntu 18.04 LTS en él. Tengo dos direcciones IPv4 públicas llamadas xxxx y yyyy y un bloque IPv6/64 para conectar mis redes privadas a Internet. Yo uso NAT para IPv4.

Esquema XEN Mi red está configurada usando Netplan de la siguiente manera:

network:    
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      addresses:
        - x.x.x.x/32
        - y.y.y.y/32
        - a.a.a.a::2/64
      routes:
        - on-link: true
          to: 0.0.0.0/0
          via: z.z.z.z
      gateway6: fe80::1
      nameservers:
        addresses:
          - 1.1.1.1
          - 1.0.0.1
          - 2606:4700:4700::1111
          - 2606:4700:4700::1001
  bridges:
    xenbr0:
      interfaces: []
      addresses:
        - 192.168.0.1/24
        - a.a.a.a::3/64
      parameters:
        forward-delay: 0
        stp: false
    xenbr1:
      interfaces: []
      addresses:
        - 192.168.1.1/24
        - a.a.a.a::4/64
      parameters:
        forward-delay: 0
        stp: false

La instalación y configuración de XEN:

sudo apt-get install xen-hypervisor-amd64 xen-tools
sudo reboot
sudo vim /etc/default/grub
   GRUB_CMDLINE_XEN_DEFAULT="dom0_mem=min:1024M,max:1024M dom0_max_vcpus=2 dom0_vcpus_pin"
sudo vim /etc/xen/xl.conf
   autoballoon=0
sudo update-grub
sudo reboot

Las máquinas virtuales deben ser accesibles desde y hacia Internet mediante reenvío de IP y NAT.

sudo vim /etc/sysctl.conf
   net.ipv4.ip_forward=1
sudo sysctl -p /etc/sysctl.conf
sudo apt-get install iptables-persistent

La parte NAT:

sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Reenviar solicitudes HTTP y HTTPS a nuestro servidor VM2:

sudo iptables -A PREROUTING -t nat -p tcp -i eth0 -d x.x.x.x --dport 80 -j DNAT --to 192.168.0.11:80
sudo iptables -A PREROUTING -t nat -p tcp -i eth0 -d x.x.x.x --dport 443 -j DNAT --to 192.168.0.11:443

No queremos ningún tráfico entre 192.168.0.x <-> 192.168.0.y, por lo que descartamos todos los paquetes de datos con algunas reglas simples. Esto bloquea la comunicación entre los puentes:

sudo iptables -P FORWARD DROP
sudo iptables -A FORWARD -i eth0 -o xenbr0 -j ACCEPT
sudo iptables -A FORWARD -i xenbr0 -o eth0 -s 192.168.0.0/24 -j ACCEPT
sudo iptables -A FORWARD -i eth0 -o xenbr1 -j ACCEPT
sudo iptables -A FORWARD -i xenbr1 -o eth0 -s 192.168.1.0/24 -j ACCEPT

La parte de IPv4 funciona perfectamente pero la de IPv6 no. Asigné una dirección IPv6 manualmente a mis máquinas virtuales. Cuando inicié sesión en VM1, puedo hacer ping a xenbr0 en la dirección ::3 y a VM2 en la dirección ::11, pero no puedo hacer ping a eth0 en la dirección ::2. Es como si el puente impidiera que el tráfico IPv6 salga de la red pero no pudiera entender por qué.

Respuesta1

He logrado resolverlo. La clave es utilizar una dirección ipv6 con máscara de red /128 que funcionará como puerta de enlace para sus máquinas virtuales. Comencemos modificando la configuración de Netplan:

network:    
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      addresses:
        - x.x.x.x/32
        - y.y.y.y/32
        - a.a.a.a::00/128
        - a.a.a.a::10/128
      routes:
        - on-link: true
          to: 0.0.0.0/0
          via: z.z.z.z
      gateway6: fe80::1
      nameservers:
        addresses:
          - 1.1.1.1
          - 1.0.0.1
          - 2606:4700:4700::1111
          - 2606:4700:4700::1001
  bridges:
    xenbr0:
      interfaces: []
      addresses:
        - 192.168.0.1/24
        - a.a.a.a::00/125
      parameters:
        forward-delay: 0
        stp: false
    xenbr1:
      interfaces: []
      addresses:
        - 192.168.1.1/24
        - a.a.a.a::10/125
      parameters:
        forward-delay: 0
        stp: false

Preste atención a las direcciones ipv6 asignadas a las interfaces eth0, xenbr0 y xenbr1. Eth0 obtiene dos direcciones ipv6 únicas (/128), mientras que xenbr0 y xenbr1 obtienen un bloque de ocho direcciones (/125) que pueden usarse para sus máquinas virtuales. La configuración de red VM1 se ve así:

# The loopback network interface
auto lo
iface lo inet loopback
iface lo0 inet6 loopback

# The primary network interface
auto eth0
iface eth0 inet static
    address 192.168.0.10
    netmask 255.255.255.0
    broadcast 192.168.0.255
    network 192.168.0.0
    gateway 192.168.0.1

iface eth0 inet6 static
    address a:a:a:a::01
    netmask 125
    gateway a:a:a:a::00

Y la configuración de VM3 que usa otro puente:

# The loopback network interface
auto lo
iface lo inet loopback
iface lo0 inet6 loopback

# The primary network interface
auto eth0
iface eth0 inet static
    address 192.168.1.10
    netmask 255.255.255.0
    broadcast 192.168.1.255
    network 192.168.1.0
    gateway 192.168.1.1

iface eth0 inet6 static
    address a:a:a:a::11
    netmask 125
    gateway a:a:a:a::10

Por último, pero no menos importante, no olvide habilitar el reenvío de IP para ipv6.

sudo vim /etc/sysctl.conf
    net.ipv6.conf.all.forwarding=1
sudo sysctl -p /etc/sysctl.conf

información relacionada