Как получить внешний IP-адрес моего сервера с помощью PHP?

Я часто слышу, как люди говорят, что используют « $_SERVER['SERVER_ADDR'] », но это возвращает IP-адрес моего сервера (например, 192.168.1.100). Я хочу внешний IP.

Просто запросите хост, который возвращает ваш IP-адрес:

 $externalContent = file_get_contents('http://checkip.dyndns.com/'); preg_match('/Current IP Address: \[?([:.0-9a-fA-F]+)\]?/', $externalContent, $m); $externalIp = $m[1]; 

или, настройте службу, которая просто перекликается с IP-адресом и использует его следующим образом:

 $externalIp = file_get_contents('http://yourdomain.example/ip/'); 

Настройте сервис самостоятельно, просто повторяя удаленный IP-адрес или платите кому-либо за его размещение. Не используйте чужой сервер без разрешения. Раньше этот ответ был связан с моей службой, которая сейчас попадает несколько раз в секунду.

Обратите внимание, что в IP-сети с одним или несколькими NAT может быть несколько внешних IP-адресов. Это даст вам только один из них.

Кроме того, это решение, конечно, зависит от доступности удаленного хоста. Однако, поскольку нет широко внедренного стандарта (ISP и только некоторые домашние маршрутизаторы не поддерживают UPnP ), нет другого способа получить внешний IP-адрес. Даже если вы можете поговорить с местным NAT, вы не можете быть уверены, что за ним нет другого NAT.

Нет способа получить ваш базовый IP-адрес, который был назначен вашим провайдером через обычный PHP, если вы используете маршрутизатор. Способ получения внешнего IP-адреса – найти сервис, который получит его для вас, и повторить адрес обратно к вам. Я нашел удобный сервис, который делает именно это. http://ipecho.net/

Вы можете использовать:

 $realIP = file_get_contents("http://ipecho.net/plain"); 

Вы можете разобрать его с помощью сервиса ip6.me :

 <?php // Pull contents from ip6.me $file = file_get_contents('http://ip6.me/'); // Trim IP based on HTML formatting $pos = strpos( $file, '+3' ) + 3; $ip = substr( $file, $pos, strlen( $file ) ); // Trim IP based on HTML formatting $pos = strpos( $ip, '</' ); $ip = substr( $ip, 0, $pos ); // Output the IP address of your box echo "My IP address is $ip"; // Debug only -- all lines following can be removed echo "\r\n<br/>\r\n<br/>Full results from ip6.me:\r\n<br/>"; echo $file; 

Вы можете попробовать следующее:

 $ip = gethostbyname('www.example.com'); echo $ip; 

для получения IP-адреса, связанного с вашим доменным именем.

Я собираюсь добавить решение, потому что другие не совсем подходят мне, потому что они:

  • необходимо запускать на сервере с именем домена, например gethostbyname() (если вы думаете об этом, у вас на самом деле нет проблемы, если вы знаете это априори)
  • не может использоваться в CLI (полагаться на что-то в $_SERVER для установки веб-сервером)
  • предположим определенный формат вывода ifconfig , который может включать несколько непубличных интерфейсов
  • зависят от разбора чей-то веб-сайта (кто может исчезнуть, изменить URL-адрес, изменить формат, начать лгать вам и т. д., все без предупреждения)

Вот что я хотел бы предложить:

 $sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); $res = socket_connect($sock, '8.8.8.8', 53); // You might want error checking code here based on the value of $res socket_getsockname($sock, $addr); socket_shutdown($sock); socket_close($sock); echo $addr; // Ta-da! The IP address you're connecting from 

IP-адрес – это общедоступный DNS- сервер Google . Я верю, что они будут рядом и будут работать на некоторое время. Не имеет значения, какой адрес вы используете там, пока его публичный IP-адрес, принадлежащий тому, кто не против случайного подключения, слишком много пытается (может быть?).

Это основано на ответе, с которым я столкнулся, когда у меня была аналогичная проблема в Python.


PS: Я не уверен, насколько хорошо это будет работать, если между вашей машиной и Интернетом будет колдовство.

Я знаю, что этот вопрос старый и долго ответил, но я искал ту же самую вещь и хочу добавить свой собственный «взлом». Для этого ваш веб-запрос должен исходить из внешнего IP-адреса или вам нужно изменить $own_url на URL-адрес, который делает внешний запрос для себя.

Дело в том, что если вы позволяете скрипту делать запрос самому себе, чем вы получаете его внешний IP-адрес.

 <?php if (isset($_GET['ip'])) { die($_SERVER['REMOTE_ADDR']); } $own_url = (isset($_SERVER['HTTPS']) ? 'https' : 'http') . '://'.$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME']; $ExternalIP = file_get_contents($own_url.'?ip=1'); echo $ExternalIP; ?> 

Если у вашего сервера есть доменное имя, вы можете его загрузить или использовать:

 $sMyServerIP = gethostbyname('yourdomain.com'); echo $sMyServerIP; 

Он вернет внешний IP-адрес.

Предполагая, что ваш PHP работает на сервере Linux, вы можете вызвать ifconfig с помощью функции exec PHP. Это даст публичный IP-адрес без необходимости связываться с каким-либо внешним веб-сайтом / службой. Например:

 $command = "ifconfig"; /// see notes below $interface = "eth0"; // exec($command, $output); $output = implode("\n",$output); if ( preg_match('/'.preg_quote($interface).'(.+?)[\r\n]{2,}/s', $output, $ifaddrsMatch) && preg_match_all('/inet(6)? addr\s*\:\s*([a-z0-9\.\:\/]+)/is', $ifaddrsMatch[1], $ipMatches, PREG_SET_ORDER) ) { foreach ( $ipMatches as $ipMatch ) echo 'public IPv'.($ipMatch[1]==6?'6':'4').': '.$ipMatch[2].'<br>'; } 

Обратите внимание, что иногда как $ command вы должны указать полный путь ifconfig. Вы можете найти это, выполнив

whereis ifconfig

из командной строки. Кроме того, $ interface должен быть установлен на имя основного сетевого интерфейса вашего сервера, который имеет ссылку на WAN.

В Windows вы можете сделать что-то подобное, конечно, используя ipconfig вместо ifconfig (и соответствующее настроенное регулярное выражение).

Также вы можете получить IP-адрес через DNS-запись на основе имени хоста или имени сервера:

 $dnsARecord = dns_get_record($_SERVER['HTTP_HOST'],DNS_A); if ( $dnsARecord ) echo 'IPv4: '.$dnsARecord[0]['ip']; $dnsARecord = dns_get_record($_SERVER['HTTP_HOST'],DNS_AAAA); if ( $dnsARecord ) echo 'IPv6: '.$dnsARecord[0]['ip']; 

Вы также можете использовать SERVER_NAME вместо HTTP_HOST, если один из двух не дает того, что вы хотите.

Тем не менее, предполагается, что ваш сервер настроен правильно в соответствии с DNS. Это может быть не всегда так. См. Мой другой ответ, используя ifconfig, который, возможно, лучше.

Я думаю, что есть много кода для этого в других ответах, но мой ответ короткий, но вам нужно выполнить команду в оболочке, чтобы получить ip …

но это коротко и быстро, я думаю, что …

php execute bash> bash run> bash get ip> php get ip

 echo shell_exec( "dig +short myip.opendns.com @resolver1.opendns.com"); 

Извините за мой английский, я надеюсь, что он поможет вам …

Ссылка: Как я могу получить внешний IP-адрес в сценарии оболочки?

Ты пробовал:

 gethostbyname(php_uname('n')); 

?