파일에서 설정으로 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

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초입니다.

관련 정보