Você conectou suas VMs à interface errada. Eles devem ser ligados à interface de rede que se conecta ao mundo externo ( br1
no seu caso).
Lembre-se de que cada VM também deve ter seu endereço IP definido no convidado, não no host.
Estou executando um servidor Debian Linux em Lenny. Dentro dele, estou executando outra instância do Lenny usando o KVM. Ambos os servidores estão disponíveis externamente, com IPs públicos, bem como uma segunda interface com IPs privados para a LAN. Tudo funciona bem, exceto que a VM vê todo o tráfego de rede como originário do servidor host. Eu suspeito que isso possa ter algo a ver com o firewall baseado no iptables que estou rodando no host.
O que eu gostaria de descobrir é: como configurar corretamente a rede do host de modo que todos esses requisitos sejam atendidos?
Atualmente, as interfaces de rede do host são configuradas como pontes. eth0 e eth1 não possuem endereços IP atribuídos a eles, mas br0 e br1 fazem.
/etc/network/interfaces
no host:
# The primary network interface
auto br1
iface br1 inet static
address 24.123.138.34
netmask 255.255.255.248
network 24.123.138.32
broadcast 24.123.138.39
gateway 24.123.138.33
bridge_ports eth1
bridge_stp off
auto br1:0
iface br1:0 inet static
address 24.123.138.36
netmask 255.255.255.248
network 24.123.138.32
broadcast 24.123.138.39
# Internal network
auto br0
iface br0 inet static
address 192.168.1.1
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
bridge_ports eth0
bridge_stp off
Este é o arquivo de configuração libvirt / qemu para a VM:
<domain type='kvm'>
<name>apps</name>
<uuid>636b6620-0949-bc88-3197-37153b88772e</uuid>
<memory>393216</memory>
<currentMemory>393216</currentMemory>
<vcpu>1</vcpu>
<os>
<type arch='i686' machine='pc'>hvm</type>
<boot dev='hd'/>
</os>
<features>
<acpi/>
<apic/>
<pae/>
</features>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>restart</on_crash>
<devices>
<emulator>/usr/bin/kvm</emulator>
<disk type='file' device='cdrom'>
<target dev='hdc' bus='ide'/>
<readonly/>
</disk>
<disk type='file' device='disk'>
<source file='/raid/kvm-images/apps.qcow2'/>
<target dev='vda' bus='virtio'/>
</disk>
<interface type='bridge'>
<mac address='54:52:00:27:5e:02'/>
<source bridge='br0'/>
<model type='virtio'/>
</interface>
<interface type='bridge'>
<mac address='54:52:00:40:cc:7f'/>
<source bridge='br1'/>
<model type='virtio'/>
</interface>
<serial type='pty'>
<target port='0'/>
</serial>
<console type='pty'>
<target port='0'/>
</console>
<input type='mouse' bus='ps2'/>
<graphics type='vnc' port='-1' autoport='yes' keymap='en-us'/>
</devices>
</domain>
Juntamente com as demais regras do firewall, o script de firewall inclui esse comando para transmitir pacotes destinados a um convidado do KVM:
# Allow bridged packets to pass (for KVM guests).
iptables -A FORWARD -m physdev --physdev-is-bridged -j ACCEPT
(Não se aplica a esta questão, mas um efeito colateral da minha configuração de ponte parece ser que eu não posso desligar de forma limpa. O kernel eventualmente me diz "unregister_netdevice: esperando que br1 fique livre" e eu tenho para redefinir o sistema rígido. Talvez um sinal que eu fiz algo idiota?)
Você conectou suas VMs à interface errada. Eles devem ser ligados à interface de rede que se conecta ao mundo externo ( br1
no seu caso).
Lembre-se de que cada VM também deve ter seu endereço IP definido no convidado, não no host.
Por que você precisa de um alias na br1: 0? isso pode estar no caminho
além do alias, a ideia é usar o seguinte esquema:
eth0- > br0 < - dispositivo de toque da VM
o host deve poder usar br0 como se fosse o IF e as VMs usarão os dispositivos de toque como NICs virtuais conectadas a um comutador virtual (que br0 efetivamente se torna aqui)
o mesmo vale para todas as redes, então, para eth1, você terá que configurar uma br1, e trazer as VMs para serem conectadas a br1
Eu tenho a mesma configuração com o Lenny / Squeeze VM dentro de um host Lenny usando lib-virt e virtio bridging para br0 (no br1 nem br0: 0). Ele funciona corretamente sem qualquer configuração especial do iptables no host. Eu faço toda a configuração do meu firewall dentro de cada VM guest.
Acho que você pode se beneficiar da verificação das rotas de rede para ver se sua VM está usando o host como um gateway. O meu é configurado para usar um roteador externo como um gateway. Claro, minha VM e host estão em endereços IP diferentes dentro do mesmo intervalo.