O tráfego de rede não está sendo encaminhado de uma VM para a rede usando uma interface em ponte com o Xen + libvirt

1

Estou tendo problemas para obter acesso à rede de uma VM que estou executando usando o Xen e o libvirt. Eu tenho tentado coisas diferentes e lido posts semelhantes on-line por alguns dias, mas estou realmente preso neste momento. Se alguém pudesse oferecer algum insight, seria muito apreciado.

Eu tenho uma VM que estou executando em um host com uma ponte configurada como br0 e uma interface eth0 em uma sub-rede 192.168.60.0/24. A parte de rede do xml de configuração do libvirt é:

<interface type='bridge'>
  <mac address='ff:a0:d1:e5:07:de'/>
  <source bridge='br0'/>
  <script path='/etc/xen/scripts/vif-bridge'/>
  <model type='virtio' />
</interface>

Quando inicio a VM, uma interface vif6.0 é criada no host e a saída ifconfig é:

br0       Link encap:Ethernet  HWaddr 00:A0:D1:C3:07:DE
          inet addr:192.168.60.33  Bcast:192.168.60.255  Mask:255.255.255.0
          inet6 addr: fe80::2a0:d1ff:fee5:7de/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:13 errors:0 dropped:0 overruns:0 frame:0
          TX packets:40 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:3570 (3.4 KiB)  TX bytes:3508 (3.4 KiB)

eth0      Link encap:Ethernet  HWaddr 00:A0:D1:C3:07:DE
          inet6 addr: fe80::2a0:d1ff:fee5:7de/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 b)  TX bytes:492 (492.0 b)
          Interrupt:19 Memory:fe8f0000-fe900000

vif6.0    Link encap:Ethernet  HWaddr FE:FF:FF:FF:FF:FF
          inet6 addr: fe80::fcff:ffff:feff:ffff/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:80 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:500
          RX bytes:6660 (6.5 KiB)  TX bytes:468 (468.0 b)

virbr0    Link encap:Ethernet  HWaddr 00:00:00:00:00:00
          inet addr:192.168.122.1  Bcast:192.168.122.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

A saída "brctl show" parece mostrar a ponte sendo configurada corretamente:

br0             8000.00a0d1e507de       no              eth0
                                                        vif6.0

O conteúdo ifcfg-eth0 na VM é:

DEVICE=eth0 
BOOTPROTO=static 
HWADDR=FF:A0:D1:E5:07:DE
IPADDR=192.168.60.133 
NETMASK=255.255.255.0 
ONBOOT=yes

e a saída do ifconfig na VM se parece com o que eu esperaria:

eth0      Link encap:Ethernet  HWaddr FF:A0:D1:E5:07:DE  
          inet addr:192.168.60.133  Bcast:192.168.60.255  Mask:255.255.255.0
          inet6 addr: fe80::fda0:d1ff:fee5:7de/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:6 errors:0 dropped:0 overruns:0 frame:0
          TX packets:80 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:468 (468.0 b)  TX bytes:7780 (7.5 KiB)

mas quando tento ssh ou ping em outro computador não recebo 'route to host'.

Usando o tcpdump no sistema host, tentei ver se poderia restringir onde está o problema:

# tcpdump -vv -i vif6.0
tcpdump: WARNING: vif6.0: no IPv4 address assigned
tcpdump: listening on vif6.0, link-type EN10MB (Ethernet), capture size 96 bytes
14:49:40.833997 arp who-has 192.168.60.35 tell 192.168.60.133
14:49:41.833314 arp who-has 192.168.60.35 tell 192.168.60.133
14:49:42.833309 arp who-has 192.168.60.35 tell 192.168.60.133

Assim, a VM está enviando um arp who-has packet quando eu tento ssh para 192.168.60.35. Acho que isso significa que a configuração dentro da VM está correta e que isso é um problema no sistema host. Se eu rodar o tcpdump com a interface de br0, então eu não vejo esses pacotes de arp.

Meu pensamento aqui é que os pacotes estão sendo bloqueados antes de ir para a ponte de alguma forma. Eu tentei adicionar uma regra iptables para resolver isso:     -A FORWARD -m physdev --physdev -é-ponte -j ACCEPT mas não funcionou. Eu também tentei o seguinte:

/sbin/sysctl -w net.bridge.bridge-nf-call-ip6tables=0
/sbin/sysctl -w net.bridge.bridge-nf-call-iptables=0
/sbin/sysctl -w net.bridge.bridge-nf-call-arptables=0
/sbin/sysctl -w net.ipv4.ip_forward=1

que não teve impacto.

É óbvio para alguém que tem mais experiência do que eu o que eu sinto falta aqui? Se vif6.0 tem o mesmo endereço MAC é eth0 na vm? Preciso de mais regras no meu iptables? Obrigado por qualquer ajuda!

    
por foob 24.04.2013 / 21:21

1 resposta

0

Você deve configurar o endereço IP em br0 em vez de eth0 .

Exemplo de /etc/sysconfig/network-scripts/ifcfg-eth0 :

DEVICE="eth0"
HWADDR="00:1E:37:D4:06:3E"
NM_CONTROLLED="no"
ONBOOT="yes"
BRIDGE=br0

Exemplo de /etc/sysconfig/network-scripts/ifcfg-br0 :

DEVICE=br0
TYPE=Bridge
BOOTPROTO=static
BROADCAST=192.168.60.255
IPADDR=192.168.60.133
NETMASK=255.255.255.0
NETWORK=192.168.60.0
ONBOOT=yes 

Em seguida, executar sudo ifdown eth0;ifdown br0; ifup br0; ifup eth0

Você deve ver que o endereço IP está configurado para br0 via comando ifconfig .

    
por 26.10.2013 / 01:52