26 abril, 2024

Usando QEMU/KVM con LibVirt (3/6) Redes Virtuales

Los ficheros de configuración de las redes los encontraremos en:

etc/libvirt/qemu/networks/*.xml

El componete principal del las redes libvirt son los “Switch-Virtuales”, conmutador de red virtual, al que las maquinas se conectaran a los NIC (vNIC) de estas.

Si realizamos un ifconfig veremos que tenemos un dispositivo virbrX virtual que creemos y tengamos activa , esto son los Switch-Virtuales, y un dispositivo (vnetX) por cada vNIC que este levantado en las maquinas virtuales. Aunque esto nos los directamente virt-manager, mas adelante veremos exactamente como crear las redes, en la opción Editar→Detalles_Conexión dentro de la carpeta “Redes Virtuales”.

Desde comando podremos crear estos dispositivos de la siguiente forma

brctl addbr // Switch Virtuales
// Los vNICs tipos TIN/TAP
ip tuntap add dev mode tap
brctl addif

Los diferentes tipos de redes que podremos configurar son:

  1. NAT: Las maquinas virtuales pueden comunicarse con el exterior, pero el exterior no con ellas y lo realizan mediante una interfaz de red puente.
  2. Enrutada: Permiten la conexión de las maquinas virtuales directamente a la red física
  3. Insolated (Aislada): Nos permite crear una red privada entre el hipervisor y las maquinas virtuales
  4. SR-IOV: Dispositivo PCI directamente, logrando una red nativa en la maquina virtual.
  5. MacVtap Se utiliza para permitir que usuarios de la red Local se conecten a las maquinas virtuales, pero no deseamos crear un puente.
  6. Puente: Una red con puente comparte un dispositivo Ethernet real con las máquinas virtuales (VM), estas maquinas tendrán una IP de la LAN como si de una maquina física se tratara.

1.- Modo NAT

Este es el modo por defectos que se crea y es el más sencillo es el mejor a utilizar para la primera configuración de nuestras maquinas ya que dispone de salida a Internet.

En este caso las maquinas invitadas se conectan al Switch-Virtual (virbrX) y este funciona en modo NAT de forma que se utiliza la IP del anfitrión para conectarse al exterior.

En este modo tendremos las siguientes conexiones:

  • Conectarnos a servidores externos mediante NAT, conexión saliente.
  • Conectarnos desde nuestra maquina anfitriona a la invitada.
  • Conexión desde otras maquinas invitadas de la misma red.
  • Cualquier otra conexión procedente del exterior no se podra conectar a nuestra maquina privada.

Los Switch-Virtuales disponen de un servidor DHCP (dnsmasq) que nos permite asignar Ips, dentro del rango que configuremos, a las maquinas invitadas que se conecten a esa red de forma automática.

Para cada red se habilita una instancia de dnsmasq de forma que solo podrán acceder a ella las maquinas invitadas de esa red.

Al crear una red NAT nos solicitara:

  • Nombre de la red
  • Modo “NAT”
  • Dispositivo puente de acceso al exterior
    • Interfaz física
    • Interfaz agregados “Bonding”
    • VLAN
  • O cualquier dispositivo (utilizado en nuestro NAT default)
  • Configuración IPv4 e IPv6
    • RED
    • Si deseamos tener DHCP y la configuración de este para definir el rango.
  • Nombre de dominio

Desde linea de comandos podremos ejecutar virsh con los siguientes parámetros:

  • net-list – -all // Listado de las redes configuradas y sus estado.
  • net-dumpxml default //Volcamos la configuración XML de nuestra red por defecto.
  • net-edit <red> Para editar la configuración, desde virt-manager también se puede en modo texto.
  • net-info <red> /Información de la red. Podemos ver el dispositivo de switch-virtual que utiliza
  • net-start, net-destroy, net-autostart <red>

También podemos utilizar otros comandos del sistema para obtener información de los interfaz como ifconfig o brctl show que nos informara de los Switch-Virtuales y los interfaz de vNIC que están conectados a estos.

Al crear la red libvirt creara reglas iptables para permitir que el trafico al dispositivo virtual virbrX, los chains INPUT, OUTPUT, FORWARD y POSTROUTING, y habilitara ip_forward en caso de que no se habilite o alguna aplicación los inhaboilite lo podemos activar modificando el fichero “/etc/sysctl.conf” poniendo la linea net.ipv4.ip_forward=1.

Se comento al principio que una maquina externa no podría conectarse a nuestra maquina invitada, es decir no podremos tener un servicio en nuestra invitada, pero eso no es del todo cierto ya que podemos configurar reglas de iptables que nos permitan reenviar conexiones entrantes (del exterior) a nuestra maquina anfitriona por un puerto a un puerto de nuestra maquina invitada.

Para realizar esto editaremos o crearemos el archivo “/etc/libvirt/hooks/qemu” con permiso de ejecución (es un script) con el siguiente bloque de código para cada redirección que se desee realizar.

#!/bin/bash
# IMPORTANT: Change the "VM NAME" string to match your actual VM Name.
# In order to create rules to other VMs, just duplicate the below block and configure
# it accordingly.
If [ "${1}" = "<NOMBRE_MAQUINA>" ]; then
   IP_INVITADA=<IP MAQUINA INVITADA>
   PUERTO_INVITADA=<PUERTO INVITADA DE RECEPCIÓN>
   PUERTO_ANFITRION=<PUERTO ANFITRION A RENVIAR>

   if [ "${2}" = "stopped" ] || [ "${2}" = "reconnect" ]; then
	/sbin/iptables -D FORWARD -o <INTERFAZ SwitchVirtual> -p tcp -d $IP_INVITADA --dport $PUERTO_INVITADA -j ACCEPT
	/sbin/iptables -t nat -D PREROUTING -p tcp --dport $PUERTO_ANFITRION -j DNAT --to $IP_INVITADA:$PUERTO_INVITADA
   fi
   if [ "${2}" = "start" ] || [ "${2}" = "reconnect" ]; then
	/sbin/iptables -I FORWARD -o <INTERFAZ SwitchVirtual> -p tcp -d $IP_INVITADA --dport $PUERTO_INVITADA -j ACCEPT
	/sbin/iptables -t nat -I PREROUTING -p tcp --dport $PUERTO_ANFITRION -j DNAT --to $IP_INVITADA:$PUERTO_INVITADA
   fi
fi

2.- Modo Enrutado

En este modo similar al anterior y también utiliza el Switch virtual pero en este caso este esta conectado a la LAN del anfitrión sin realizar NAT, de esta forma las maquinas virtuales invitadas estarán en una subred del anfitrión pero no serán vista por maquinas de la red del anfitrión (estas no conocen la subred) por lo tanto si queremos que las maquinas de nuestra red local (red del anfitrión) vean a las maquinas virtuales sera necesario configurar reglas en los routers en la red física para que estas conozcan la subred.

3.-Modo Insolated (Red Cerrada)

Este modo lo utilizaremos para que solo se vean las maquinas virtuales configuradas en esta red, por lo tanto no tendremos acceso al exterior.

Como es lógico en este modo no nos solicita el dispositivo ya que todo se queda interno, lo que si generara en el anfitrión un dispositivo conectado a esta red.

4.- Modo Puente

Las máquinas virtuales invitadas aparecen dentro de la misma subred que la máquina física del host y la máquinas físicas en la misma red física son conscientes de las máquinas virtuales y pueden acceder a ellas, modo puente opera en Capa 2 del modelo de red OSI.

5.- MacVTAP

El controlador macvtap nos permite conectar la NIC del invitado directamente a una interfaz física específica de la máquina host.

La conexión Macvtap tiene los siguientes modos: VEPA, puente, privado, passthrouth.

3 comentarios en «Usando QEMU/KVM con LibVirt (3/6) Redes Virtuales»

  1. Hola, he seguido los pasos que comentas y no consigo redirigir los puertos correctamente, el bloque de código me queda así:

    #!/bin/bash
    # IMPORTANT: Change the «VM NAME» string to match your actual VM Name.
    # In order to create rules to other VMs, just duplicate the below block and configure
    # it accordingly.
    if [ «${1}» = «vm1» ] ; then
    IP_INVITADA=192.168.122.249
    PUERTO_INVITADA=23871
    PUERTO_ANFITRION=23871

    if [ «${2}» = «stopped» ] || [ «${2}» = «reconnect» ] ; then
    {
    /sbin/iptables -D FORWARD -o virbr0 -p udp -d $IP_INVITADA –dport $PUERTO_INVITADA -j ACCEPT
    /sbin/iptables -t nat -D PREROUTING -p udp –dport $PUERTO_ANFITRION -j DNAT –to $IP_INVITADA:$PUERTO_INVITADA
    }
    fi
    if [ «${2}» = «start» ] || [ «${2}» = «reconnect» ] ; then
    {
    /sbin/iptables -I FORWARD -o virbr0 -p udp -d $IP_INVITADA –dport $PUERTO_INVITADA -j ACCEPT
    /sbin/iptables -t nat -I PREROUTING -p udp –dport $PUERTO_ANFITRION -j DNAT –to $IP_INVITADA:$PUERTO_INVITADA
    }
    fi
    fi
    En sustituí por virbr0, no estoy seguro de si es así.., ¿debo sustituirlo por vnet0 o es correcto cambiarlo por virbr0?

    1. confirma que en ${1} tienes el nombre que tiene configurado en la maquina, en principio es virbr0 pero para asegurarte ejecuta «ip a» para confirmar que llama asi al dispositivo virtual.
      Confirma también que en tu route tiene abierto el puerto que quieres redirigir.

  2. Hola, estoy tratando de configurar una red 192.168.1.0/24 para que las vm estén dentro de mi misma red pero al momento de hacerlo me da un error «Error al crear red virtual: internal error: Network is already in use by interface enp2s0»
    Me permite crear redes nat en otros segmentos pero no en el mismo de mi red física. Yo lo que necesito es que las vm puedan alcanzar mi red local para probar servicios.
    Gracias.

Responder a Marco Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Información básica sobre protección de datos Ver más

  • Responsable: Javier.
  • Finalidad:  Moderar los comentarios.
  • Legitimación:  Por consentimiento del interesado.
  • Destinatarios y encargados de tratamiento:  No se ceden o comunican datos a terceros para prestar este servicio. El Titular ha contratado los servicios de alojamiento web a Hostinger.es que actúa como encargado de tratamiento.
  • Derechos: Acceder, rectificar y suprimir los datos.
  • Información Adicional: Puede consultar la información detallada en la Política de Privacidad.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos. Contiene enlaces a sitios web de terceros con políticas de privacidad ajenas que podrás aceptar o no cuando accedas a ellos. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Ver
Privacidad