Estou querendo saber como eu iria atribuir um IPv4 público para cada vm que está sendo criada.
Setup : Host Server com 3 IPs no CentOS8 usando libvirt e kvm para virtualizar Bridge br0 usando eth0 como interface.
Depois de muita tentativa e erro, consegui fazer isso manualmente usando uma ponte e atribuindo o endereço IP à interface do arquivo de rede do sistema operacional convidado.
Embora eu deseje que isso seja automático, considerando que, se eu reinstalar o sistema operacional agora, ele voltará a não ter o endereço IP e o id para se conectar ao convidado e editar o endereço ipv4 nos arquivos de rede manualmente todas as vezes. Como posso evitar isso ?
Objetivo: cada IPv4 é bloqueado para uma máquina virtual e permanecerá, não importa se o sistema operacional for reinstalado.
Objetivo opcional: se algum IPv4 do sistema operacional host não for usado, ele deverá ser atribuído à próxima VM criada.
Eu tenho que codificar meu próprio software para fazer isso sempre ou existe uma maneira mais simples?
É 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) que as VMs e vincule seus IPs a determinados MACs.
Você também precisará distribuir algumas rotas (use as opções DHCP 121 e 249). 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ê usa DHCP ISC, você precisa fazer algo como o seguinte. Estou assumindo que sua máquina host é 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:
dhcpd.conf
:provavelmente, novas versões não precisam disso, mas a minha sim.
shared-network
bloco, coloque sua sub-rede privada dinâmica e seus endereços públicos como "sub-redes" com máscaras 32:Estou assumindo 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ída a uma ponte). A configuração de rotas sem classes estáticas (opções 121 e 249) adicionará as seguintes rotas:
que são necessários para que tudo funcione apesar do fato de não haver sub-rede contendo 192.0.2.1/32 e 192.168.210.1; melhor tentar essa configuração no ambiente de laboratório se você não tiver certeza de como esse roteamento funciona
/etc/ethers
(no host):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 como de costume.
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. Mesmo a inicialização PXE funciona perfeitamente para máquinas de sub-rede "normais" (como 192.168.210.0 no exemplo) e 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 público; 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 percorrer o mesmo NIC virtual.