2013-11-04 9 views
1

우리의 Datacenter는 우리의 모든 기계에서 JSON 덤프를 제공하여 자체 재고 관리 시스템으로 가져 왔습니다. 이것은 (192.168.1.1/26)과 같은 IP 블록을 제공하지만 수백 블록을 가져올 때 넷 마스크와 게이트웨이도 계산하고 싶습니다.IP 블록에서 Netmask/Gateway 계산

PHP Doxygen의 네트워킹 기능을 살펴 보았지만이를 수행 할 수있는 방법을 찾지 못했습니다. 어떻게 IP 블록에서 넷 마스크/게이트웨이를 계산할 수 있습니까?

답변

4

당신은 IP를 계산하고이 같은 것을 사용하여 마스크 수 있습니다

$ip_with_mask = '192.168.1.1/26'; 
list($ip, $mask_int) = explode('/', $ip_with_mask); 
$mask_nr = (pow(2, $mask_int) - 1) << (32 - $mask_int); 
//pow(2, $x) - 1 changes the number to a number made of that many set bits 
//and $y << (32 - $x) shifts it to the end of the 32 bits 
$mask = long2ip($mask_nr); 
$subnet_ip = long2ip(ip2long($ip) & $mask_nr); 
$gateway_ip = long2ip((ip2long($ip) & $mask_nr) + 1); 
+0

당신의 IP 주소를 엉망으로 생각되는 방식 : 비트와 함께. 훌륭한 코드 조각이 제 스 니펫 컬렉션으로 바로갑니다. 감사합니다! 어쩌면 모든 비트 연산이 아닌 사람들을위한 설명을 추가 할 수 있습니다. – Timmetje

+0

완벽한, 정말 고마워요! –

+0

끝에있는 $ ip의 값은 실제 IP의 마지막 번호가 1 씩 증가해야합니다. 예를 들어 192.168.1.0/26의 블록에 192.168.1.1의 게이트웨이가있는 모든 시스템이 설정되어 있지만이 스 니펫으로 해당 번호를 증가시키는 방법을 모르겠습니다. 그걸 제외하고는 완벽 해! –

1
<?php 

/* 
I have snipped this script from online and modified to give JSON output 
*/ 

$networkArray = array(); 

// Define your IP address detail in below line 
$my_net_info=rtrim('10.240.1.1/22'); 


if (! ereg('^([0-9]{1,3}\.){3}[0-9]{1,3}((([0-9]{1,3}\.){3}[0-9]{1,3})|(/[0-9]{1,2}))$',$my_net_info)){ 
    $networkArray['error'] = "Invalid Input"; 
} 

if (ereg("/",$my_net_info)){ //if cidr type mask 
    $dq_host = strtok("$my_net_info", "/"); 
    $cdr_nmask = strtok("/"); 
    if (!($cdr_nmask >= 0 && $cdr_nmask <= 32)){ 
     $networkArray['error'] = "Invalid CIDR value. Try an integer 0 - 32"; 
    } 
    $bin_nmask=cdrtobin($cdr_nmask); 
    $bin_wmask=binnmtowm($bin_nmask); 
} else { //Dotted quad mask? 
    $dqs=explode(" ", $my_net_info); 
    $dq_host=$dqs[0]; 
    $bin_nmask=dqtobin($dqs[1]); 
    $bin_wmask=binnmtowm($bin_nmask); 
    if (ereg("0",rtrim($bin_nmask, "0"))) { //Wildcard mask then? hmm? 
     $bin_wmask=dqtobin($dqs[1]); 
     $bin_nmask=binwmtonm($bin_wmask); 
     if (ereg("0",rtrim($bin_nmask, "0"))){ //If it's not wcard, whussup? 
      $networkArray['error'] = "Invalid Netmask"; 
     } 
    } 
    $cdr_nmask=bintocdr($bin_nmask); 
} 

//Check for valid $dq_host 
if(! ereg('^0.',$dq_host)){ 
    foreach(explode(".",$dq_host) as $octet){ 
     if($octet > 255){ 
      $networkArray['error'] = "Invalid IP Address"; 
     } 

    } 
} 
if(!empty($networkArray['error'])){ 
    echo json_encode($networkArray); 
    exit; 
} 

$bin_host=dqtobin($dq_host); 
$bin_bcast=(str_pad(substr($bin_host,0,$cdr_nmask),32,1)); 
$bin_net=(str_pad(substr($bin_host,0,$cdr_nmask),32,0)); 
$bin_first=(str_pad(substr($bin_net,0,31),32,1)); 
$bin_last=(str_pad(substr($bin_bcast,0,31),32,0)); 
$host_total=(bindec(str_pad("",(32-$cdr_nmask),1)) - 1); 

