Cenário
Eu tenho um pequeno script PHP em um servidor que ecoa o endereço IP de qualquer cliente que o acessa, para que o endereço possa ser adicionado à tabela de hosts remotos do cpanel MySQL por meio da API. Eu chamo esse script usando IdHTTP1.Get() passando a url do script. Estou testando isso usando a VPN do Bitdefender para me fornecer um novo endereço IP sempre antes de executar o código Delphi para obter meu endereço IP atual. O código para o script PHP e o código de chamada do Delphi estão abaixo.
Problema
Se eu abrir a VPN para obter um novo endereço IP e, em seguida, executar o código, ele retornará um endereço IPv6. Se eu executar o código novamente, sem desconectar a VPN, ou seja, ainda tenho o mesmo endereço, na segunda chamada recebo um endereço IPv4. Cada vez que executo o código, obtenho o mesmo endereço IPv4, como seria de esperar.
Se eu fechar a VPN e abri-la novamente para obter um endereço IP diferente, acontece a mesma coisa. ou seja, na primeira vez que executo o código, obtenho um endereço IPv6 e nas vezes subsequentes, obtenho um endereço IPv4
por exemplo, primeira vez: 2a02:2498:e000:2001:8418:7195:9f43:a0f Segunda vez e vezes subsequentes: 88.202.181.53
Esta postagem explica que qualquer formato de endereço pode ser retornado, mas o padrão que estou obtendo parece bastante consistente.
Pergunta
Existe uma maneira de forçar o código a sempre retornar um endereço IPv4? (Sem que meu código peça repetidamente o endereço até conseguir um em IPv4)
informação adicional
Este post parece aludir a uma solução, mas eu realmente não entendo a resposta aceita o suficiente para aplicá-la ao meu caso.
Esta página, https://www.ipify.org/ em uso de API, mostra como obter meu endereço IPv4 ou IPv6 usando https://api.ipify.org ou https://api64.ipify.org para que seja possível dizer o que quero no meu script
código meuip.php
<?php
$ip=$_SERVER['REMOTE_ADDR'];
echo $ip;
?>
A função Delphi que chama o script PHP (IdHTTP1 é um componente Indy TIdHTTP no formulário)
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;
ipify.org só pode informar seu endereço IPv4 e IPv6 porque possui domínios diferentes para IPv6 e IPv4. O site https://www.ipify.org/ fará solicitações para diferentes domínios usando javascript.
Uma solicitação http pode ser feita usando IPv4 ou IPv6 e, naturalmente, o servidor web saberá o endereço IP de sua conexão a partir dos cabeçalhos TCP - afinal, é para lá que ele envia sua resposta. Cabe ao cliente decidir se deseja fazer a solicitação http via IPv4 ou IPv6, mas se o domínio tiver apenas um registro A (IPv4) ou AAAA (IPv6), o cliente realmente não tem escolha.
O nome de domínio api6.ipify.org só é resolvido para endereços IPv6, api4.ipify.org apenas para IPv4, portanto, um cliente nunca pode se conectar a api4.ipify.org via IPv6 e vice-versa.
Se você deseja que seu script php sempre retorne o endereço IPv4 do cliente, certifique-se de que ele não possa ser conectado via IPv6 hospedando-o em um domínio que só pode ser resolvido para um endereço IPv4.
O PHP
$_SERVER['REMOTE_ADDR']
contém o endereço remoto do soquete que está aberto para fazer a solicitação. Pode ser um endereço IPv4 ou IPv6, dependendo do que o cliente escolheu usar.Existem vários critérios para o cliente selecionar IPv4 ou IPv6 ao se conectar ao domínio:
Portanto, se você quiser garantir que
REMOTE_ADDR
sempre tenha um endereço IPv4, você precisa usar um nome de domínio que tenha apenas um registro A.Se você tiver controle sobre a rede do cliente, poderá desabilitar o IPv6 no cliente.