2012-01-11 134 views
2

我想知道是否有任何簡單的方法來檢查IP地址是公開訪問還是私有的。是公共IP地址嗎?

更具體地說,我知道,例如,127.0.0.1是指向同一臺機器的專用IP地址,255.255.255.255(如果用於廣播到同一網絡中),192.168.1.0用於本地網絡地址等。但是,如何區分給定IP地址是否不是私有IP,並且可以公開訪問?

+1

你是否以編程方式執行此操作?如果是這樣的話?如果不是,它可能屬於superuser.com – 2012-01-11 12:01:06

+0

是的,我喜歡用PHP檢查IP。但我問的是,如果有任何一般的插管可以幫助我解決這個問題 – 2012-01-11 12:02:02

+2

http://en.wikipedia。org/wiki/Reserved_IP_addresses#Reserved_IPv4_addresses – Flexo 2012-01-11 12:02:28

回答

4

RFC 5735中定義了Pulic/private IPv4地址。總之:

  • 0.0.0.0/8無效
  • 127.0.0.0/8爲localhost
  • 169.254.0.0/16是一個未配置的IP。你應該把它當作本地地址
  • 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16是專用網絡
  • 224.0.0.0/4是組播
  • 其他的都是公共可到達,或保留

對於IPv6,請參閱RFC 5165。簡而言之:

  • ::/128是未指定的地址,:: 1/128爲localhost
  • :: FFFF:0:0/96是IPv4映射地址
  • FE80 ::/10和FC00 ::/7是專用網絡
  • FF00 ::/8爲多播
  • 一切是公共可到達,或保留

注意機器上的服務,而不一個公網IP仍然可以從到達Ť他藉助端口轉發或其他防火牆規則互聯網。

2

一種解決方案是由Ed提到痊癒,但還有另外一個:

只要連接到一些外部主機並請它替它看到的IP,這樣的(例如對於PHP):

$my_public_ip = file_get_contents('http://ip.42.pl/raw'); 

我知道這個特定的例子將返回只包含一個IP地址的單個字符串。我不知道提供這種服務的其他服務,儘管可能有很多服務。上述腳本/服務的主頁是:http://ip.42.pl/

如果您知道類似的服務,請將其網址發佈在評論中,以便將來的讀者有其他選擇。

+0

這決定了客戶的IP地址。不是地址是公開的還是私人的?! – 2016-11-03 23:08:35

3
function validateIpAddress($ip_addr) 
{ 
    $result = true; 
    if(preg_match("/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/",$ip_addr)) 
    { 
     $parts=explode(".",$ip_addr); 
     foreach($parts as $ip_parts) 
     { 
      if(intval($ip_parts)>255 || intval($ip_parts)<0) 
       $result=false; 
     } 
     if (intval($parts[0])==0 || intval($parts[0])==10 || intval($parts[0])==127 || (intval($parts[0])>223 && intval($parts[0])<240)) 
     { 
      $result=false; 
     } 
     if ((intval($parts[0])==192 && intval($parts[1])==168) || (intval($parts[0])==169 && intval($parts[1])==254)) 
     { 
      $result=false; 
     } 

     if (intval($parts[0])==172 && intval($parts[1])>15 && intval($parts[1])<32) 
     { 
      $result=false; 
     } 
    } 
    else 
    { 
     $result = false; //if format of ip address doesn't matches 
    } 
    return $result; 
}