Является ли общедоступным IP-адрес?
Я хотел бы знать, существует ли какой-либо простой способ проверить, является ли IP-адрес общедоступным или частным.
Более конкретно. Я знаю, например, что 127.0.0.1 - это частный IP-адрес, который указывает на ту же машину, 255.255.255.255, если для вещания в ту же сеть, 192.168.1.0 - для адресов локальной сети и так далее. Но как я могу определить, не является ли данный IP-адрес одним из частных IP-адресов и является общедоступным?
4 answers
Http://en.wikipedia.org/wiki/Private_network перечисляет различные диапазоны. Просто создайте оператор if.
Pulic/частные IPv4-адреса определены в RFC 5735. Короче говоря:
- 0.0.0.0/8 недопустимо
- 127.0.0.0/8 является локальным хостом
- 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 - локальный хост
- ::ffff:0:0/96 - это адреса, сопоставленные с IPv4
- fe80::/10 и fc00::/7 являются частными сетями
- ff00::/8 является многоадресной
- Все остальное общедоступно или зарезервировано
Обратите внимание, что службы на компьютерах без общедоступного IP-адреса все еще могут быть доступны из Интернета с помощью переадресации портов или других правил брандмауэра.
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;
}
Одно решение упоминается Эдом Хил, но есть и другое:
Просто подключитесь к какому-нибудь внешнему хосту и запросите у него IP, который он видит, вот так (пример для PHP):
$my_public_ip = file_get_contents('http://ip.42.pl/raw');
Этот конкретный пример, который я знаю, вернет одну строку, содержащую только IP-адрес. Я не знаю других сервисов, предлагающих это, хотя их, вероятно, много. Главная страница вышеупомянутого скрипта/сервиса: http://ip.42.pl/.
Если вы знаете подобные сервисы, пожалуйста размещайте их URL-адреса в комментариях, чтобы у будущих читателей были другие варианты.