O ip6tables
comando aceita icmp
e icmpv6
protocolos:
$ sudo ip6tables -A INPUT -p icmp -j ACCEPT
$ sudo ip6tables -A INPUT -p ipv6-icmp -j ACCEPT
Porém, quando testo com o ping
comando:
$ ping6 fe80::a00:1234:1234:1234%eth1
Eu nunca bati a icmp
regra:
Chain INPUT (policy ACCEPT 133 packets, 13501 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT icmp * * ::/0 ::/0
112 11488 ACCEPT icmpv6 * * ::/0 ::/0
Por que o icmp
protocolo é aceito pelo ip6tables
se não pode ser alcançado?
O protocolo é apenas um número:
Esses números compartilham o mesmo "namespace": Internet Procol, alguns protocolos são comuns, por exemplo: UDP (17), TCP (6), SCTP (132), mas outros não, especialmente quando as diferenças entre IPv4 e IPv6 são importantes. Esse é o caso do ICMP: dois protocolos diferentes.
Em uma configuração de ambiente normal, nunca haverá um pacote IPv6 com ICMP (valor 1) em seu cabeçalho de protocolo de camada superior. Da mesma forma, no IPv4, nunca deve haver um pacote IPv4 do tipo ICMPv6 (também conhecido como ipv6-icmp) (valor 58). Talvez alguns ambientes usando NAT64 possam vazar imperfeitamente esses pacotes (ICMP sobre IPv6 ou ICMPv6 sobre IPv4).
Ao mesmo tempo, o ip6tables lida apenas com o IPv6: ele não filtra todos os pacotes do tipo IPv4, da mesma forma que o iptables lida apenas com o IPv4 e não filtra os pacotes do tipo IPv6.
Portanto, a maneira correta de filtrar (ou aqui contar) ambos é ter uma regra IPv4 e uma regra IPv6, cada uma com seu protocolo de camada superior correto.