Estou tentando escrever regras de firewall para impedir que uma máquina convidada acesse a Internet. O servidor (servidor Ubuntu 22.0, usando KVM) possui uma conexão física (enp34s0), que está conectada ao roteador, uma interface bridge (br0) e o convidado está usando um dispositivo tap (vnet0) que está conectado à mesma rede com br0. Qualquer regra que tentei aplicar no vnet0 não funcionou.
Por exemplo, tentei impedir o ping com os seguintes comandos:
iptables -I FORWARD -i vnet0 -o br0 -p icmp -j DROP
iptables -I FORWARD -o vnet0 -i br0 -p icmp -j DROP
iptables -I FORWARD -i vnet0 -o enp34s0 -p icmp -j DROP
iptables -I FORWARD -o enp34s0 -i br0 -p icmp -j DROP
ainda consigo enviar pings de/para o convidado. (também tentei com -p tcp --dport 443 para evitar https) Estou fazendo algo errado? Não consigo descobrir se está relacionado ao fato de ser um dispositivo TAP e não encontrei nada relacionado na web.
Responder1
Se você adicionar uma regra de registro à sua FORWARD
tabela para capturar qualquer tráfego ICMP...
iptables -I FORWARD -p icmp -j LOG --log-prefix 'FORWARD_ICMP '
...você verá que a interface de entrada é a ponte, não o dispositivo TAP:
Sep 09 19:19:20 fizzgig kernel: FORWARD_ICMP IN=virbr0 OUT=wlp0s20f3
PHYSIN=vnet1 MAC=52:54:00:f7:70:2a:52:54:00:18:f8:12:08:00 SRC=192.168.122.210
DST=8.8.8.8 LEN=84 TOS=0x00 PREC=0x00 TTL=63 ID=59668 DF PROTO=ICMP TYPE=8
CODE=0 ID=5 SEQ=1
Isso significa que suas regras -i vnet0
nunca serão iguais.
Você pode ver o dispositivo TAP no PHYSIN
atributo. Podemos combinar isso usando o physdev
módulo, assim:
iptables -A FORWARD -m physdev --physdev-in vnet1 -j DROP
(Há também uma correspondência --physdev-out se você precisar combinar o tráfego na outra direção.)