使用 sh 检查 IP 是否属于 IP 范围?

问题描述

假设我有一个 IP 173.245.50.16,我想检查它是否落入 Cloudflare's IP ranges。这基本上归结为:

network_address(173.245.50.16/20) == 173.245.48.0
|| network_address(173.245.50.16/22) == 103.21.244.0
|| ...

对吧?好吧,我不确定这里的术语,但希望你明白这一点。

如何转化为 sh 代码

解决方法

我想出了什么:

cf_ip_ranges=`curl -sS https://www.cloudflare.com/ips-v4`
is_cf_ip() {
    local ip=$1
    local range=$(echo "$cf_ip_ranges" | while IFS= read -r; do
        net=${REPLY%/*}
        n=${REPLY#*/}
        if [ "`ipv4calc --network "$ip/$n"`" = "$net" ]; then
            echo "$REPLY"
            break
        fi
    done)
    if [ "$range" ]; then
        return 0
    else
        return 1
    fi
}
if is_cf_ip 8.8.8.8; then
    echo true
else
    echo false
fi
if is_cf_ip 173.245.50.16; then
    echo true
else
    echo false
fi

这里我使用的是 Perl 的 Net::IPv4Addr module