if ($host_total <= 0){ //Takes care of 31 and 32 bit masks. 
    $bin_first="N/A" ; $bin_last="N/A" ; $host_total="N/A"; 
    if ($bin_net === $bin_bcast) $bin_bcast="N/A"; 
} 

//Determine Class 
if (ereg('^0',$bin_net)){ 
    $class="A"; 
    $dotbin_net= "0 " . substr(dotbin($bin_net,$cdr_nmask),1) ; 
}elseif (ereg('^10',$bin_net)){ 
    $class="B"; 
    $dotbin_net= "10 " . substr(dotbin($bin_net,$cdr_nmask),2) ; 
}elseif (ereg('^110',$bin_net)){ 
    $class="C"; 
    $dotbin_net= "110 " . substr(dotbin($bin_net,$cdr_nmask),3) ; 
}elseif (ereg('^1110',$bin_net)){ 
    $class="D"; 
    $dotbin_net= "1110 " . substr(dotbin($bin_net,$cdr_nmask),4) ; 
    $special="Multicast Address Space"; 
}else{ 
    $class="E"; 
    $dotbin_net= "1111 " . substr(dotbin($bin_net,$cdr_nmask),4) ; 
    $special="Experimental Address Space"; 
} 

if (ereg('^(00001010)|(101011000001)|(1100000010101000)',$bin_net)){ 
    $special='RFC-1918 Private Internet Address'; 
} 

// Print Results 

$networkArray['class'] = $class; 
$networkArray['address'] = $dq_host; 
$networkArray['mask'] = bintodq($bin_nmask); 
$networkArray['cdr'] = $cdr_nmask; 
$networkArray['wildcard'] = bintodq($bin_wmask); 
$networkArray['network'] = bintodq($bin_net); 
$networkArray['broadcast'] = bintodq($bin_bcast); 
$networkArray['hostmin'] = bintodq($bin_first); 
$networkArray['hostmax'] = bintodq($bin_last); 
$networkArray['hostnet'] = $host_total; 
$networkArray['special'] = $special; 

$networkArray['bin-address'] = dotbin($bin_host,$cdr_nmask); 
$networkArray['bin-mask'] = dotbin($bin_nmask, $cdr_nmask); 
$networkArray['bin-wildcard'] = dotbin($bin_wmask, $cdr_nmask); 
$networkArray['bin-network'] = $dotbin_net; 
$networkArray['bin-broadcast'] = dotbin($bin_bcast, $cdr_nmask); 
$networkArray['bin-hostmin'] = dotbin($bin_first, $cdr_nmask); 
$networkArray['bin-hostmax'] = dotbin($bin_last, $cdr_nmask); 

echo json_encode($networkArray); 

function binnmtowm($binin){ 
    $binin=rtrim($binin, "0"); 
    if (!ereg("0",$binin)){ 
     return str_pad(str_replace("1","0",$binin), 32, "1"); 
    } else return "1010101010101010101010101010101010101010"; 
} 

function bintocdr ($binin){ 
    return strlen(rtrim($binin,"0")); 
} 

function bintodq ($binin) { 
    if ($binin=="N/A") return $binin; 
    $binin=explode(".", chunk_split($binin,8,".")); 
    for ($i=0; $i<4 ; $i++) { 
     $dq[$i]=bindec($binin[$i]); 
    } 
     return implode(".",$dq) ; 
} 

function bintoint ($binin){ 
     return bindec($binin); 
} 

function binwmtonm($binin){ 
    $binin=rtrim($binin, "1"); 
    if (!ereg("1",$binin)){ 
     return str_pad(str_replace("0","1",$binin), 32, "0"); 
    } else return "1010101010101010101010101010101010101010"; 
} 

function cdrtobin ($cdrin){ 
    return str_pad(str_pad("", $cdrin, "1"), 32, "0"); 
} 

function dotbin($binin,$cdr_nmask){ 
    // splits 32 bit bin into dotted bin octets 
    if ($binin=="N/A") return $binin; 
    $oct=rtrim(chunk_split($binin,8,"."),"."); 
    if ($cdr_nmask > 0){ 
     $offset=sprintf("%u",$cdr_nmask/8) + $cdr_nmask ; 
     return substr($oct,0,$offset) . substr($oct,$offset) ; 
    } else { 
    return $oct; 
    } 
} 

function dqtobin($dqin) { 
     $dq = explode(".",$dqin); 
     for ($i=0; $i<4 ; $i++) { 
      $bin[$i]=str_pad(decbin($dq[$i]), 8, "0", STR_PAD_LEFT); 
     } 
     return implode("",$bin); 
} 

function inttobin ($intin) { 
     return str_pad(decbin($intin), 32, "0", STR_PAD_LEFT); 
} 
?>