BusyBox shell 脚本有一个 IP 列表,用作防火墙ipset
列表的白名单。白名单可能包含要列入白名单的不可路由 IP。另一方面firehol_level1列表 (完整的)确实包含 rfc1918 不可路由的 CIDR。
我的第一次尝试是使用iprange
排除与 CIDR 匹配的白名单
iprange --common net.txt whitelist.txt
,并且交换的文件顺序iprange --common whitelist.txt net.txt
将始终输出 IP,而不是 CIDR(网络块)。
如果白名单 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 shell 上运行。我已将其修改为在 busybox shell 上运行:
#!/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 的 shell 脚本翻译是否做同样的事情,或者我犯了错误?
或者是否有更好的方法从 ipset hash:net 列表中删除与有限硬件(无 Perl/Python/etcetera)上的 IPv4 地址列表匹配的 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
并将回退到使用 删除 192.168.0.* grep
。