/**
* Конвертируем ip/mask в диапазон IP
* 127.0.0.1/24 -> массив [0] 127.0.0.1 [1] 127.0.255.255
* @param type $net
* @return type
*/
function cidrconv($net) {
$start = strtok($net,"/");
$n = 3 - substr_count($net, ".");
if ($n > 0)
{
for ($i = $n;$i > 0; $i--)
$start .= ".0";
}
$bits1 = str_pad(decbin(ip2long($start)), 32, "0", STR_PAD_LEFT);
$net = (1 << (32 - substr(strstr($net, "/"), 1))) - 1;
$bits2 = str_pad(decbin($net), 32, "0", STR_PAD_LEFT);
$final = "";
for ($i = 0; $i < 32; $i++)
{
if ($bits1[$i] == $bits2[$i]) $final .= $bits1[$i];
if ($bits1[$i] == 1 and $bits2[$i] == 0) $final .= $bits1[$i];
if ($bits1[$i] == 0 and $bits2[$i] == 1) $final .= $bits2[$i];
}
return array($start, long2ip(bindec($final)));
}
/**
* Возвращает маску из IP вида 255.255.255.0 -> 24
* @param type $ip
* @return type
*/
function ip2mask($ip){
$res=false;
$intip=ip2long($ip);
if ($intip>0){
$binstr=decbin($intip);
$res= strpos($binstr,"0");
};
return $res;
};
/**
* Попадает ли ip в заданный диапазон
* true - да, false - нет
* Например: (10.0.1.3,10.0.0.0/8) -> true
* @param type $ip
* @param type $mask
*/
function ip_in_range($ip,$mask){
$res=false;
$ipd=cidrconv($mask);
$ip=ip2long($ip);
$start=ip2long($ipd[0]);
$end=ip2long($ipd[1]);
if (($ip>=$start) and ($ip<=$end)){$res=true;};
return $res;
};
/**
* Возвращает true если IP белый, false если серый
* @param type $ip
*/
function WhiteIP($ip){
$res=true;
if (ip_in_range($ip,"10.0.0.0/8")==true){$res=false;};
if (ip_in_range($ip,"172.16.0.0/12")==true){$res=false;};
if (ip_in_range($ip,"192.168.0.0/16")==true){$res=false;};
return $res;
};