首页 > 解决方案 > 如何将 IP 转换为 CIDR 块?(PHP)

问题描述

我有 ip,我想将其转换为具有特定掩码(例如 /28)的 CIDR 块。使用 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 的内容。似乎是最基本的操作,可能是我遗漏了一些东西,使用了错误的搜索词或误解了掩码。

对于上下文:我需要阻止机器人,我有他们的 IP 并且想要阻止 ipset 中的范围。/24 有点多(但很容易制作,只需将最后一位替换为“.0/24”),所以我想使用 /27 /28 /29。

标签: phpipcidr

解决方案


It's ... beautiful

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 

Rolling with this now


推荐阅读