Atribuir um IPv4 público automaticamente a cada VM KVM que está sendo criada?

Atribuir um IPv4 público automaticamente a cada VM KVM que está sendo criada?

Estou me perguntando como proceder para atribuir um ipv4 público a cada VM que está sendo criada.

Configuração: Servidor Host com 3 IPs no CentOS8 usando libvirt e kvm para virtualizar Bridge br0 usando eth0 como interface.

Depois de muitas tentativas e erros, consegui fazer isso manualmente usando uma ponte e atribuindo o endereço IP à interface do arquivo de rede do sistema operacional convidado.

Embora eu desejasse que isso fosse automático, considerando que se eu reinstalar o sistema operacional agora, ele voltaria a não ter o endereço IP e o ID, teria que se conectar ao convidado e editar o endereço IPv4 nos arquivos de rede manualmente sempre. Como posso evitar isso ?

Objetivo: cada IPv4 é bloqueado para uma máquina virtual e permanecerá independentemente de o sistema operacional ser reinstalado.

Objetivo opcional: se algum IPv4 do sistema operacional host não for utilizado, ele deverá ser atribuído à próxima VM criada.

Preciso codificar meu próprio software para fazer isso sempre ou existe uma maneira mais simples?

Responder1

É para isso que serve o DHCP.

Você pode escolher livremente seus endereços MAC, certo? Configure um servidor DHCP no sistema no mesmo segmento Ethernet (possivelmente virtual) das VMs e vincule seus IPs a determinados MACs.

Você também precisará distribuir algumas rotas (use as opções 121 e 249 do DHCP). A própria máquina com servidor DHCP não precisa ter IP público ou IP na mesma rede de todos os clientes; a comunicação com o servidor DHCP ocorre quando ainda não há endereços configurados no cliente.

Se você usar ISC DHCP, precisará fazer algo como o seguinte. Presumo que sua máquina host seja seu roteador e caixa NAT para VMs e também hospedará seu servidor DHCP. Caso queira fazer de outra forma, serão necessários pequenos ajustes:

  • defina as opções 121 e 249 em algum lugar no topo de dhcpd.conf:
option rfc3442-classless-static-routes code 121 = array of integer 8;
option ms-classless-static-routes code 249 = array of integer 8;

provavelmente, as novas versões não precisam disso, mas a minha precisa.

  • crie um shared-networkbloco, coloque sua sub-rede privada dinâmica e seus endereços públicos como "sub-redes" com 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;        
    }

    ...
}

Presumo que sua rede "privada" para máquinas atrás de NAT será 192.168.210.0/24 e o host será .1 nessa rede (atribuído a uma ponte). A configuração de rotas estáticas sem classe (opções 121 e 249) adicionará as seguintes rotas:

ip route add 192.168.210.1 dev eth0
ip route add default via 192.168.210.1

que são necessários para que tudo funcione, apesar de não haver sub-rede contendo 192.0.2.1/32 e 192.168.210.1; é melhor tentar essa configuração em ambiente de laboratório se você não tiver certeza de como esse roteamento funciona

  • crie definições de host com os endereços MAC desejados vinculados aos seus endereços IP estáticos:
host public-server-1 { hardware ethernet 00:11:22:33:44:55; fixed-address 192.0.2.1; }
...
  • adicione entradas de vizinho estático ("ARP") para esses MACs /etc/ethers(no host):
00:11:22:33:44:55 192.0.2.1
...
  • adicione rotas estáticas para esses endereços através da interface de ponte correspondente; Não sei como fazer isso usando a configuração de rede padrão da sua distribuição de sistema operacional, mas o modo genérico do Linux é assim:
ip route add 192.0.2.1 dev br0
...

Em seguida, certifique-se de atribuir esses MACs às suas VMs importantes nas configurações da libvirt. Outras VMs (cujos MACs não estão vinculados) obterão seus endereços do intervalo configurado normalmente.

Na verdade eu implementei e testei essa configuração em configurações ainda "mais complexas" (DHCP, host e roteador eram sistemas distintos), também não uso libvirt e meu host é PVE. Até a inicialização PXE funciona perfeitamente tanto para máquinas de sub-rede "normais" (como 192.168.210.0 no exemplo) quanto para máquinas de "IP público" (como 192.0.2.1).

Para permitir que todas as VMs acessem a Internet você deve usar NAT para IPs privados e não usá-lo para IPs públicos; não é um problema, use a regra como iptables -t nat -A POSTROUTING -o <physical-interface-with-public-ip> -s <private-ip-range> -j MASQUERADE. Dessa forma, seu intervalo privado será traduzido para o endereço público do próprio host, mas os endereços públicos não serão traduzidos, mas serão roteados como estão. Novamente, não há problema em ter endereços públicos e privados no mesmo segmento de rede e navegar pela mesma NIC virtual.

informação relacionada