【问题标题】:Convert IPV6 to nibble format for PTR records将 IPV6 转换为 PTR 记录的半字节格式
【发布时间】:2011-07-08 03:27:11
【问题描述】:

我需要将 ipv6 地址转换为它的半字节格式,以用于动态创建 ptr 记录。以下是我从维基百科得到的信息:

IPv6 反向解析

IPv6 地址的反向 DNS 查找 使用特殊域 ip6.arpa。一个 IPv6 地址在此显示为名称 域作为半字节的序列 逆序,表示为 十六进制数字作为子域。为了 例如,指针域名 对应于 IPv6 地址 2001:db8::567:89ab 是 b.a.9.8.7.6.5.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa.

我唯一能找到的关于 nibbles 的内容是在 pack 函数中,http://www.php.net/pack。我无法通过谷歌搜索问题找到任何解决方案。

非常感谢任何帮助。

【问题讨论】:

    标签: php dns reverse-dns pointers


    【解决方案1】:

    给定一个合适的现代 PHP 版本(>= 5.1.0,或在 Windows 上为 5.3+),使用 inet_pton 函数将 IPv6 地址解析为 16 字节数组,然后使用标准字符串操作来反转它.

    $ip = '2001:db8::567:89ab';
    $addr = inet_pton($ip);
    $unpack = unpack('H*hex', $addr);
    $hex = $unpack['hex'];
    $arpa = implode('.', array_reverse(str_split($hex))) . '.ip6.arpa';
    

    【讨论】:

      【解决方案2】:

      您可以使用来自hereipv6calc 命令 (UNIX/Linux) 行工具。

      例如:

      $ ./ipv6calc --out revnibbles.arpa 2001:db8::1
      No input type specified, try autodetection...found type: ipv6addr
      1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa.
      

      您可以嵌入这是一个脚本来您的前向区域文件并创建PTRs

      【讨论】:

        【解决方案3】:

        这是相反的,基于 Alnitak 的伟大代码,以函数的形式:

        function ptr_to_ipv6($arpa) {
            $mainptr = substr($arpa, 0, strlen($arpa)-9);
            $pieces = array_reverse(explode(".",$mainptr));  
            $hex = implode("",$pieces);
            $ipbin = pack('H*', $hex);
            $ipv6addr = inet_ntop($ipbin);
        
            return $ipv6addr;
        }
        

        【讨论】:

          【解决方案4】:

          我这样做:

          function expand($ip){
              $hex = unpack("H*hex", inet_pton($ip));
              $ip = substr(preg_replace("/([A-f0-9]{4})/", "$1:", $hex['hex']), 0, -1);
              return $ip;
          }
          
          function ipv6_reverse_calc($address){
            $rev = chop(chunk_split(strrev(str_replace(':', '', expand($address))), 1, '.'), '.');
            return "$rev.ip6.arpa";
          }
          

          【讨论】:

            【解决方案5】:

            嗯,从那个例子中,你可以看到半字节格式是完整的 ipv6 地址(包括 0 字段),反转,然后分成字符并用句点分隔。所以就个人而言,我只会使用字符串表示并根据需要对其进行操作。

            【讨论】:

            • 解析缩写的 IPv6 地址并非易事 - 最好将其留给专为实现此目的而设计的库函数。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-11-06
            • 2021-08-09
            • 1970-01-01
            • 1970-01-01
            • 2013-07-26
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多