Como conectar um intervalo de IPs públicos a máquinas virtuais KVM no Debian / Ubuntu

1

Estou tentando há semanas descobrir a configuração de rede correta para compartilhar um intervalo de IPs públicos com máquinas virtuais KVM em execução no meu servidor, mas até agora com pouca sorte e com a ajuda da amigável comunidade ServerFault, consegui fazer funcionar. Você pode encontrar minha configuração de trabalho abaixo:

Meu ISP roteia todo o tráfego para 192.168.8.118 (portanto, esse precisa ser o IP principal de eth0), mas eu tenho 192.168.239.160/28 à minha disposição.

Aqui está /etc/network/interfaces na máquina host:

# Loopback device:
auto lo
iface lo inet loopback

# device: eth0
auto  eth0
iface eth0 inet static
  address   192.168.8.118
  broadcast 192.168.8.127
  netmask   255.255.255.224
  gateway   192.168.8.97
  pointopoint 192.168.8.97
  # This device acts as gateway for the bridge, so provide a route.
  up ip route add 192.168.8.118/32 dev eth0 scope host

# device: br0
auto  br0
iface br0 inet static
  bridge_stp      off
  bridge_maxwait  0
  bridge_fd       0
  address   192.168.239.174
  broadcast 192.168.239.175
  netmask   255.255.255.240
  gateway   192.168.8.118
  # Create and destroy the bridge automatically.
  pre-up brctl addbr br0
  post-down brctl delbr br0
  # Our additional IPs are allocated on the bridge.
  up ip route add to 192.168.239.160/28 dev br0 scope host

Eu configurei uma máquina virtual como esta:

sudo ubuntu-vm-builder kvm precise \
                  --domain pippin \
                  --dest pippin \
                  --hostname pippin.hobbiton.arnor \
                  --flavour virtual \
                  --mem 8196 \
                  --user mikl \
                  --pass hest \
                  --bridge=br0 \
                  --ip 192.168.239.162 \
                  --mask 255.255.255.240 \
                  --net 192.168.239.160 \
                  --bcast 192.168.239.175 \
                  --gw 192.168.239.174 \
                  --dns 8.8.8.8 \
                  --components main,universe \
                  --addpkg git \
                  --addpkg openssh-server \
                  --addpkg vim-nox \
                  --addpkg zsh \
                  --libvirt qemu:///system ;

Se eu inspecionar a definição XML da máquina virtual, sua interface de rede será definida assim:

<interface type='bridge'>
  <mac address='52:54:00:b1:e9:52'/>
  <source bridge='br0'/>
  <model type='virtio'/>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>

Quando eu (re) inicio a máquina virtual, /var/log/syslog recebe estas linhas:

Jul 20 03:13:02 olin kernel: [ 4084.652906] device vnet0 entered promiscuous mode
Jul 20 03:13:02 olin kernel: [ 4084.686388] br0: port 2(vnet0) entering forwarding state
Jul 20 03:13:02 olin kernel: [ 4084.686394] br0: port 2(vnet0) entering forwarding state

Meu servidor está executando o Ubuntu 12.04 64-bit com o kernel 3.2.0-26-generic (do Ubuntu). Estou executando libvirt-bin 0.9.8-2ubuntu1 e qemu-kvm 1.0+noroms-0ubuntu13 .

O iptables na máquina host está atualmente configurado para permitir todo o tráfego (para eliminar isso como uma fonte de problema), e eu habilitei o encaminhamento do tráfego ipv4 e ipv6.

Quando eu faço login no convidado via SSH do host, não tenho conexão com a Internet dentro do sistema operacional convidado. O /etc/network/interfaces do convidado é assim:

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
    address 192.168.239.162
    netmask 255.255.255.240
    network 192.168.239.160
    broadcast 192.168.239.175
    gateway 192.168.239.174
    # dns-* options are implemented by the resolvconf package, if installed
    dns-nameservers 8.8.8.8
    dns-search pippin

Agora funciona

O resumo da configuração acima funciona como eu quero. Consulte o histórico de edições se você quiser ver minhas tentativas anteriores.

    
por mikl 20.07.2012 / 03:09

2 respostas

4

Se você estiver fazendo uma ponte, não precisará configurar nada relacionado aos endereços IP das VMs na máquina host. Basta configurá-los para se conectar à bridge e configurar os IPs dentro de cada VM da maneira usual. Bridging une redes na camada Ethernet, onde os endereços IP não importam; do ponto de vista do seu ISP, parece que você tem vários computadores conectados a um switch que está conectado diretamente ao ISP.

Mas se o seu ISP for o tráfego de roteamento para o endereço .118 do host, você precisará configurar o host da VM para atuar como um roteador e encaminhar o tráfego das VMs. Para fazer isso, remova a linha bridge_ports eth0 do seu arquivo de interfaces, ip route add to 192.168.239.160/28 dev br0 e echo 1 > /proc/sys/net/ipv4/ip_forward . Nas VMs, você precisará configurar 192.168.8.118 como o gateway padrão e adicionar uma rota que diga que 192.168.8.118 está diretamente acessível por eth0 . (Essa é a eth0 da VM, que se conecta ao br0 do host.)

Em nenhum dos casos, você deve adicionar os endereços das VMs diretamente à interface br0 . No caso de bridging, você deseja que as VMs e não o host respondam a solicitações ARP para esses endereços e, no caso de roteamento, você deseja que o host entenda que, quando recebe um pacote para um desses endereços, ele precisa ser roteado. em outro lugar, não entregue localmente.

    
por 20.07.2012 / 05:08
1

Você não deseja alocar o endereço IP de suas VMs à interface br0 de seu host - isso faria com que esse endereço pertencesse ao host, não à VM.

No entanto, suas VMs precisarão de um endereço de gateway para encaminhar todos os pacotes de saída para. Eu recomendaria a alocação de um IP nesse / 28 para seu host e configure suas VMs para usar esse IP como sua rota padrão. O primeiro ou último IP disponível em uma sub-rede é uma opção razoável para um endereço de gateway ....

ip addr add 192.168.239.161/28 dev br0

você ativou o encaminhamento de ip? por exemplo. descomente o seguinte em /etc/sysctl.conf (um ou ambos para ipv4 e / ou ipv6):

#net.ipv4.ip_forward=1
#net.ipv6.conf.all.forwarding=1

Por fim, você tentou fazer login no console da VM (por exemplo, com o virt-manager ou um visualizador VNC como vinagre ou xvnc4viewer)? Em caso afirmativo, qual endereço IP tem (se houver)? A VM está configurada para ter um IP estático ou dhcp? Se você já configurou seu servidor dhcp para fornecer o endereço IP apropriado ao endereço MAC das VMs?

    
por 20.07.2012 / 05:01