NFTablesで`saddr`と`daddr`のバイトを比較します。

NFTablesで`saddr`と`daddr`のバイトを比較します。

そして。10.x.y.0/240 ≤ x ≤ 500 ≤ y ≤ 20

の各値10.x.y.0/24との間のトラフィックを許可したいと思います。10.z.y.0/24(x, y, z)

実行可能ファイルを使用してスクリプトを作成できますが、単一のルールとバイナリnft操作を使用してスクリプトを作成できるかどうか疑問に思います。

y「Extract」を使用してアドレスの「バイト」を抽出できますが、演算子を使用しようとすると構文がip saddr & 0.0.255.0無効であるというメッセージが表示されます。==nftables

$ cat /etc/nftables.conf
# [...]
        ip saddr & 0.0.255.0 == daddr & 0.0.255.0 accept
# [...]
$ sudo nft -f /etc/nftables
/etc/nftables.conf:113:27-31: Error: syntax error, unexpected daddr
        ip saddr & 0.0.255.0 == daddr & 0.0.255.0 accept

私はいくつかのバリエーションを試しましたが、それらのどれも動作しないようですが、NTFables Wikiはパケットの他のフィールドを比較しません。

これを行う方法はありますか?

答え1

今はそうは思わないnftables右側の定数ではなく式の比較をサポートします。この制限が十分なバイトコードを生成する方法のユーザー空間側にあるのか、カーネル側のバイトコードがそのようなものを処理できないのかはわかりません。定数やセット/マップ照会があるかもしれませんが、それがすべてです。これは今後発展する可能性があります。

とにかく、私は次の方法を使用して代替ソリューションを思いつきました。置くそしてシリアル接続ルックアップテーブルとして。特定のネットマスク操作を引き続き使用するには、y要素(21)のみが必要です。これは、徹底したルールセットやそれに対応するフルセットバージョンよりはるかに優れています(ハッシュされているため、単純なルールセットよりも高速です)。より多くのルールが必要な場合があります。または一致するリストの完全な要素です。

例では、テーブルip myfilterとそのチェーンを使用しますtype filter hook forward。以下を修正してください。ip myfilter forward

nft add table myfilter
nft add chain ip myfilter forward '{ type filter hook forward priority 0; policy drop; }'

2 つの接続された IP アドレスタイプで構成されるセットを追加します。

table ip myfilter {
    set same-y {
        type ipv4_addr . ipv4_addr
    }
}

内蔵:

nft add set ip myfilter same-y  '{ type ipv4_addr . ipv4_addr; }'

検索は、2つのIPアドレスを接続したものと一致します。これで、比較の左側に演算子を適用することができるため、カスタムネットマスク演算子が引き続き使用されます。変更されたソースアドレスと修正された宛先アドレスを提供し、セットに一致する要素がある場合、結果はtrueになります(そしてルールはステートメントを実行しますaccept)。

nft 'add ip myfilter forward ip saddr & 0.0.255.0 . ip daddr & 0.0.255.0 @same-y accept'

繰り返しますが、動作させる違いは、ここでパケットの内容に依存する両方の式があることです。したがって、比較が許可されます。

0.0.y.0 : 0.0.y.0これで、次のシェルループを使用してパケットパスのナビゲーション中にのみ実行できない論理比較部分を完了するために、タイプのエントリでコレクションを入力します。

for i in $(seq 0 20); do printf 'add element ip myfilter same-y { 0.0.%d.0 . 0.0.%d.0 }\n' $i $i; done | nft -f -

これにより、次に21個の要素が追加されます@same-y

0.0.0.0 . 0.0.0.0,
0.0.1.0 . 0.0.1.0,
[...]
0.0.20.0 . 0.0.20.0

ネットワークがタイプのサブネットワークを拡張して受信する場合は、1つ10.x.21.0/24の要素を追加するだけで、実行時に実行することもできます。


通常、フィルタを維持しながら、フィルタにいくつかの例外が必要な場合は、上記のセットを決定グラフに変換できます。ほとんどの判断要素は: accept次の例外で終わります0.0.15.0 . 0.0.15.0 : jump exception-net-15(これらのユーザーチェーンも同じルールセットで定義する必要があります)。

この判定図を使用すると、次のようになります。

table ip myfilter {
    map accept-same-y {
        type ipv4_addr . ipv4_addr : verdict
    }
}

この種の要素で埋める必要があります。

0.0.0.0 . 0.0.0.0 : accept,
0.0.1.0 . 0.0.1.0 : accept,
[...]
0.0.20.0 . 0.0.20.0 : accept

そして、この規則に従って使用すると、vmap見つかると地図上で判断が実行されます。

ip saddr & 0.0.255.0 . ip daddr & 0.0.255.0 vmap @accept-same-y

関連情報