나는 ipset v7.15의 bash 스크립트 (우분투 22.04에서 실행)를 가지고 있습니다.남자 이름(이 질문에 대해 몇 가지 수정을 했습니다):
ipset create -! blacklist hash:net family inet hashsize 1024
ipset save -! > /tmp/ipset.txt
cat list.txt | sort -t . -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n | while read line; do
echo "add blacklist $line" >> /tmp/ipset.txt
done
ipset restore -! < /tmp/ipset.txt
의 내용 list.txt
:
125.74.0.0/15
1.0.132.249
125.73.0.0/16
130.255.128.0/20
125.76.0.0/17
밖으로 /tmp/ipset.txt
:
create blacklist hash:net family inet hashsize 1024 maxelem 65536 bucketsize 12 initval 0xf164f1c6
add blacklist 1.0.132.249
add blacklist 125.73.0.0/16
add blacklist 125.74.0.0/15
add blacklist 125.76.0.0/17
add blacklist 130.255.128.0/20
밖으로 ipset -L
(문제):
sudo ipset -L
Name: blacklist
Type: hash:net
Revision: 7
Header: family inet hashsize 1024 maxelem 65536 bucketsize 12 initval 0xf164f1c6
Size in memory: 696
References: 0
Number of entries: 5
Members:
125.74.0.0/15
1.0.132.249
125.73.0.0/16
130.255.128.0/20
125.76.0.0/17
보시다시피 출력의 IP/CIDR이 blacklist
엉망입니다(아니요 sort
).
-s, -sorted
Sorted output. When listing or saving sets, the entries are listed sorted.
하지만 다음 명령을 사용하여 시도했는데 출력은 동일합니다( 가 없습니다 sort
. 올바르게 사용하지 않는 것일 수도 있습니다).
ipset restore -! -s < /tmp/ipset.txt
-!
명령 에서 옵션을 제거하면 restore
다음 오류가 발생합니다.
ipset v7.15: Error in line 1: Set cannot be created: set with the same name already exists
그래서 내 스크립트에 있어서는 안 될 줄이 추가되었기 때문에 오류가 있는 것 같습니다.
create blacklist hash:net family inet hashsize 1024 maxelem 65536 bucketsize 12 initval 0xf164f1c6
save
그런 다음 오류를 피하기 위해 줄을 제거하고 다음과 같이 남겨 둘 수 있습니다 .
ipset -! create blacklist hash:net family inet hashsize 1024
cat list.txt | while read line; do
echo "add blacklist $line" >> /tmp/ipset.txt
done
ipset -s restore -f /tmp/ipset.txt
그러나 를 실행할 때 출력은 정렬 없이 동일하게 유지되므로 (-s) ipset -L
옵션 -sorted
이 작동하지 않습니다.restore
출력이 정리되도록 이 문제를 어떻게 수정합니까?
답변1
몇 가지 배경 정보 ipset
: 이것은 커널 메모리 내에서 크기가 조정되는 데이터 세트를 조작하는 명령줄 도구입니다. 따라서 ipset은 커널 내부에 있는 실제 코드를 호출하는 래퍼일 뿐입니다. 즉, 세트의 내용을 나열하는 코드를 포함합니다. 까다로운 부분은 다음과 같습니다.
정렬된 방식으로 세트의 출력을 원하는 옵션을 전달했지만 이를 담당하는 커널 모듈은 해당 옵션을 모르고 단순히 무시했습니다. 커널 컨텍스트에서 실행되는 모든 기능은 속도가 빨라야 하며 시간이 너무 오래 걸릴 경우 시스템이 정지될 수 있습니다. 그렇기 때문에 커널 개발자는 코드가 꼭 필요하지 않을 때 매우 까다롭습니다(정렬은 CPU 시간 측면에서 비용이 많이 들고 필요하지 않습니다. 이는 사용자 공간에서도 수행될 수 있습니다).
세트의 정렬된 출력을 "활성화"하는 데 필요한 커널 버전이 무엇인지 모르겠습니다. 출력을 정렬하는 옵션이 제대로 작동하는 커널 버전 6.0.9로 테스트했습니다. 일부 매뉴얼 페이지에서 힌트를 제거한 것은 부끄러운 일입니다.여기여전히 해당 힌트가 있는 매뉴얼 페이지 버전입니다.
이러한 순서로 설정된 것은 오류가 아니라 실제로 기능입니다. 목록에서 들어오는 IP가 해당 목록의 일부인지 확인하려면 모든 항목을 살펴봐야 합니다. 이렇게 하면 모든 조회가 목록 크기에 따라 달라집니다. 해시는 다릅니다. A기능데이터(이 경우 IP)에서 해시 값을 계산하는 데 사용됩니다. 이 해시 값은 데이터 내부 위치에 대한 참조로 사용됩니다. 항목이 있으면 IP가 해당 목록 내에 있습니다.
이러한 세트 구성 방법을 사용하면 세트 크기에 관계없이 값을 상수로 조회하는 데 필요한 시간이 발생합니다! 네트워크 트래픽의 경우 빠른 응답 시간이 항상 중요합니다.
이것이 상황을 더 잘 이해하는 데 도움이 되기를 바랍니다...