Разбейте большой блок CIDR на меньшие блоки с помощью PHP

Я пробовал искать на форумах и нигде не смог найти. Нашел что-то, что сломало бы блок CIDR полностью, но мне нужно 2 функции отдельно.

Первая функция будет принимать блок CIDR, который БОЛЬШЕ, чем / 24, и разбивать его на блоки / 24.

Вторая функция, которую я фактически выполнил, - это разбить каждую / 24 на 256 IP-адресов. Ответ на этот вопрос можно найти здесь. Расширение данного диапазона IP с помощью PHP

Поэтому я пытаюсь понять, как создать функцию, передающую блок CIDR / 23 или более, и разбить ее на / 24s.

Пример:
Ввод: BreakTo24(10.0.0.0/22)

Выход:
10.0.0.0/24
10.0.1.0/24
10.0.2.0/24
10.0.3.0/24

РЕДАКТИРОВАТЬ: я понял, что я не опубликовал свою попытку кода, что, вероятно, затрудняет помощь. вот код:

function BreakTo24($CIDR){
    $CIDR = explode ("/", $CIDR);
    //Math to determine if the second part of the array contains more than one /24, and if so how many.

1 ответ

Решение

Я (с некоторой помощью через IRC) понял, что я делал это неэффективно и мне нужно было использовать функцию ip2long.

Я проверил это, и он выполнил то, что хотел. Вот мой законченный код, надеюсь, кто-то найдет его полезным.

// Function to take greater than a /24 CIDR block and make it into a /24
Function BreakTo24($CIDR)
{
    $CIDR = explode("/", $CIDR); // this breaks the CIDR block into octlets and /notation
    $octet = ip2long($CIDR[0]); //turn the first 3 octets into a long for calculating later
    $NumberOf24s = pow(2,(24-$CIDR[1]))-1; //calculate the number of /24s in the CIDR block
    $OutputArray = array();
    for ($i=-256; $i<256 * $NumberOf24s; $OutputArray[] = (long2ip($octet + ($i += 256)))); //fancy math to output each /24
    return $OutputArray; //returns an array of ranges

}

Другие вопросы по тегам