Nftables設定エラー:競合するプロトコルが指定されている:inet-service対icmp

Nftables設定エラー:競合するプロトコルが指定されている:inet-service対icmp

シンプルなステートフルファイアウォールそしてnftablesフォローするArch Linux nftables ガイド。私はこの質問をArch Linuxフォーラムに投稿しましたが、答えを受け取りませんでした。

ガイドを完了してコンピュータを再起動した後、システムロードできません。nftables.service。エラーを解決するために、以下を実行しました。

systemctl status nftables

関連出力は次のとおりです。

/etc/nftables.conf:7:17-25: Error: conflicting protocols specified: inet-service v. icmp

このエラーは、入力チェーンで新しいping(icmp)を許可するように設定したルールについて文句を言います。ルールは次のとおりです。間違った点はありません。

icmp type echo-request ct state new accept

ルールを削除すると機能します。しかし、私はルールが欲しい。

これは私のルールです。nftables.confガイドを完了した後:

    table inet filter {
    chain input {
        type filter hook input priority 0; policy drop;
        ct state established,related accept
        iif "lo" accept
        ct state invalid drop
        icmp type echo-request ct state new accept
        ip protocol udp ct state new jump UDP
        tcp flags & (fin | syn | rst | ack) == syn ct state new jump TCP
        ip protocol udp reject
        ip protocol tcp reject with tcp reset
        meta nfproto ipv4 counter packets 0 bytes 0 reject with icmp type prot-unreachable
    }

    chain forward {
        type filter hook forward priority 0; policy drop;
    }

    chain output {
        type filter hook output priority 0; policy accept;
    }

    chain TCP {
        tcp dport http accept
        tcp dport https accept
        tcp dport ssh accept
        tcp dport domain accept
    }

    chain UDP {
        tcp dport domain accept
    }
}

私は何を見逃していますか?よろしくお願いします。

ベストアンサー1

これはnftables 0.7(または他のバージョン)の構文上の制限です。inetどのIPプロトコルが最初に使用されるかを明示的に指定せず、デュアルIPv4 / IPv6テーブルで直接使用されるICMPおよびICMPv6を考慮しません。

したがって、ルールは次のようになります。

icmp type echo-request ct state new accept

IPv4とIPv6の両方で作業するには、次のように2回作成する必要があります。

修正するnexthdr:実際には、上位層プロトコルを指すIPv6に依存してはいけません。拡張ヘッダ固定ヘッダーと親ヘッダー(最後のヘッダー)の間。正しい構文を追加して(すでにプロトコル情報を提供するメタ情報を使用して)、「正しい」構文がnftables 0.7に有効であるかどうかはわかりません。元の答えを残します。

meta nfproto ipv4 meta l4proto icmp icmp type echo-request ct state new accept
meta nfproto ipv6 meta l4proto icmpv6 icmpv6 type echo-request ct state new accept
ip protocol icmp icmp type echo-request ct state new accept
ip6 nexthdr icmpv6 icmpv6 type echo-request ct state new accept

対応するバイトコードが与えられた場合(ディスプレイを使用nft --debug=netlink list ruleset -a):

inet filter input 9 8 
  [ meta load nfproto => reg 1 ]
  [ cmp eq reg 1 0x00000002 ]
  [ payload load 1b @ network header + 9 => reg 1 ]
  [ cmp eq reg 1 0x00000001 ]
  [ payload load 1b @ transport header + 0 => reg 1 ]
  [ cmp eq reg 1 0x00000008 ]
  [ ct load state => reg 1 ]
  [ bitwise reg 1 = (reg=1 & 0x00000008 ) ^ 0x00000000 ]
  [ cmp neq reg 1 0x00000000 ]
  [ immediate reg 0 accept ]

inet filter input 10 9 
  [ meta load nfproto => reg 1 ]
  [ cmp eq reg 1 0x0000000a ]
  [ payload load 1b @ network header + 6 => reg 1 ]
  [ cmp eq reg 1 0x0000003a ]
  [ payload load 1b @ transport header + 0 => reg 1 ]
  [ cmp eq reg 1 0x00000080 ]
  [ ct load state => reg 1 ]
  [ bitwise reg 1 = (reg=1 & 0x00000008 ) ^ 0x00000000 ]
  [ cmp neq reg 1 0x00000000 ]
  [ immediate reg 0 accept ]

ICMPはIPプロトコル1、エコー要求値8です。 ICMPv6
はIPv6プロトコル58(0x3a)で、対応するエコー要求値は128(0x80)です。

最新のnftables 0.9はルールを直接受け入れますicmp type echo-request ct state new acceptが、対応するバイトコードは次のとおりです。

inet filter input 9 8 
  [ meta load nfproto => reg 1 ]
  [ cmp eq reg 1 0x00000002 ]
  [ meta load l4proto => reg 1 ]
  [ cmp eq reg 1 0x00000001 ]
  [ payload load 1b @ transport header + 0 => reg 1 ]
  [ cmp eq reg 1 0x00000008 ]
  [ ct load state => reg 1 ]
  [ bitwise reg 1 = (reg=1 & 0x00000008 ) ^ 0x00000000 ]
  [ cmp neq reg 1 0x00000000 ]
  [ immediate reg 0 accept ]

つまり、ICMPv6ではなくICMPのみを処理するため、次のように単純な追加ルールを追加する必要があります。

icmpv6 type echo-request ct state new accept

以前のバージョンと同等のバイトコードを返します。

inet filter input 10 9 
  [ meta load nfproto => reg 1 ]
  [ cmp eq reg 1 0x0000000a ]
  [ meta load l4proto => reg 1 ]
  [ cmp eq reg 1 0x0000003a ]
  [ payload load 1b @ transport header + 0 => reg 1 ]
  [ cmp eq reg 1 0x00000080 ]
  [ ct load state => reg 1 ]
  [ bitwise reg 1 = (reg=1 & 0x00000008 ) ^ 0x00000000 ]
  [ cmp neq reg 1 0x00000000 ]
  [ immediate reg 0 accept ]

おすすめ記事