Ubuntu 22.04
Estou tentando rotear ICMPv6
pacotes para outro destino e iptables
pareceu uma opção perfeita.
Então eu tentei -j DNAT
o alvo da -t nat
tabela e descobri que essencialmente não teve efeito em ICMPv6
. Por outro lado, a filter
tabela padrão captura os ICMPv6
pacotes com sucesso. De fato, se eu somar um LOG
alvo como segue:
# successfully logs incoming ICMPv6 packets
sudo ip6tables -i eth0 -p icmpv6 -d xxxx::xxxx -A INPUT -j LOG
Posso ver as entradas sendo registradas via dmesg
. Mas anexar ao encadeamento INPUT
/ PREROUTING
da nat
tabela não produz entradas de log:
# No logs produced
sudo ip6tables -i eth0 -p icmpv6 -d xxxx::xxxx -A PREROUTING -j LOG -t nat
sudo ip6tables -i eth0 -p icmpv6 -d xxxx::xxxx -A INPUT -j LOG -t nat
Isso é razoável, pois man iptables(8)
diz
nat: This table is consulted when a packet that creates a new connection is encountered.
e não há nenhum pacote criando nova conexão relacionada a ICMPv6
. O problema é -j DNAT
que só pode ser usado com-t nat
.
Existe uma maneira de rotear ICMPv6
pacotes para outro destino?
No que diz respeito aos pacotes ICMPv6 roteáveis:
Especificamente para ICMP "Echo" e "Echo Reply" (ou seja,
ping
pacotes), funciona da mesma forma com ICMP e UDP: o primeiro pacote ainda não conhecido pelo conntrack (o subsistema de rastreamento de conexão do iptables) é o que cria o estado de fluxo, e todos os pacotes subsequentes são automaticamente reconhecidos como parte desse fluxo.O fluxo é automaticamente esquecido (ou seja, "conexão fechada" em termos de página de manual) após ficar ocioso por
sysctl net.netfilter.nf_conntrack_icmp{,v6}_timeout
segundos – ou após você removê-lo manualmente usandoconntrack -D -p icmpv6
.A principal diferença do UDP é que, em vez de portas src/dst, a entrada conntrack é codificada pelo ICMP Echo Request ID (ou talvez apenas pelos endereços IP). O ICMP Timestamp Request, raramente usado, funcionaria da mesma forma.
Todos os outros pacotes ICMP que não são requisições não podem ser DNATed (ou melhor, não faz sentido DNAT deles separadamente) porque eles já pertencem a um fluxo existente. Por exemplo, um pacote ICMP "Network Unreachable" gerado em resposta a um pacote TCP será considerado parte do fluxo TCP (e DNATed/SNATed se e somente se a conexão TCP original foi DNATed/SNATed).
Por fim, os pacotes de "descoberta de vizinhos" específicos do ICMPv6 (NS/NA/RS/RA) não podem ser NAT porque são inerentemente link-local e não são encaminhados por meio de um roteador em primeiro lugar.