
대본
API를 통해 cpanel MySQL 원격 호스트 테이블에 주소를 추가할 수 있도록 서버에 도달하는 모든 클라이언트의 IP 주소를 에코하는 작은 PHP 스크립트가 있습니다. 나는 스크립트의 URL을 전달하는 IdHTTP1.Get()을 사용하여 이 스크립트를 호출합니다. 현재 IP 주소를 얻기 위해 델파이 코드를 실행하기 전에 Bitdefender VPN을 사용하여 매번 새 IP 주소를 제공함으로써 이를 테스트하고 있습니다. PHP 스크립트의 코드와 델파이 호출 코드는 다음과 같습니다.
문제
VPN을 열어 새 IP 주소를 부여한 다음 코드를 실행하면 IPv6 주소가 반환됩니다. 그런 다음 VPN 연결을 끊지 않고 코드를 다시 실행하면 즉, 여전히 동일한 주소를 갖게 되며 두 번째 호출에서는 IPv4 주소를 얻게 됩니다. 이후에 코드를 실행할 때마다 예상한 대로 동일한 IPv4 주소를 얻습니다.
다른 IP 주소를 얻기 위해 VPN을 닫았다가 다시 열어도 같은 일이 발생합니다. 즉, 코드를 처음 실행할 때 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;
?>
PHP 스크립트를 호출하는 Delphi 함수(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는 IPv6와 IPv4에 대한 도메인이 다르기 때문에 IPv4와 IPv6 주소를 모두 알려줄 수 있습니다. 웹사이트:https://www.ipify.org/자바스크립트를 사용하여 다른 도메인에 요청을 보냅니다.
http 요청은 IPv4 또는 IPv6을 사용하여 이루어질 수 있으며 당연히 웹 서버는 TCP 헤더에서 연결 IP 주소를 알게 됩니다. 결국 TCP 헤더에서 응답을 보냅니다. IPv4 또는 IPv6를 통해 http 요청을 할지 여부를 결정하는 것은 클라이언트의 몫입니다. 그러나 도메인에 A(IPv4) 또는 AAAA(IPv6) 레코드만 있는 경우 클라이언트는 실제로 선택의 여지가 없습니다.
도메인 이름 api6.ipify.org는 IPv6 주소로만 확인되고, api4.ipify.org는 IPv4로만 확인되므로 클라이언트는 IPv6를 통해 api4.ipify.org에 연결할 수 없으며 그 반대의 경우도 마찬가지입니다.
PHP 스크립트가 항상 클라이언트의 IPv4 주소를 반환하도록 하려면 IPv4 주소로만 확인될 수 있는 도메인에 호스팅하여 IPv6을 통해 연결할 수 없는지 확인하세요.
답변2
PHP에는 $_SERVER['REMOTE_ADDR']
요청을 위해 열려 있는 소켓의 원격 주소가 포함되어 있습니다. 클라이언트가 사용하기로 선택한 항목에 따라 IPv4 또는 IPv6 주소가 될 수 있습니다.
클라이언트가 도메인에 연결할 때 IPv4 또는 IPv6을 선택하는 데는 몇 가지 기준이 있습니다.
- 클라이언트에 적합한 IPv6 주소가 없으면 통신에 IPv4를 사용합니다.
- 도메인에 DNS에 AAAA 레코드 레코드가 없으면 클라이언트는 A 레코드, 즉 IPv4를 사용합니다.
- 클라이언트가 IPv6에 문제가 있다고 판단하면 IPv4로 대체됩니다.
따라서 항상 IPv4 주소가 있는지 확인하려면 REMOTE_ADDR
A 레코드만 있는 도메인 이름을 사용해야 합니다.
클라이언트 네트워킹을 제어할 수 있는 경우 클라이언트에서 IPv6을 비활성화할 수 있습니다.