そして。10.x.y.0/24
0 ≤ x ≤ 50
0 ≤ 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