如何強制伺服器以 IPv4 而不是 IPv6 傳回我的 IP 位址?

如何強制伺服器以 IPv4 而不是 IPv6 傳回我的 IP 位址?

設想

我在伺服器上有一個微小的 PHP 腳本,它會回顯任何到達它的客戶端的 IP 位址,以便可以透過 API 將位址新增到 cpanel MySQL 遠端主機表中。我使用 IdHTTP1.Get() 傳遞腳本的 url 來呼叫此腳本。我正在透過使用 Bitdefender VPN 來測試這一點,每次運行 delphi 程式碼以獲取當前 IP 位址之前都會給我一個新的 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;
?>

呼叫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 只能告訴您 IPv4 和 IPv6 位址,因為它具有不同的 IPv6 和 IPv4 網域。網站位於https://www.ipify.org/將使用 javascript 向不同的網域發出請求。

可以使用 IPv4 或 IPv6 發出 http 請求,網路伺服器自然會從 TCP 標頭中知道您的連接 IP 位址 - 畢竟,這是它發送回應的地方。由客戶端決定是透過 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

因此,如果要確保REMOTE_ADDR始終具有 IPv4 位址,則需要使用僅具有 A 記錄的網域名稱。

如果您可以控制用戶端的網絡,則可以在用戶端中停用 IPv6。

相關內容