ファイルから設定にCIDRを追加する最良の方法は何ですか?

ファイルから設定にCIDRを追加する最良の方法は何ですか?

CIDRそのため、項目(たとえば)を含む複数のファイルがあります1.1.1.0/24。タスクは、NFTablesbashスクリプトを使用してこれらのファイルのエントリをグループに追加することです。そうすることで、私は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秒です。

関連情報