You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用sh脚本判断指定IP是否属于Cloudflare等目标IP段范围

实现思路
  • 将IPv4地址转换为32位无符号整数,避免逐段字符串匹配的繁琐
  • 拉取Cloudflare官方发布的IPv4 CIDR列表
  • 遍历每一个CIDR段,计算出该段的IP范围(起始整数、结束整数)
  • 校验目标IP是否落在任意一个段的范围内,返回对应结果
完整可运行Shell代码
#!/bin/sh

# 检查参数是否输入
if [ $# -ne 1 ]; then
    echo "用法: $0 <待检测IPv4地址>"
    exit 1
fi
TARGET_IP="$1"

# IPv4转32位整数的函数
ip_to_int() {
    local ip="$1"
    echo "$ip" | awk -F. '{print ($1 * 16777216) + ($2 * 65536) + ($3 * 256) + $4}'
}

# 转换目标IP为整数
TARGET_INT=$(ip_to_int "$TARGET_IP")
if [ -z "$TARGET_INT" ] || [ "$TARGET_INT" -lt 0 ] 2>/dev/null; then
    echo "错误:输入的IP地址格式无效"
    exit 1
fi

# 拉取Cloudflare IPv4 CIDR列表逐行处理
curl -s https://www.cloudflare.com/ips-v4 | while read -r CIDR; do
    # 拆分CIDR为网络地址和掩码长度
    NET_ADDR=$(echo "$CIDR" | cut -d/ -f1)
    PREFIX_LEN=$(echo "$CIDR" | cut -d/ -f2)
    
    # 转换网络地址为整数
    NET_INT=$(ip_to_int "$NET_ADDR")
    # 计算该网段的主机数
    HOST_COUNT=$(( (1 << (32 - PREFIX_LEN)) - 1 ))
    # 计算网段最大IP整数
    BROADCAST_INT=$(( NET_INT + HOST_COUNT ))

    # 判断目标IP是否在当前网段范围内
    if [ "$TARGET_INT" -ge "$NET_INT" ] && [ "$TARGET_INT" -le "$BROADCAST_INT" ]; then
        echo "IP $TARGET_IP 属于Cloudflare地址段,匹配网段:$CIDR"
        exit 0
    fi
done

# 遍历完所有网段都没匹配到
echo "IP $TARGET_IP 不属于Cloudflare地址段"
exit 1
使用说明
  • 将上述代码保存为check_cf_ip.sh
  • 赋予执行权限:chmod +x check_cf_ip.sh
  • 运行检测:./check_cf_ip.sh 173.245.50.16
  • 返回示例:IP 173.245.50.16 属于Cloudflare地址段,匹配网段:173.245.48.0/20

内容的提问来源于stack exchange,提问作者x-yuri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 07:45:04