
Сценарий
У меня есть небольшой 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 в клиенте.