Me pregunto cómo puedo proceder para asignar un ipv4 público a cada máquina virtual que se está creando.
Configuración: servidor host con 3 IP en CentOS8 usando libvirt y kvm para virtualizar Bridge br0 usando eth0 como interfaz.
Después de muchas pruebas y errores, logré hacerlo manualmente usando un puente y asignando la dirección IP a la interfaz del archivo de red del sistema operativo invitado.
Aunque desearía que esto fuera automático considerando que si reinstalo el sistema operativo ahora volvería a no tener la dirección IP y la identificación, tendría que conectarme al invitado y editar la dirección IPv4 en los archivos de red manualmente cada vez. ¿Cómo puedo evitar esto?
Objetivo: cada IPv4 está bloqueado en una máquina virtual y permanecerá sin importar si se reinstala el sistema operativo.
Objetivo opcional: si algún IPv4 del sistema operativo host no se utiliza, se debe asignar a la siguiente máquina virtual creada.
¿Tengo que codificar mi propio software para hacer esto cada vez o hay una manera más sencilla?
Respuesta1
Para eso está el DHCP.
Puedes elegir libremente sus direcciones MAC, ¿verdad? Configure un servidor DHCP en el sistema en el mismo segmento de Ethernet (posiblemente virtual) que las VM y vincule sus IP a ciertas MAC.
También necesitará distribuir algunas rutas (use las opciones DHCP 121 y 249). La máquina con servidor DHCP no necesita tener una IP pública o una IP en la misma red que todos los clientes; la comunicación con el servidor DHCP se produce cuando todavía no hay direcciones configuradas en el cliente.
Si utiliza ISC DHCP, debe hacer algo como lo siguiente. Supongo que su máquina host es su enrutador y su caja NAT para máquinas virtuales y también alojará su servidor DHCP. Si desea hacerlo de otra manera, será necesario realizar pequeños ajustes:
- defina las opciones 121 y 249 en algún lugar alrededor de la parte superior
dhcpd.conf
de:
option rfc3442-classless-static-routes code 121 = array of integer 8;
option ms-classless-static-routes code 249 = array of integer 8;
Probablemente las nuevas versiones no necesiten esto, pero la mía sí.
- crea un
shared-network
bloque, pon tu subred privada dinámica y tus direcciones públicas como "subredes" con máscaras 32:
option routers 192.168.210.1;
option domain-name-servers 8.8.8.8, 8.8.4.4;
shared-network libvirt-vm-net {
subnet 192.168.210.0 netmask 255.255.255.0 {
range 192.168.210.2 192.168.210.254;
}
subnet 192.0.2.1 netmask 255.255.255.255 {
option rfc3442-classless-static-routes 32, 192,168,210,1, 0,0,0,0, 0, 192,168,210,1;
option ms-classless-static-routes 32, 192,168,210,1, 0,0,0,0, 0, 192,168,210,1;
}
...
}
Supongo que su red "privada" para máquinas detrás de NAT será 192.168.210.0/24 y el host será .1 en esa red (asignado a un puente). La configuración de rutas estáticas sin clases (opciones 121 y 249) agregará las siguientes rutas:
ip route add 192.168.210.1 dev eth0
ip route add default via 192.168.210.1
que son necesarios para que todo funcione a pesar de que no hay ninguna subred que contenga 192.0.2.1/32 y 192.168.210.1; Será mejor que pruebe dicha configuración en un entorno de laboratorio si no está seguro de cómo funciona este enrutamiento.
- cree definiciones de host con las direcciones MAC que desee vinculadas a sus direcciones IP estáticas:
host public-server-1 { hardware ethernet 00:11:22:33:44:55; fixed-address 192.0.2.1; }
...
- agregue entradas de vecino estático ("ARP") para esas MAC en
/etc/ethers
(en el host):
00:11:22:33:44:55 192.0.2.1
...
- agregar rutas estáticas hacia esas direcciones a través de la interfaz puente correspondiente; No sé cómo hacer esto usando la configuración de red estándar de su distribución de sistema operativo, pero la forma genérica de Linux es así:
ip route add 192.0.2.1 dev br0
...
Luego asegúrese de asignar esas MAC a sus VM importantes dentro de las configuraciones de libvirt. Otras máquinas virtuales (cuyas MAC no están vinculadas) obtendrán sus direcciones del rango configurado como de costumbre.
En realidad, implementé y probé esta configuración en una configuración aún "más compleja" (DHCP, host y enrutador eran sistemas distintos), además no uso libvirt y mi host es PVE. Incluso el arranque PXE funciona perfectamente tanto para máquinas de subred "normales" (como 192.168.210.0 en el ejemplo) como para máquinas de "IP pública" (como 192.0.2.1).
Para permitir que todas las máquinas virtuales accedan a Internet, debe usar NAT para IP privadas y no para públicas; No es un problema, usa la regla como iptables -t nat -A POSTROUTING -o <physical-interface-with-public-ip> -s <private-ip-range> -j MASQUERADE
. De esta manera, su rango privado se traducirá a la dirección pública del propio host, pero las direcciones públicas no se traducirán, sino que se enrutarán tal como están. Nuevamente, no hay problema en tener direcciones públicas y privadas en el mismo segmento de red y recorrer la misma NIC virtual.