Come ottengo l'IP esterno del mio server usando PHP?

Sento spesso che la gente dice di usare " $_SERVER['SERVER_ADDR'] ", ma che restituisce l'IP LAN del mio server (ad esempio 192.168.1.100). Voglio l'IP esterno.

Basta interrogare un host che restituisce il tuo indirizzo IP:

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

oppure, crea un servizio che richiama semplicemente solo l'IP e usalo in questo modo:

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

Configurare autonomamente il servizio semplicemente facendo eco all'indirizzo IP remoto o pagando qualcuno per ospitarlo. Non utilizzare il server di qualcun altro senza permesso. In precedenza, questa risposta si collegava a un mio servizio che ora viene colpito più volte al secondo.

Nota che in una networking IP con uno o più NAT , potresti avere più indirizzi IP esterni. Questo ti darà solo uno di loro.

Inoltre, questa soluzione dipende ovviamente dalla disponibilità dell'host remoto. Tuttavia, poiché non esiste uno standard ampiamente implementato (nessun ISP e solo alcuni router domestici implementano UPnP ), non c'è altro modo per get il tuo indirizzo IP esterno. Anche se si potesse parlare con il NAT locale, non si può essere sicuri che non ci sia un altro NAT dietro di esso.

Non c'è modo di get il tuo indirizzo IP sottostante che è stato designato dal tuo ISP tramite PHP convenzionale se stai usando un router. Un modo per get l'IP esterno è di trovare un servizio che lo ottenga per te e ti rispedisce l'indirizzo. Ho trovato un servizio a portta di mano che fa proprio questo. http://ipecho.net/

Puoi usare:

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

Puoi analizzarlo da un servizio come 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; 

Potresti provare questo:

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

per get l'indirizzo IP associato al tuo nome di dominio.

Aggiungerò una soluzione perché gli altri non erano proprio adatti a me perché:

  • deve essere eseguito su un server con un nome di dominio es. gethostbyname() (se ci pensi, in realtà non hai il problema se lo conosci a priori)
  • non può essere utilizzato sulla CLI (fare affidamento su qualcosa in $_SERVER da impostare da un server web)
  • assumere un formato specifico dell'output di ifconfig , che può includere più interfacce non pubbliche
  • dipende dall'analisi del sito web di qualcuno (che potrebbe scomparire, cambiare l'URL, cambiare il formato, iniziare a mentire a te, ecc. tutto senza preavviso)

Questo è quello che suggerirei:

 $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 

L'indirizzo IP è un server DNS pubblico di Google . Confido che saranno in giro e lo gestiranno per un po '. Non dovrebbe davvero importre quale indirizzo usi lì finché è un indirizzo IP pubblico che appartiene a qualcuno a cui non import troppi tentativi di connessione random (forse tu?).

Questo si basa su una risposta che ho trovato quando ho avuto un problema simile in Python.


PS: Non sono sicuro di quanto bene functionrebbe se ci fosse stregoneria tra la tua macchina e Internet.

So che questa domanda è vecchia e lunga risposta, ma io stavo cercando su google per la stessa cosa e voglio aggiungere il mio "hack". Perché ciò avvenga, la tua richiesta web deve provenire da un indirizzo IP esterno o devi modificare $own_url in un URL che fa una richiesta esterna a se stesso.

Il punto è, se lasci che lo script faccia una richiesta a se stesso piuttosto che ottieni il suo indirizzo IP esterno.

 <?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; ?> 

Se il tuo server ha un nome di dominio puoi farlo ping o puoi usare:

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

Restituirà il tuo indirizzo IP esterno.

Supponendo che PHP sia in esecuzione su un server Linux, puoi call ifconfig usando la function exec di PHP. Ciò consentirà l'IP pubblico senza necessità di contattare alcun sito Web / servizio esterno. Per esempio:

 $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>'; } 

Si noti che a volte come command $ è necessario specificare il path completo di ifconfig. Puoi trovarlo eseguendo

whereis ifconfig

dal prompt della shell. Inoltre l'interface $ deve essere impostata sul nome dell'interface di networking principale del server che ha il link alla WAN.

Su Windows puoi fare qualcosa di simile, ovviamente, usando ipconfig invece di ifconfig (e la corretta espressione regolare).

Inoltre è ansible get l'IP tramite il record DNS A in base al nome host o al nome del server:

 $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']; 

Puoi anche utilizzare SERVER_NAME anziché HTTP_HOST se uno dei due non fornisce ciò che desideri.

Tuttavia, si presume che il tuo server sia configurato correttamente in corrispondenza di DNS. Questo potrebbe non essere sempre il caso. Vedi la mia altra risposta usando ifconfig che è forse meglio.

Penso che ci sia molto codice per queste cose in altre risposte, ma la mia risposta è breve, ma è necessario eseguire un command in shell per get l'ip …

ma è breve e veloce, penso che …

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

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

Scusate il mio per il mio inglese, spero che aiuti tutti voi …

Riferimento: come posso get il mio indirizzo IP esterno in uno script di shell?

Hai provato:

 gethostbyname(php_uname('n')); 

?