CIDR
그래서 항목(예: )이 포함된 파일이 여러 개 있습니다 1.1.1.0/24
. 작업은 NFTables
bash 스크립트를 사용하여 이러한 파일의 항목을 그룹에 추가하는 것입니다. 그렇게 함으로써 나는 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초입니다.