ip6tablesから「icmp」プロトコルにどのようにアクセスしますか?

ip6tablesから「icmp」プロトコルにどのようにアクセスしますか?

このip6tablesコマンドは以下を受け入れてicmp同意icmpv6します。

$ sudo ip6tables -A INPUT -p icmp -j ACCEPT
$ sudo ip6tables -A INPUT -p ipv6-icmp -j ACCEPT

ただし、ping次のコマンドを使用してテストする場合:

$ ping6 fe80::a00:1234:1234:1234%eth1

私は決してicmp次の規則に従わない。

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                

合意ができない場合、なぜicmp受け入れられますか?ip6tables

答え1

契約は数字にすぎません。

$ grep icmp /etc/protocols 
icmp    1   ICMP        # internet control message protocol
ipv6-icmp 58    IPv6-ICMP   # ICMP for IPv6

この番号は同じ「名前空間」を共有します。インターネットプロトコル、一部のプロトコルは一般的です(例:UDP(17)、TCP(6)、SCTP(132))。しかし、他のプロトコルはそうではありません。特にIPv4とIPv6の違いは重要です。これはICMPの場合です。 2つの異なるプロトコルです。

一般的な設定では、親プロトコルヘッダーにICMP(値1)を持つIPv6パケットは決してありません。同様に、IPv4には、ICMPv6(ipv6-icmpとも呼ばれる)タイプ(値58)のIPv4パケットがあってはなりません。たぶん一部の環境ではNAT64これらのパケット(IPv6経由のICMPまたはIPv4経由のICMPv6)は完全に漏洩する可能性があります。

同時にIP6テーブルIPv6のみを処理します。すべてのIPv4タイプのパケットを同じ方法でフィルタリングするわけではありません。iptablesIPv4のみが処理され、IPv6タイプのパケットはフィルタリングされません。

したがって、両方をフィルタリング(または計算)する正しい方法は、それぞれ正しい上位層プロトコルを使用する1つのIPv4ルールと1つのIPv6ルールを持つことです。

sudo iptables -A INPUT -p icmp -j ACCEPT
sudo ip6tables -A INPUT -p ipv6-icmp -j ACCEPT

関連情報