Use uma ponte na sua interface WAN dom0 (por exemplo, KVM Host). Isso requer a instalação do bridge-utils
package. Como esta é a distro baseada no Debian, você pode configurá-la em /etc/network/interfaces
:
iface eth0 inet manual
auto br_wan
iface br_wan inet dhcp
# Assuming DHCP to get address, otherwise migrate all WAN connection options here
#address 192.168.122.0
bridge_ports eth0 tap_guest1
bridge_stp off
bridge_maxwait 0
bridge_fd 0
pre-up ip tuntap add dev tap_guest1 user guest1 mode tap
# This command is required if your ISP allocates static IPs depending on MAC address
# You shouldn't use this but might be handy some time
#pre-up sysctl -q -w net/ipv4/conf/tap_guest1/proxy_arp=1
post-down ip tuntap del tap_guest1 mode tap
Os comandos de pré-configuração configuram a interface TAP para conectar seu convidado KVM a uma ponte. Note que esta configuração permite executar o kvm a partir do guest1 não privilegiado do usuário. Observe que a configuração de net.ipv4.ip_forward = 1
com sysctl também pode ser útil.
Eu usei o comando ip tuntap
do pacote iproute2
. Ainda não está documentado no pacote Debian, mas em breve estará disponível na página de manual do upstream. Como este pacote está instalado em todos os servidores baseados no Debian, você não precisará instalar uml-utilities
ou openvpn
package para criar apenas essas interfaces.
Essa abordagem não tem muita elegância para gerenciar muitas interfaces de toque, porque você precisará criar linhas semelhantes de pré e pós-down para a interface tap_guest1
. Isso pode ser corrigido escrevendo scripts adicionais em /etc/network/pre-up.d
e /etc/network/post-down.d
. Também é um problema se você deseja reconfigurar a interface br_wan
com scripts ifdown / ifup enquanto os convidados do KVM ainda estão em execução - você precisará remover todas as interfaces, exceto eth0
da configuração de pontes e desconectá-las manualmente (don esqueça de anexá-los novamente após a reconfiguração da ponte) ou encerre todas as instâncias do KVM em execução em uma ponte.
Outra maneira, talvez mais limpa, é escrever um script ifup customizado para o próprio KVM e usá-lo na opção script
para seu NIC. Você pode obter um exemplo em /etc/qemu-ifup
. Veja a página de manual do kvm para detalhes.
Então você pode rodar sua caixa KVM assim:
kvm -net nic,model=virtio,macaddr=12:34:56:78:9a:bc \
-net tap,ifname=tap_guest1,script=no,downscript=no \
-boot c -nographic -display none -daemonize \
guest1-drive.qcow2
A configuração de vários endereços IP em uma interface para o convidado KVM pode ser feita manualmente com o comando
ip address add aaa.bbb.ccc.101/24 dev eth0
Ou permanentemente em /etc/network/interfaces
assim:
auto eth0 eth0:1
iface eth0 inet static
address aaa.bbb.ccc.100
network aaa.bbb.ccc.0
netmask 255.255.255.0
broadcast aaa.bbb.ccc.255
gateway aaa.bbb.ccc.1
iface eth0:1 inet static
address aaa.bbb.ccc.101
network aaa.bbb.ccc.0
netmask 255.255.255.0
broadcast aaa.bbb.ccc.255
gateway aaa.bbb.ccc.1
Observe que, se o seu datacenter / provedor não espera que você revele caixas adicionais na mesma rede, ele pode não configurá-las e elas não estarão disponíveis. Neste caso você pode querer criar bridge interna e usar o iptables para encaminhar pacotes entre sua interface WAN e esta ponte usando DNAT e SNAT. Supondo que sua rede de bridge virtual local seja 10.0.0.0/8, seu guest1 é 10.0.0.2, você precisará disso:
iptables -t nat -A PREROUTING --dst aaa.bbb.ccc.100 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.2
iptables -t nat -A PREROUTING --dst aaa.bbb.ccc.101 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.2
...
iptables -t nat -A POSTROUTING -p tcp --dst 10.0.0.2 -j SNAT --to-source aaa.bbb.ccc.100
Observe que você precisará de tantos comandos DNAT quanto os IPs externos por convidado KVM, mas apenas uma regra SNAT para fornecer acesso à Internet. Além disso, você pode permitir somente o tráfego HTTP / HTTPS / SSH, permitindo apenas as portas desejadas. Se você omitir a instrução --dport
, todas as portas serão encaminhadas. Seu convidado KVM deve ter configurações de rede estática com o host KVM como gateway padrão, a menos que você esteja disposto a hospedar o servidor DHCP.