Como forçar um servidor a retornar meu endereço IP em IPv4 e não em IPv6?

Como forçar um servidor a retornar meu endereço IP em IPv4 e não em IPv6?

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

Esta postagemparece aludir a uma solução, mas 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 usandohttps://api.ipify.orgouhttps://api64.ipify.orgentão deveria ser possível dizer o que eu 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;

Responder1

ipify.org só pode informar seu endereço IPv4 e IPv6 porque possui domínios diferentes para IPv6 e IPv4. O site emhttps://www.ipify.org/fará solicitações para domínios diferentes 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.

Responder2

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:

  • Se o cliente não tiver um endereço IPv6 adequado, ele usará IPv4 para comunicação
  • Caso o domínio não possua registro AAAA no DNS, o cliente utilizará registro A, ou seja IPv4
  • Se o cliente determinar que há problemas com IPv6, ele voltará para IPv4

Portanto, se você quiser garantir que REMOTE_ADDRsempre 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.

informação relacionada