如何使用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
相关产品推荐
相关产品推荐

