ipset 저장 및 복원 옵션을 사용하여 여러 ips cidr을 추가하는 방법

ipset 저장 및 복원 옵션을 사용하여 여러 ips cidr을 추가하는 방법

ipset/iptables를 사용하여 IP 및 CIDR을 차단하는 루프가 있습니다.

# this is just an example. the actual list IPs/CIDR is very large
cat blockip.txt
13.31.0.254
cat blockcidr.txt
13.32.0.0/15

고리:


#!/bin/bash
ipset -F
ipset -N -! blacklist hash:net maxelem 1000000
for ip in $(cat blockip.txt blockcidr.txt); do
    ipset -A blacklist $ip
done
iptables -A FORWARD -m set --match-set blacklist dst -j DROP

참고: 저는 항상 이 옵션을 사용해왔지만 ipset -A이 옵션이 "에 표시되지 않기 때문에 정확히 무엇을 의미하는지 모르겠습니다.남자 Ipset", 그리고 이 시점에서는 두 경우 모두 출력이 동일하므로 add와 동일하다고 가정합니다 .-A

#!/bin/bash
ipset -F
ipset -N -! blacklist hash:net maxelem 1000000
for ip in $(cat blockip.txt blockcidr.txt); do
    ipset add blacklist $ip -q
done
iptables -A FORWARD -m set --match-set blacklist dst -j DROP

두 경우 모두:

sudo ipset -L
Name: blacklist
Type: hash:net
Revision: 7
Header: family inet hashsize 1024 maxelem 1000000 bucketsize 12 initval 0xbc0136c8
Size in memory: 552
References: 0
Number of entries: 2
Members:
13.31.0.254
13.32.0.0/15

"잘 작동한다"지만내가 읽고IP와 CIDR을 추가하는 것은 ipset -A매우 느립니다. 다음을 사용하는 것이 더 빠릅니다.ipset 저장 및 복원. 하지만 어떻게 작동하는지 이해하지 못하며 시도가 실패했습니다.

add참고: 또는 대신 저장/복원 옵션을 사용하는 것이 더 빠른 이유에 대한 설명을 찾지 못했습니다.-A

#!/bin/bash
ipset -F
ipset -N -! blacklist hash:net maxelem 1000000
for ip in $(cat blockip.txt blockcidr.txt); do
    ipset add blacklist $ip # ??
    ipset save blacklist -f newblacklist.txt # ???
done
ipset restore -! < newblacklist.txt # ??
iptables -A FORWARD -m set --match-set blacklist dst -j DROP # ??

밖으로:

sudo ipset -L
Name: blacklist
Type: hash:net
Revision: 7
Header: family inet hashsize 1024 maxelem 1000000 bucketsize 12 initval 0xcb0e583b
Size in memory: 552
References: 0
Number of entries: 2
Members:
13.32.0.0/15
13.31.0.254

cat newblacklist.txt # out wrong
create blacklist hash:net family inet hashsize 1024 maxelem 1000000 bucketsize 12 initval 0xcb0e583b
add blacklist 13.32.0.0/15
add blacklist 13.31.0.254

도움을 주시면 감사하겠습니다 (제안된 루프 또는 루프 수정을 포함하여 완전한 답변 포함).

답변1

이것은 나에게 효과적이었습니다.

# remove any old reference to the ipset
iptables -D FORWARD -m set --match-set blacklist dst -j DROP
ipset destroy

ipset create blacklist hash:net family inet hashsize 1024
ipset save > /tmp/ipset.txt
ipset destroy

cat blockip.txt blockcidr.txt | while read line; do
    if [ "${line:0:1}" = "#" ]; then
        continue
    fi
    echo "add blacklist $line" >> /tmp/ipset.txt
done

ipset restore < /tmp/ipset.txt
iptables -A FORWARD -m set --match-set blacklist dst -j DROP

필요에 따라 create 문의 옵션을 조정하세요. 세트의 크기에 따라 이러한 옵션은 매우 중요합니다. 이는 또한 파일에 blockcidr.txt다음과 같은 줄만 포함되어 있다고 가정합니다.

#comment
1.2.3.4/20

그 후에는 복원이 제대로 작동합니다.

업데이트
이러한 루프의 병목 현상은 항상 하위 프로세스 생성입니다 ipset. 항목이 10000개 이상인 경우 실행 가능한 ipset가 메모리에 로드되고 추가하려는 각 줄에 대해 옵션이 구문 분석됩니다.

내 루프에는 bash 내부 명령만 포함되어 있으므로 실행 파일을 로드/실행할 필요가 없습니다. 단지 일부 텍스트가 파일에 기록되는 것뿐입니다. 그리고 물론 - ipset에 대한 단일 호출은 ipset에 대한 10000개 이상의 호출보다 훨씬 빠릅니다.

관련 정보