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
。