web-dev-qa-db-fra.com

Comment obtenir l'adresse IP externe de mon serveur en utilisant PHP?

J'entends souvent des gens dire d'utiliser "$_SERVER['SERVER_ADDR']", mais cela renvoie l'adresse IP du réseau local de mon serveur (par exemple 192.168.1.100). Je veux l'IP externe.

17
Leo Jiang

Il suffit de demander à un hôte qui renvoie votre adresse IP:

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

ou, configurez un service qui répercute simplement l'adresse IP et utilisez-le comme ceci:

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

Configurez le service vous-même en faisant simplement écho à l'adresse IP distante ou payez quelqu'un pour l'héberger. Utilisez non le serveur de quelqu'un d'autre sans autorisation. Auparavant, cette réponse était liée à un de mes services qui est maintenant touché plusieurs fois par seconde.

Notez que dans un réseau IP avec un ou plusieurs NATs , vous pouvez avoir plusieurs adresses IP externes. Cela ne vous en donnera qu'un.

De plus, cette solution dépend bien sûr de la disponibilité de l'hôte distant. Cependant, étant donné qu’il n’existe pas de norme largement implémentée (pas de FAI et seuls certains routeurs domestiques implémentent UPnP ), il n’ya pas d’autre moyen pour obtenir votre adresse IP externe. Même si vous pouviez parler à votre NAT local, vous ne pouviez pas être sûr qu'il n'y avait pas d'autre NAT derrière.

28
phihag

Il n’ya AUCUN moyen d’obtenir votre adresse IP sous-jacente qui a été désignée par votre fournisseur de services Internet via le protocole PHP conventionnel si vous utilisez un routeur. Un moyen d'obtenir l'IP externe consiste à trouver un service qui l'obtiendra pour vous et vous renverra l'adresse. J'ai trouvé un service pratique qui fait justement cela. http://ipecho.net/

Vous pouvez utiliser:

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

Vous pouvez l’analyser à partir d’un service tel que 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;
6
Patrick Moore

Je vais ajouter une solution parce que les autres ne me convenaient pas, car ils:

  • doivent être exécutés sur un serveur avec un nom de domaine, par exemple. gethostbyname() (si vous y réfléchissez, le problème ne se pose pas si vous le savez a priori)
  • ne peut pas être utilisé sur la CLI (comptez que quelque chose dans $_SERVER doit être défini par un serveur Web)
  • assumer un format spécifique de sortie ifconfig, pouvant inclure plusieurs interfaces non publiques
  • dépend de l'analyse du site Web de quelqu'un (qui peut disparaître, changer l'URL, changer le format, commencer à vous mentir, etc., le tout sans préavis) 

Voici ce que je suggérerais:

$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'adresse IP est un serveur public Google . J'espère qu'ils seront là et le dirigeront pendant un moment. Peu importe l’adresse que vous utilisez là-bas n’importe pas tant qu’il s’agit d’une adresse IP publique appartenant à quelqu'un qui ne craint pas les tentatives de connexion aléatoires (vous-même peut-être?) 

Ceci est basé sur un answer Je suis tombé sur quand j'ai eu un problème similaire en Python.


P.S .: Je ne sais pas si cela fonctionnerait bien s'il y avait de la sorcellerie entre votre machine et Internet.

5
jeteon

Vous pouvez essayer ceci:

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

pour obtenir l'adresse IP associée à votre nom de domaine.

4
jakx

Je sais que cette question est ancienne et longue, mais je cherchais la même chose sur Google et je voulais ajouter mon propre "bidouillage". Pour que cela fonctionne, votre requête Web doit provenir d’une adresse IP externe ou vous devez modifier $own_url en une URL qui se fait une demande externe.

Le fait est que si vous laissez le script se faire une demande, vous obtenez son adresse IP externe.

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

Vous pouvez également obtenir une adresse IP via un enregistrement DNS A basé sur le nom d’hôte ou le nom du serveur:

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

Vous pouvez également utiliser SERVER_NAME au lieu de HTTP_Host si l'un des deux ne donne pas ce que vous voulez.

Cependant, cela suppose que votre serveur est configuré correctement en correspondance avec DNS. Cela peut ne pas toujours être le cas. Voir mon autre réponse en utilisant ifconfig, c'est peut-être mieux.

0
Arthur

Je pense qu'il y a beaucoup de code pour cela dans les réponses des autres, mais ma réponse est courte, mais vous devez exécuter une commande dans Shell pour obtenir l'adresse IP.

mais c'est court et rapide, je pense que ...

php exécuter bash> bash exécuter> bash obtenir l'IP> php obtenir l'IP 

echo Shell_exec( "Dig +short myip.opendns.com @resolver1.opendns.com");

Désolé mon anglais, j'espère que cela vous aidera tous ...

Référence: Comment puis-je obtenir mon adresse IP externe dans un script Shell?

0
DarckBlezzer

En supposant que votre PHP fonctionne sur un serveur Linux, vous pouvez appeler ifconfig à l'aide de la fonction exec de PHP. Cela donnera une adresse IP publique sans qu'il soit nécessaire de contacter un site Web/service externe. Par exemple.:

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

Notez que parfois, en tant que $ commande, vous devez spécifier le chemin complet de ifconfig. Vous pouvez trouver ceci en exécutant 

où est ifconfig

de Shell Invite. De plus, $ interface doit être défini sur le nom de l'interface réseau principale de votre serveur ayant le lien vers le réseau étendu.

Sous Windows, vous pouvez bien sûr faire quelque chose de similaire, en utilisant ipconfig au lieu de ifconfig (et l'expression rationnelle ajustée correspondante).

0
Arthur

Si votre serveur a un nom de domaine, vous pouvez y envoyer une requête ping ou vous pouvez utiliser:

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

Il retournera votre adresse IP externe.

0
Codebeat