it-swarm.com.de

Wie erhalte ich die externe IP meines Servers mit PHP?

Ich höre oft, dass Leute sagen "$_SERVER['SERVER_ADDR']" zu verwenden, aber dies gibt die LAN-IP meines Servers zurück (z. B. 192.168.1.100). Ich möchte die externe IP.

17
Leo Jiang

Fragen Sie einfach einen Host ab, der Ihre IP-Adresse zurückgibt:

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

oder richten Sie einen Dienst ein, der einfach nur die IP wiedergibt, und verwenden Sie ihn wie folgt:

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

Richten Sie den Dienst selbst ein, indem Sie einfach die Remote-IP-Adresse wiederholen oder jemanden für Host bezahlen. Verwenden Sie not den Server eines anderen Benutzers ohne Erlaubnis. Zuvor war diese Antwort mit einem Dienst von mir verknüpft, der jetzt mehrmals pro Sekunde getroffen wird.

Beachten Sie, dass Sie in einem IP-Netzwerk mit einem oder mehreren NATs möglicherweise mehrere externe IP-Adressen haben. Dies gibt Ihnen nur eine davon.

Diese Lösung hängt natürlich auch davon ab, ob der Remote-Host verfügbar ist. Da es jedoch keinen weit verbreiteten Standard gibt (kein ISP und nur einige Heimrouter implementieren UPnP ), erhalten Sie es gibt keinen anderen Weg, um Ihre externe IP-Adresse zu erhalten. Selbst wenn Sie mit Ihrem lokalen NAT sprechen könnten, können Sie nicht sicher sein, dass sich dahinter kein weiteres NAT befindet.

28
phihag

Es gibt KEINE Möglichkeit, Ihre zugrunde liegende IP-Adresse, die von Ihrem Internetdienstanbieter festgelegt wurde, über konventionelles PHP zu erhalten, wenn Sie einen Router verwenden. Eine Möglichkeit, die externe IP-Adresse zu erhalten, besteht darin, einen Dienst zu finden, der diese für Sie abruft und die Adresse an Sie zurücksendet. Ich habe einen praktischen Service gefunden, der genau das tut. http://ipecho.net/

Sie können verwenden:

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

Sie könnten es von einem Dienst wie ip6.me analysieren:

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

Ich werde eine Lösung hinzufügen, weil die anderen für mich nicht ganz richtig waren, weil sie:

  • müssen auf einem Server mit einem Domänennamen ausgeführt werden, z. gethostbyname() (wenn Sie darüber nachdenken, haben Sie eigentlich nicht das Problem, wenn Sie dies a priori kennen)
  • kann nicht auf der CLI verwendet werden (verlassen Sie sich auf etwas in $_SERVER, um von einem Webserver festgelegt zu werden)
  • es wird ein bestimmtes Format der ifconfig-Ausgabe angenommen, das mehrere nicht öffentliche Schnittstellen enthalten kann
  • verlassen Sie sich darauf, die Website einer anderen Person zu analysieren (wer kann verschwinden, die URL ändern, das Format ändern, anfangen, Sie anzulügen usw., alles ohne Vorankündigung) 

Das würde ich vorschlagen:

$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

Die IP-Adresse dort ist ein Google-öffentlicher DNS Server. Ich vertraue darauf, dass sie für eine Weile da sein werden. Es sollte eigentlich keine Rolle spielen, welche Adresse Sie dort verwenden, solange es sich um eine öffentliche IP-Adresse handelt, die jemandem gehört, der zufällige Verbindungsversuche nicht zu sehr interessiert (sich selbst vielleicht?). 

Dies basiert auf einer Antwort , auf die ich gestoßen bin, als ich in Python ein ähnliches Problem hatte.


P .: Ich bin nicht sicher, wie gut das funktioniert, wenn zwischen Ihrem Computer und dem Internet Zauberei herrscht.

5
jeteon

Sie könnten dies versuchen:

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

um die IP-Adresse Ihres Domain-Namens zu erhalten.

4
jakx

Ich weiß, dass diese Frage alt und lange beantwortet ist, aber ich googelte für dasselbe und möchte meinen eigenen "Hack" hinzufügen. Damit dies funktioniert, muss Ihr Webrequest von einer externen IP-Adresse stammen oder Sie müssen $own_url in eine URL ändern, die eine externe Anfrage an sich selbst stellt.

Der Punkt ist, wenn Sie das Skript eine Anfrage an sich selbst stellen lassen, als Sie seine externe IP-Adresse erhalten.

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

Sie können auch IP über DNS-A-Eintrag basierend auf dem Hostnamen oder dem Servernamen erhalten:

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

Sie können auch SERVER_NAME anstelle von HTTP_Host verwenden, wenn einer der beiden nicht das gibt, was Sie möchten.

Dies setzt jedoch voraus, dass Ihr Server in Übereinstimmung mit DNS korrekt konfiguriert ist. Dies kann nicht immer der Fall sein. Siehe meine andere Antwort mit ifconfig, das ist vielleicht besser.

0
Arthur

Ich denke, es gibt viel Code für diese Dinge in anderen Antworten, aber meine Antwort ist kurz, aber Sie müssen einen Befehl in Shell ausführen, um die IP-Adresse zu erhalten.

aber es ist kurz und schnell, ich denke das ...

pHP ausführen bash> bash run> bash get ip> php get ip 

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

Sorry mein für mein Englisch, ich hoffe es hilft euch allen ...

Referenz: Wie erhalte ich meine externe IP-Adresse in einem Shell-Skript?

0
DarckBlezzer

Vorausgesetzt, dass Ihr PHP auf einem Linux-Server läuft, können Sie ifconfig mit der exec-Funktion von PHP aufrufen. Dadurch erhalten Sie öffentliche IP-Adressen, ohne dass Sie eine externe Website/einen externen Dienst kontaktieren müssen. Z.B.:

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

Beachten Sie, dass Sie manchmal als $ -Befehl den vollständigen Pfad von ifconfig angeben müssen. Sie können dies finden, indem Sie ausführen 

whereis ifconfig

von Shell Prompt. Außerdem sollte $ interface auf den Namen der Hauptnetzwerkschnittstelle Ihres Servers gesetzt werden, die eine Verbindung zum WAN hat.

Unter Windows können Sie natürlich etwas ähnliches tun, indem Sie ipconfig anstelle von ifconfig (und entsprechend angepasster regulärer Ausdruck) verwenden.

0
Arthur

Wenn Ihr Server über einen Domänennamen verfügt, können Sie einen Ping-Vorgang durchführen oder Folgendes verwenden:

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

Es wird Ihre äußere IP-Adresse zurückgegeben.

0
Codebeat