ipset
BusyBox 쉘 스크립트에는 방화벽 목록의 화이트리스트 로 사용되는 IP 목록이 있습니다 . 화이트리스트에는 화이트리스트에 등록할 라우팅할 수 없는 IP가 포함될 수 있습니다. 반면에Firehol_level1목록(완벽한)에는 rfc1918 라우팅할 수 없는 CIDR이 포함되어 있습니다.
iprange
첫 번째 시도는 CIDR과 일치하는 항목을 제외하는 화이트리스트를 사용하는 것이었고 iprange --common net.txt whitelist.txt
, 스왑된 파일 순서는 iprange --common whitelist.txt net.txt
항상 CIDR(네트워크 블록)이 아닌 IP를 출력했습니다.
화이트리스트에 등록된 IP가 네트워크 블록과 일치하는 경우 ipset
해당 네트워크 블록을 ( ) 목록에서 제거해야 합니다.
사용자 yaegashi는 좋은 사람입니다네트워크 스크립트의 bash ipv4/cidr (아님):
#!/bin/bash
v4dec() {
for i; do
echo $i | {
IFS=./
read a b c d e
test -z "$e" && e=32
echo -n "$((a<<24|b<<16|c<<8|d)) $((-1<<(32-e))) "
}
done
}
v4test() {
v4dec $1 $2 | {
read addr1 mask1 addr2 mask2
if (( (addr1&mask2) == (addr2&mask2) && mask1 >= mask2 )); then
echo "$1 is in network $2"
else
echo "$1 is not in network $2"
fi
}
}
그러나 bash 스크립트비지박스 쉘에서는 실행되지 않습니다.. busybox 쉘에서 실행되도록 수정했습니다.
#!/bin/sh
v4dec() {
for i; do
echo $i | {
IFS=./
read a b c d e
test -z "$e" && e=32
echo -n "$((a<<24|b<<16|c<<8|d)) $((-1<<(32-e))) "
}
done
}
v4dec $1 $2 | {
read addr1 mask1 addr2 mask2
if [ $(($addr1&$mask2)) -eq $(($addr2&$mask2)) ] && [ $mask1 -ge $mask2 ]; then
echo "$1 is in network $2"
else
echo "$1 is not in network $2"
fi
}
BusyBox(v1.24.2로 테스트됨) yaegashi v4test의 쉘 스크립트 번역이 동일한 작업을 수행합니까, 아니면 실수를 하고 있습니까?
아니면 제한된 하드웨어(Perl/Python/etcetera 없음)의 IPv4 주소 목록과 일치하는 ipset hash:net 목록에서 CIDR 항목을 제거하는 더 좋은 방법이 있습니까?
답변1
중요한 점 iprange
은 화이트리스트에 등록된 IP를 CIDR 형식으로 작성해야 한다는 것입니다.
IP에 접미사 합계 /20
를 추가하면 /24
네트워크 블록 일치가 향상될 수 있습니다.
$ cat net-optim.txt
1.10.16.0/20
$ cat whitelist.txt
1.10.16.1/20
1.10.16.1/24
$ iprange --common net-optim.txt whitelist.txt
1.10.16.0/20
iprange --exclude
실패 와 결합됩니다 --ipset-reduce 20
. 사용을 포기 iprange
하고 delete 192.168.0.* 사용으로 돌아갑니다 grep
.