Configure IPTables no host KVM para bloquear o tráfego da ponte de convidados

2

Estou trabalhando em um projeto de pesquisa de tese, e estou tendo alguma dificuldade em descobrir como obter iptables (executando no host KVM) para bloquear o tráfego (ou melhor, manipular o tráfego) destinado a um BRIDGED Convidado do KVM. Não consigo obter as entradas iptables (coladas abaixo) para bloquear o tráfego de e para as VMs.

Efetivamente, gostaria que meu sistema host atuasse como um firewall para essas VMs convidadas e, por enquanto, gostaria de testar esse recurso simplesmente descartando todos os pacotes destinados a uma VM específica. Em um futuro não tão distante, eu também gostaria de implementar controles mais granulares, e até mesmo ter um proxy envolvido. Novamente, isso deve acontecer inteiramente no nível do HOST e não no nível do CONVIDADO.

Estou executando o CentOS 6 e, com base em outra pergunta que escrevi: Use um NIC para criar várias interfaces para o Linux KVM , eu tenho as seguintes interfaces configuradas:

eth0
br0
tap0

Abaixo estão os meus scripts de configuração de rede para cada interface:

Configuração de eth0 :

DEVICE="eth0"
BOOTPROTO="none"
NM_CONTROLLED="no"
ONBOOT=yes
TYPE="Ethernet"
UUID="<<UUID-HERE>>"
HWADDR=<<MAC-ADDR-HERE>>
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="System eth0"
BRIDGE="br0"

Configuração de br0 :

DEVICE="br0"
TYPE="Bridge"
ONBOOT="yes"
BOOTPROTO="dhcp"
DELAY=0

Configuração de tap0 :

DEVICE="tap0"
TYPE="Tap"
BRIDGE="br0"
ONBOOT="yes"

Eu tenho uma VM do CentOS 6 em execução e ela está configurada para utilizar a interface tap0 em ponte. Rede na VM está funcionando corretamente. Nenhuma outra alteração no sistema host foi feita.

Abaixo estão as regras iptables não funcionais que adicionei à corrente FORWARD ( vale a pena notar que não sou um grande especialista em iptables yet ).

sudo iptables -I FORWARD -i any -o tap0 -j DROP
sudo iptables -I FORWARD -i tap0 -o any -j DROP

Depois de executar os comandos, a tabela FORWARD tem esta aparência:

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DROP       all  --  tap0   any     anywhere             anywhere            
    0     0 DROP       all  --  any    tap0    anywhere             anywhere            
    0     0 REJECT     all  --  any    any     anywhere             anywhere            reject-with icmp-host-prohibited 

Infelizmente, isso não bloqueia o tráfego. Eu não entendo porque isso não funcionaria.

ATUALIZAÇÃO: 25/11/2014: Já faz um tempo desde a última atualização. Acontece que iptables tem o physdev plugin, que é realmente o que eu uso com sucesso na minha pesquisa e é mais flexível que ebtables .

    
por Phanto 12.12.2012 / 00:57

1 resposta

2

Certifique-se de entender os fundamentos de rede envolvidos aqui. Uma bridge é um switch e opera na camada 2. Suas regras de iptables aplicam-se à camada 3 e não serão passadas nesse nível.

Observe ebtables e especifique as regras da Camada 2 - desabilite o uso de pontes e migre para uma configuração roteada na qual todo o tráfego é passado pelo host na Camada 3. Não tenho certeza se a última opção é possível usando o Libvirt / KVM.

    
por 12.12.2012 / 01:47