如何在 BusyBox shell 中检查 IP 地址或网络是否包含在其他网络中?

如何在 BusyBox shell 中检查 IP 地址或网络是否包含在其他网络中?

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

相关内容