Eu gostaria de espelhar apenas um tráfego de pacotes muito limitado destinado a uma única porta IP e UDP para o mesmo IP, mas uma segunda porta. Eu bloqueei em https://superuser.com/questions/1593995/iptables-nftables-forward-udp-data-to-multiple-targets , mas parece que a instrução dup do nftable só permite duplicar para outro IP, mas não o mesmo IP e porta diferente.
Por exemplo, o tráfego para 127.0.0.1 porta 123 deve ser duplicado para 127.0.0.1 porta 456. Como esta é a única duplicação, não tenho nenhum problema com a perda do número da porta original. Agora eu me pergunto se esse tipo de duplicação é possível porque 127.0.0.1 não é uma interface de "drenagem"/saída, mas o destino final da duplicata. Poderia haver alguma maneira de combinar isso com DNAT?
Existe algum outro mecanismo disponível além de anexar uma sonda eBPF ao netdev com o tráfego UDP de entrada?
Isso pode ser feito com nftables e a família netdev com uma cadeia de entrada e uma instrução dup . Requer o uso de uma marca para evitar um loop infinito. Dependendo do caso de uso exato, a duplicação provavelmente também pode ser feita na saída (já que está na interface de loopback , o pacote de saída duplicado aparecerá de volta como ingress ), mas isso exigiria kernel >= 5.17 para suporte, enquanto a entrada estiver disponível por muito tempo.
Requer kernel >= 4.10 (para o suporte de checksum correto para alteração UDP sem estado).
O pacote candidato é verificado quanto a uma marca e processado somente se não houver nenhuma marca, começando pela configuração de uma marca: isso evitará um loop mais tarde.
Está duplicado. A marca, fazendo parte do sk_buff duplicado , também é duplicada
A duplicata será na verdade o pacote inalterado: enviado para o mesmo local (
lo
) e também para a porta 123a
dup
instrução, ao contrário de qualquer destino do iptables , incluindo seuTEE
destino, não é uma instrução de terminação de regra . A regra continua com uma alteração sem estado do pacote: a porta UDP é alterada para 456O pacote duplicado também chega no ingresso , mas como está marcado, a regra o ignora: o loop é impedido
A porta duplicada pode ser testada com socat :
Notas:
Se nada estiver escutando na porta duplicada, uma porta ICMP inacessível será emitida, mas como essa porta (456) não corresponde à porta para a qual o aplicativo de envio está enviando (123), ela será ignorada pela pilha de rede.
A entrada do Netfilter acontecendo após AF_PACKET, o tcpdump não capturará a porta alterada nem o pacote duplicado.