Как заставить сервер возвращать мой IP-адрес в формате IPv4, а не IPv6?

Как заставить сервер возвращать мой IP-адрес в формате IPv4, а не IPv6?

Сценарий

У меня есть небольшой PHP-скрипт на сервере, который отображает IP-адрес любого клиента, который к нему обращается, чтобы адрес можно было добавить в таблицу удаленных хостов MySQL cpanel через API. Я вызываю этот скрипт с помощью IdHTTP1.Get(), передавая URL-адрес скрипта. Я тестирую это, используя Bitdefender VPN, чтобы каждый раз получать новый IP-адрес перед запуском кода delphi для получения текущего IP-адреса. Код PHP-скрипта и код вызова delphi приведены ниже.

Проблема

Если я открою VPN, чтобы дать себе новый IP-адрес, а затем запущу код, он вернет адрес IPv6. Если я затем снова запущу код, не отключая VPN, т. е. у меня все еще будет тот же адрес, то при втором вызове я получу адрес IPv4. Каждый раз, когда я запускаю код, я получаю тот же адрес IPv4, как и ожидалось.

Если я закрою VPN и снова открою его, чтобы получить другой IP-адрес, произойдет то же самое. То есть, при первом запуске кода я получаю адрес IPv6, а при последующих запусках — адрес IPv4.

например, первый раз: 2a02:2498:e000:2001:8418:7195:9f43:a0f второй и последующие разы: 88.202.181.53

Эта почтаобъясняет, что может быть возвращен любой из форматов адреса, но шаблон, который я получаю, кажется вполне последовательным.

Вопрос

Есть ли способ заставить код всегда возвращать адрес IPv4? (Без повторного запроса кода на ввод адреса до тех пор, пока он не получит адрес IPv4)

Дополнительная информация

Эта почтакажется, намекает на решение, но я не настолько понимаю принятый ответ, чтобы применить его к своему случаю.

Эта страница,https://www.ipify.org/в разделе «Использование API» показано, как получить мой адрес IPv4 или IPv6 с помощьюhttps://api.ipify.orgилиhttps://api64.ipify.orgпоэтому должно быть возможно сказать, что я хочу в своем сценарии

код myip.php

<?php
$ip=$_SERVER['REMOTE_ADDR'];
echo $ip;
?>

Функция Delphi, которая вызывает PHP-скрипт (IdHTTP1 — компонент Indy TIdHTTP на форме)

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;

решение1

ipify.org может сообщить вам только ваш IPv4 и ваш IPv6 адрес, поскольку у него разные домены для IPv6 и IPv4. Сайт по адресуhttps://www.ipify.org/будет делать запросы к разным доменам с использованием JavaScript.

Запрос http можно сделать с использованием как IPv4, так и IPv6, и, естественно, веб-сервер узнает ваш подключающийся IP-адрес из заголовков TCP — в конце концов, именно туда он отправляет свой ответ. Клиент сам решает, сделать ли запрос http через IPv4 или IPv6, но если домен имеет только запись A (IPv4) или AAAA (IPv6), у клиента на самом деле нет выбора.

Доменное имя api6.ipify.org разрешается только в адреса IPv6, api4.ipify.org — только в адреса IPv4, поэтому клиент никогда не сможет подключиться к api4.ipify.org через IPv6 и наоборот.

Если вы хотите, чтобы ваш PHP-скрипт всегда возвращал IPv4-адрес клиента, убедитесь, что к нему нельзя подключиться по IPv6, разместив его на домене, который может быть разрешен только в IPv4-адрес.

решение2

PHP's $_SERVER['REMOTE_ADDR']содержит удаленный адрес сокета, который открыт для выполнения запроса. Это может быть адрес IPv4 или IPv6, в зависимости от того, что выбрал клиент.

Существует несколько критериев, по которым клиент может выбрать IPv4 или IPv6 при подключении к домену:

  • Если у клиента нет подходящего адреса IPv6, он использует IPv4 для связи.
  • Если домен не имеет записи AAAA в DNS, клиент будет использовать запись A, то есть IPv4.
  • Если клиент определит, что с IPv6 возникли проблемы, он вернется к IPv4.

Таким образом, если вы хотите быть уверены, что REMOTE_ADDRу вас всегда будет адрес IPv4, вам нужно использовать доменное имя, которое имеет только запись A.

Если у вас есть контроль над сетевым подключением клиента, то вы можете отключить IPv6 в клиенте.

Связанный контент