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개 이상의 호출보다 훨씬 빠릅니다.