Eu configurei uma regra para combinar pacotes multicast da seguinte maneira:
add rule filter_4 new_out_4 meta pkttype multicast goto multicast_out_4
filter_4
é uma tabela IPv4, new_out4
é uma cadeia de saída e multicast_out_4
é uma cadeia para lidar com tráfego somente multicast.
Aqui está uma imagem mais completa da tabela IPv4, excluindo a parte não relevante:
#!/usr/sbin/nft -f
add table filter_4
add chain filter_4 output {
# filter = 0
type filter hook output priority filter; policy drop;
}
add chain filter_4 multicast_out_4 {
comment "Output multicast IPV4 traffic"
}
add chain filter_4 new_out_4 {
comment "New output IPv4 traffic"
}
#
# Stateful filtering
#
# Established IPv4 traffic
add rule filter_4 input ct state established goto established_in_4
add rule filter_4 output ct state established goto established_out_4
# Related IPv4 traffic
add rule filter_4 input ct state related goto related_in_4
add rule filter_4 output ct state related goto related_out_4
# New IPv4 traffic ( PACKET IS MATCHED HERE )
add rule filter_4 input ct state new goto new_in_4
add rule filter_4 output ct state new goto new_out_4
# Invalid IPv4 traffic
add rule filter_4 input ct state invalid log prefix "drop invalid_filter_in_4: " counter name invalid_filter_count_4 drop
add rule filter_4 output ct state invalid log prefix "drop invalid_filter_out_4: " counter name invalid_filter_count_4 drop
# Untracked IPv4 traffic
add rule filter_4 input ct state untracked log prefix "drop untracked_filter_in_4: " counter name untracked_filter_count_4 drop
add rule filter_4 output ct state untracked log prefix "drop untracked_filter_out_4: " counter name untracked_filter_count_4 drop
Na configuração acima, o novo tráfego de saída, incluindo multicast, é correspondido por regraadd rule filter_4 output ct state new goto new_out_4
Aqui está new_out_4
uma cadeia apenas com a regra multicast relevante (não funcional) que não funciona:
# Multicast IPv4 traffic ( THIS RULE DOES NOT WORK, SEE LOG OUTPUT BELOW)
add rule filter_4 new_out_4 meta pkttype multicast goto multicast_out_4
#
# Default chain action ( MULTICAST PACKET IS DROPPED HERE )
#
add rule filter_4 new_out_4 log prefix "drop new_out_4: " counter name new_out_filter_count_4 drop
Aqui está o que o log diz sobre pacotes multicast descartados:
descarte new_out_4: IN= OUT=eth0 SRC=192.168.1.100 DST=224.0.0.251 LEN=163 TOS=0x00 PREC=0x00 TTL=255 ID=27018 DF PROTO=UDP SPT=5353 DPT=5353 LEN=143
O pacote descartado foi enviado para o endereço de destino 224.0.0.251
, este é o endereço multicast, deveria ser correspondido pela regra multicast em new_out_4
cadeia e deveria ser processado por multicast_out_4
cadeia, mas não foi.
Em vez disso, o pacote não foi correspondido e foi descartado pela regra de descarte padrão na new_out_4
cadeia acima, consulte o comentário (Ação da cadeia padrão).
Obviamente isto significa que a regra multicast não funciona.
Por que a regra multicast não funciona?
Esperado:
meta pkttype multicast
corresponde ao endereço de destino224.0.0.251
EDITAR:
Informações do sistema:
Kernel: 6.5.0-0.deb12.4-amd64
teve o mesmo problema com o kernel anterior 6.1
nftables: v1.0.6 (Lester Gooch #5)
Tendo reproduzido (e completado as partes que faltam) a configuração com algumas entradas adicionais, como:
na verdade, a propriedade
meta pkttype
deste skbuff éhost
diferente da esperadamulticast
para um pacote multicast de saída. Observe que quando esta palavra-chave foi introduzida , tratava-se de entrada, não de saída:Na verdade, o equivalente direto do iptables é o módulo de correspondência pkttype :
Juntando tudo isso, quando um pacote IP de saída (roteamento: camada 3) é criado, ele ainda não atingiu sua camada 2 (camada de enlace), portanto seu skbuff não reflete o que ele pode se tornar, se é que pretende fazê-lo mais tarde .
O que realmente deveria ser testado é a propriedade do endereço IP em relação à pilha de roteamento, e não a propriedade do pacote em relação à Ethernet.
iptables
fornece para isso oaddrtype
módulo match :Sua tradução sugere o que realmente deveria ser usado: a
fib
expressão:Não há exemplo direto para multicast. O exemplo mais próximo é mais complexo sobre descartar um pacjet não destinado a um endereço na interface de entrada, onde o multicast está nas 3 exceções:
Portanto, basta substituir onde quer que seja usado em um gancho de saída (ou pós-roteamento):
com:
Em um gancho de entrada (ou pré-roteamento), embora a propriedade skbuff provavelmente corresponda à propriedade IP, para ser consistente, ela também deve ser substituída exatamente da mesma forma, também por:
O comando de teste abaixo, usado conjuntamente em outro host na LAN (para testar a entrada) e no host (para testar a saída):
corresponderá corretamente
fib daddr type multicast
na entrada e na saída.Observação importante:
Acredito que a questão foi abordada acima, mas observe, entretanto, que o multicast não pode ser rastreado adequadamente pelo conntrack do Netfilter , porque ele não pode associar uma resposta usando outro endereço de origem unicast ao endereço de destino multicast da consulta inicial: eles diferem, então considera o responda como um outro (novo) fluxo em vez de associá-los e considerar tal resposta como parte do fluxo anterior. Portanto, esse tipo de fluxo nunca aparecerá no estado ESTABLISHED com conntrack ou o
conntrack -L
comando. O conjunto de regras deve ser adaptado para isso: não pode depender apenas dect state established,related
regras, mas isso está além do escopo desta questão.