
Szenario
Ich habe ein kleines PHP-Skript auf einem Server, das die IP-Adresse jedes Clients, der es erreicht, wiedergibt, sodass die Adresse über die API zur MySQL-Remote-Hosts-Tabelle von cpanel hinzugefügt werden kann. Ich rufe dieses Skript mit IdHTTP1.Get() auf und übergebe die URL des Skripts. Ich teste dies, indem ich das Bitdefender-VPN verwende, um mir jedes Mal eine neue IP-Adresse zuzuweisen, bevor ich den Delphi-Code ausführe, um meine aktuelle IP-Adresse abzurufen. Der Code für das PHP-Skript und der Delphi-Aufrufcode sind unten aufgeführt.
Problem
Wenn ich das VPN öffne, um mir eine neue IP-Adresse zuzuweisen, und dann den Code ausführe, wird eine IPv6-Adresse zurückgegeben. Wenn ich den Code dann erneut ausführe, ohne das VPN zu trennen, d. h. ich habe immer noch dieselbe Adresse, erhalte ich beim zweiten Aufruf eine IPv4-Adresse. Bei jedem weiteren Ausführen des Codes erhalte ich wie erwartet dieselbe IPv4-Adresse.
Wenn ich das VPN schließe und es erneut öffne, um eine andere IP-Adresse zu erhalten, passiert dasselbe. Das heißt, wenn ich den Code zum ersten Mal ausführe, erhalte ich eine IPv6-Adresse und die folgenden Male eine IPv4-Adresse.
zB Erstes Mal: 2a02:2498:e000:2001:8418:7195:9f43:a0f Zweites und alle weiteren Male: 88.202.181.53
Dieser Beitragerklärt, dass beide Adressformate zurückgegeben werden können, das Muster, das ich erhalte, jedoch recht konsistent zu sein scheint.
Frage
Gibt es eine Möglichkeit, den Code zu zwingen, immer eine IPv4-Adresse zurückzugeben? (Ohne dass mein Code wiederholt nach der Adresse fragt, bis er eine in IPv4 erhält)
zusätzliche Information
Dieser Beitragscheint auf eine Lösung anzuspielen, aber ich verstehe die akzeptierte Antwort nicht gut genug, um sie auf meinen Fall anzuwenden.
Diese Seite,https://www.ipify.org/Unter API-Nutzung wird gezeigt, wie ich meine IPv4- oder IPv6-Adresse erhalte mithttps://api.ipify.orgoderhttps://api64.ipify.orgalso sollte es möglich sein, in meinem Skript anzugeben, was ich möchte
myip.php-Code
<?php
$ip=$_SERVER['REMOTE_ADDR'];
echo $ip;
?>
Die Delphi-Funktion, die das PHP-Skript aufruft (IdHTTP1 ist eine Indy TIdHTTP-Komponente im Formular)
function TFrmMain.getmyipaddress: string;
var url : string;
begin
url := 'https://Thedomain.com/myip.php';
Result := '';
try
try
theip := IdHTTP1.Get(url);
Result := Trim(theip);
if result = '' then showmessage( 'Failed to get a sensible IP address from myip.php on server:');
finally
end;
except
on E: Exception do
ShowMessage('Failed to get IP address from myip.php on server:' +slinebreak +
e.Message);
end;
end;
Antwort1
ipify.org kann Ihnen nur Ihre IPv4- und Ihre IPv6-Adresse mitteilen, da es unterschiedliche Domänen für IPv6 und IPv4 gibt. Die Website unterhttps://www.ipify.org/wird mithilfe von JavaScript Anfragen an verschiedene Domänen stellen.
Eine HTTP-Anfrage kann entweder über IPv4 oder IPv6 gestellt werden und natürlich kennt der Webserver Ihre Verbindungs-IP-Adresse aus den TCP-Headern – schließlich sendet er seine Antwort dorthin. Es liegt am Client, ob er die HTTP-Anfrage über IPv4 oder IPv6 stellt, aber wenn die Domäne nur einen A- (IPv4) oder einen AAAA- (IPv6) Eintrag hat, hat der Client eigentlich keine Wahl.
Der Domänenname api6.ipify.org wird nur in IPv6-Adressen aufgelöst, api4.ipify.org nur in IPv4, daher kann ein Client niemals über IPv6 eine Verbindung zu api4.ipify.org herstellen und umgekehrt.
Wenn Ihr PHP-Skript immer die IPv4-Adresse des Clients zurückgeben soll, stellen Sie sicher, dass keine Verbindung über IPv6 hergestellt werden kann, indem Sie es auf einer Domäne hosten, die nur in eine IPv4-Adresse aufgelöst werden kann.
Antwort2
PHP $_SERVER['REMOTE_ADDR']
enthält die Remote-Adresse des Sockets, der für die Anforderung geöffnet ist. Es kann sich entweder um eine IPv4- oder eine IPv6-Adresse handeln, je nachdem, was der Client verwenden möchte.
Es gibt mehrere Kriterien, anhand derer der Client bei der Verbindung mit der Domäne entweder IPv4 oder IPv6 auswählen kann:
- Wenn der Client keine geeignete IPv6-Adresse hat, verwendet er IPv4 für die Kommunikation
- Wenn die Domäne keinen AAAA-Eintrag im DNS hat, verwendet der Client einen Eintrag, also IPv4
- Wenn der Client feststellt, dass es Probleme mit IPv6 gibt, greift er auf IPv4 zurück.
Wenn Sie also sicherstellen möchten, dass REMOTE_ADDR
immer eine IPv4-Adresse vorhanden ist, müssen Sie einen Domänennamen verwenden, der nur über einen A-Eintrag verfügt.
Wenn Sie Kontrolle über die Netzwerkverbindung des Clients haben, können Sie IPv6 im Client deaktivieren.