CIDR
そのため、項目(たとえば)を含む複数のファイルがあります1.1.1.0/24
。タスクは、NFTables
bashスクリプトを使用してこれらのファイルのエントリをグループに追加することです。そうすることで、私はOpenWRT
ユーティリティに限定されます。
問題は、これらのファイルに多くのエントリがあるため、エントリの制限を超える可能性があることです。コマンドあたり4096文字。そして、これらのファイルは自動的に更新されるため、cron
定期的にファイルセットも削除して再入力する必要があります。
私がしたよりも簡単な方法があるようです。また、この混乱の実行時間を短縮したいと思います。これが私の試みです。
nft add element $TARGET_SET { $(awk '{print $1 ", "}' "$CUSTOM_CIDRS_FILE") }
ここにもう一つ質問があります。自分のファイルにエントリ数が多い場合、コマンドごとに4096文字の制限を克服できますか?最後の質問です。ループに一度に1つの項目を追加すると、グループを形成するのに時間がかかりますか?
私は主によく練習された答えを待っています。
答え1
awk
特定の長さに保持できる実行される文字列を構成することが可能です。これはパイプラインをxargs
フォークするよりもはるかにecho ... | tr
効率的です。
#!/usr/bin/env awk
{
len = length()
if (len > limit) {
if (length(outbuf)) {
system("echo " ENVIRON["TARGET_SET"] outbuf)
}
outbuf = $0
# the limit will be 4096 minus the length of the rest of
# the command and if the 4096 is kern.argmax then you
# may need to subtract even more to account for the
# length of the environment variables!
limit = 6
} else {
# join another field to output buffer
outbuf = outbuf "," $0
}
# the plus is for the length of the field joiner
limit -= len + 1
}
END {
if (length(outbuf)) {
system("echo " ENVIRON["TARGET_SET"] outbuf)
}
}
このスクリプトの内容は"echo "
テスト用であり、適切なnft ...
コマンドを実行できます。環境で読みやすいようTARGET_SET
にエクスポートする必要があります。awk
答え2
nftables コマンドの 4096 文字制限の内容をどこで読みましたか? 4,000個のCIDR範囲(約64,000文字)のリストがある場合は、エラーなしでコマンドを実行できます。
# wc -l ranges.txt
400.0 ranges.txt
# export TARGET_SET=example_set
# export CUSTOM_CIDRS_FILE=ranges.txt
# nft add set ip filter $TARGET_SET { type ipv4_addr\; flags interval\; }
# nft add element $TARGET_SET { $(awk '{print $1 ", "}' "$CUSTOM_CIDRS_FILE") }
これらのnft add
コマンドは約0.003秒間実行され、4000個の要素を含みます。
ある時点では、Linuxコマンドラインの長さの制限に直面する可能性があり、その場合はバッチ処理が可能です。これにより、1000のバッチで要素が追加されます。
xargs -n1000 sh -c '
nft add element ip filter $TARGET_SET { $(
echo "$@" | tr " " ","
) }' -- < $CUSTOM_CIDRS_FILE
(上記ではTARGET_SET
シェル変数ではなく環境変数を想定しています。)
同じ4000要素の実行時間は約0.1秒です。