tldr; bridge (veja abaixo) não funciona se houver uma queda correspondente em outra tabela (como as regras padrão do firewalld).
Olá,
estou construindo minha própria biblioteca de VM (uma espécie de quickemu ).
Tenho um problema com as regras de firewall para ponte. Comecei com iptables-nft e funcionou bem até testar meus scripts no fedora. Não importa o que eu faça, o firewalld bloqueia tudo. Então optei pelo nftables para tentar ignorar as regras do firewalld diretamente, mas mesmo assim não consigo encontrar uma maneira de fazê-lo funcionar sem excluir as regras do firewalld.
Pelo que entendi, a prioridade afeta apenas a ordem em que as regras são testadas, se houver drop, mesmo no final o pacote é descartado?
Existe uma maneira de contornar esse comportamento que eu não conheço? Tentei pesquisar as marcas, mas não tenho certeza se é a solução certa.
Aqui estão as regras que uso para a ponte (funciona perfeitamente se não houver outra tabela no conjunto de regras):
#!/usr/bin/nft -f
# vim:set ts=2 sw=2 et:
table ip QEMU
delete table ip QEMU
table ip QEMU {
chain input {
type filter hook input priority filter - 1;
ct state {established,related} iifname "virbr0" counter accept
}
chain forward {
type filter hook forward priority filter - 1;
ct state {established,related} iifname "virbr0" counter accept
}
chain postrouting {
type nat hook postrouting priority srcnat;
iifname "virbr0" counter masquerade
}
}
Nitpicking: apesar de
virbr0
ser uma interface de ponte, trata-se de roteamento, não de ponte. O firewall acontece no lado do roteamento da ponte: na própria interface da ponte, não nas portas da ponte (o que exigiria um firewalltable bridge
em vez de umtable ip
firewall). Portanto, a palavra ponte não será mencionada novamente abaixo.Quando um pacote é descartado no netfilter, incluindo nftables , ele permanece descartado. Quando um pacote é aceito, ele continuará a atravessar ganchos adicionais, possivelmente fazendo com que esse pacote seja descartado mais tarde, conforme lembrado em
nft(8)
:Isso faz com que ferramentas de firewall tenham um comportamento padrão de descarte e aceitem apenas alguns fluxos (o que é um bom comportamento do ponto de vista de segurança) em vez de ferramentas com um comportamento padrão de aceitação e descarte de alguns fluxos (o que não é tão bom do ponto de vista de segurança) para ocultar a decisão de outras ferramentas de firewall: elas descartam coisas que outras ferramentas teriam escolhido aceitar.
Portanto, para que duas ferramentas coexistam, geralmente é necessário realizar ações em ambas.
Para este caso, pode-se dizer ao firewalld para ignorar (ou seja: aceitar ) fluxos relacionados a uma ou mais interface(s) específica(s), de forma que o tratamento desta interface específica permaneça sob o controle de outra ferramenta. Se esse tratamento não for feito em outro lugar, isso poderá abrir uma brecha de segurança, portanto, isso deve ser considerado adequadamente.
Esta resposta requer firewalld >= 0.9.0 para aproveitar as políticas de firewall conforme introduzidas inicialmente :
A zona é usada entre um lado remoto e o host, as políticas são usadas para roteamento entre zonas. Eles reutilizarão interfaces anexadas a zonas.
Crie uma nova zona:
Faça com que esta zona aceite qualquer coisa por padrão:
Adicione a interface de destino a esta zona:
Isso cuidará do tráfego entre as VMs e o host (depois que as regras forem recarregadas).
Adicione políticas de firewalld que usarão esta zona, uma vez para entrada e uma vez para saída, como
ANY
outro lado e também defina-as para um comportamento padrão deACCEPT
:Finalmente recarregue as regras:
Isso garante que o tráfego relacionado seja
virbr0
desimpedido por firewalld .Agora a (enorme) mesa nftables
inet firewalld
deve coexistir pacificamente com a mesa do OPip QEMU
. O fato de o firewalld estar em execução ou não (ou seja: suas regras foram removidas) não deve alterar o comportamento de nada relacionado aovirbr0
. Todas as restrições devem ser tratadas na tabelaip QEMU
.Atualmente a tabela
ip QEMU
não restringe absolutamente nada (não há regra de descarte nem política de descarte), portanto deve ser corrigida corretamente. Não se deve usar uma política de drop ou isso causará novamente o problema que acabou de ser corrigido, na outra direção. Basta descartar qualquer tráfego indesejado relacionadovirbr0
(especialmente avirbr0
) nele.Interfaces adicionais podem ser adicionadas à lista de ignorados, por exemplo para adicionar
lxcbr0
(ou seja: deixar o LXC livre de firewalld ):