Как мне конвертировать IP в блок CIDR? (PHP) - PullRequest
0 голосов
/ 29 февраля 2020

У меня есть ip, и я хочу преобразовать его в блок CIDR с заданной маской c (например, / 28). Использование PHP.

, чтобы входные данные "1.1.1.100" и "28" и выходные данные были "1.1.1.96/28"

ip_to_cidr('1.1.1.100', '28') // '1.1.1.96/28'

. Я обнаружил, что многие функции соответствуют и диапазоны, но ничего о фактическом преобразовании из ip в CIDR. Похоже, что это самая базовая c операция, может быть, я что-то упускаю, использую неправильные условия поиска или неверное понимание масок.

Для контекста: мне нужно заблокировать ботов, у меня есть их IP и я хочу заблокировать диапазон в ipset. / 24 немного-много (но это легко сделать, просто замените последний бит на «.0 / 24»), поэтому я хочу использовать / 27/28 /29.

Ответы [ 2 ]

1 голос
/ 29 февраля 2020

Это ... прекрасно

function ip_to_mask28($ip)
{
    $ip_parts = explode('.', $ip);
    $mask28 = [0, 16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 192, 208, 224, 240, 256];
    foreach ( $mask28 as $key => $value )
        if ( $ip_parts[3] < $mask28[$key + 1] )
            return $ip_parts[0].'.'.$ip_parts[1].'.'.$ip_parts[2].'.'.$value.'/28';
}
echo ip_to_mask28('1.1.1.100'); // 1.1.1.96/28 

Катаюсь с этим сейчас

0 голосов
/ 29 февраля 2020

Это то, что вы ищете? Я искал об этом и нашел это, которое близко к вашему выводу. Вы можете найти больше информации здесь

function ipRange($cidr) {
   $range = array();
   $cidr = explode('/', $cidr);
   $range[0] = long2ip((ip2long($cidr[0])) & ((-1 << (32 - (int)$cidr[1]))));
   $range[1] = long2ip((ip2long($range[0])) + pow(2, (32 - (int)$cidr[1])) - 1);
   return $range;
}

var_dump(ipRange('1.1.1.100/28'));

Выход:

array(2) {
 [0]=>
 string(8) "1.1.1.96"
 [1]=>
 string(9) "1.1.1.111"
}
...