2012-01-11 132 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; 
}