使用 PHP 計算 IPv6 反解位址

前言

身為一個網路玩家,會想要幫自己的 IP 加上他們各自的反解,這樣在進行路由追蹤的時候就可以更快速的知道哪個設備出了問題。但是 IPv6 的反解位址又臭又長,老實說我不是每次都很想在那邊慢慢用手算。因此,我在網路上找到了一個方法產生出來,這個方法是 PHP 語言的,剛好可以拿來結合 API 工作。因此這邊就提供這段程式碼。

了解反解位址

當你在進行路由追蹤的時候,你可以看到某些 IP 前面有各自的名字,例如 168.95.1.1 對應到 dns.hinet.net

001.jpg

但這背後所對應的 DNS 必須先翻譯成反解位址才會進行設定。例如剛剛的 168.95.1.1 反解位址就是 1.1.95.168.in-addr.arpa,你會注意到其實就是 IP 位址反過來寫,然後加上 in-addr.arpa 罷了。

但是在 IPv6 上,就不是這麼簡單了…。舉例 HiNet DNS 的 2001:b000:168::1,他的反解位址是 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.6.1.0.0.0.0.b.1.0.0.2.ip6.arpa。這樣子又臭又長的結果,你不會每次新增的時候都想用手算。

程式碼

由於我想要串上自己的 API,因此我在網路上找到了一段 PHP 程式碼來滿足我的需求。

<?php
    // 在 $ip 變數中輸入你想轉換的 IPv6 位址。
    $ip = '2001:b000:168::1';
    $addr = inet_pton($ip);
    $unpack = unpack('H*hex', $addr);
    $hex = $unpack['hex'];
    $arpa = implode('.', array_reverse(str_split($hex))) . '.ip6.arpa';
    echo $arpa;
?>

在上面的程式碼中,就會印出以下的結果:

1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.6.1.0.0.0.0.b.1.0.0.2.ip6.arpa

提供各位參考囉!