检查 IP 是否属于 CIDR

检查 IP 是否属于 CIDR

我们有 CIDR 列表

1.10.10.0/24
5.154.0.0/16
5.181.219.0/24
23.90.68.0/24
31.40.214.0/24

我想检查 IP(例如:23.90.68.56)是否属于上述任何 CIDR。如果是,则我们获取该 CIDR 的输出。

根据上面的例子,输出应该是23.90.68.0/24

我尝试使用grepcidr但我不知道如何输出特定的 CIDR

我正在为此创建一个 bash 脚本,但有人能帮我处理这个输出吗?我尝试搜索网络,但没有找到任何相关信息

答案1

你可能拥有 Python:

#!/usr/bin/env python3
import argparse
import ipaddress
import sys

parser = argparse.ArgumentParser()
parser.add_argument("address")
args = parser.parse_args()

addr = ipaddress.ip_address(args.address)

for line in sys.stdin:
    cidr = ipaddress.ip_network(line.strip())
    if addr in cidr:
        print(cidr)
        exit(0)

exit(1)

答案2

可能的 shell 脚本:

#!/bin/bash

ip=$1
shift; shift

for net in "$@"
do
    nmap -sL -n $net | grep -q $ip && echo $net
done

如果你需要文件中的 cidrs 列表,请使用./scriptname ip_to_be_checked $(cat filename)。可能是猫的无用用途

./cidr.sh 23.90.68.56 $(cat cidrs.txt)

答案3

在 python 中,这将是:

import socket

def is_ip_in_cidr(ip, cidr):
    network, mask = cidr.split("/")
    mask = int(mask)
    ip_int = int.from_bytes(socket.inet_aton(ip), "big")
    network_int = int.from_bytes(socket.inet_aton(network), "big")
    network_mask = (0xFFFFFFFF << (32 - mask)) & 0xFFFFFFFF
    return (ip_int & network_mask) == network_int

# Test the function with a sample IP address and CIDR
ip = "192.168.0.5"
cidr = "192.168.0.0/24"

if is_ip_in_cidr(ip, cidr):
    print(f"{ip} is in {cidr}")
else:
    print(f"{ip} is NOT in {cidr}")

如果您可以使用提供的列表作为固定集进行测试,如下所示:

import socket

def is_ip_in_cidr(ip, cidrs):
    for cidr in cidrs:
        network, mask = cidr.split("/")
        mask = int(mask)
        ip_int = int.from_bytes(socket.inet_aton(ip), "big")
        network_int = int.from_bytes(socket.inet_aton(network), "big")
        network_mask = (0xFFFFFFFF << (32 - mask)) & 0xFFFFFFFF
        if (ip_int & network_mask) == network_int:
            return True
    return False

# Test the function with a sample IP address and list of CIDRs
ip = "192.168.0.5"
cidrs = ["1.10.10.0/24", "5.154.0.0/16", "5.181.219.0/24", "23.90.68.0/24", "31.40.214.0/24"]

if is_ip_in_cidr(ip, cidrs):
    print(f"{ip} is in one of {cidrs}")
else:
    print(f"{ip} is NOT in any of {cidrs}")

在 bash 中

#!/bin/bash

function is_ip_in_cidr {
  local ip=$1
  local cidr=$2
  local network=$(echo $cidr | cut -d/ -f1)
  local mask=$(echo $cidr | cut -d/ -f2)
  local network_dec=$(echo $network | awk -F. '{printf("%d\n", ($1 * 256 + $2) * 256 + $3)}')
  local ip_dec=$(echo $ip | awk -F. '{printf("%d\n", ($1 * 256 + $2) * 256 + $3)}')
  local mask_dec=$((0xffffffff << (32 - $mask)))
  if [[ $((ip_dec & mask_dec)) -eq $((network_dec & mask_dec)) ]]; then
    echo "true"
  else
    echo "false"
  fi
}

# Test the function with a sample IP address and CIDR
ip="192.168.0.5"
cidr="192.168.0.0/24"

if $(is_ip_in_cidr $ip $cidr); then
  echo "$ip is in $cidr"
else
  echo "$ip is NOT in $cidr"
fi

相关内容