将IPV6转换为半字节格式以用于PTR记录

时间:2011-07-08 03:27:11

标签: php dns reverse-dns pointers

我需要将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。

关于半字节我唯一能找到的就是包函数http://www.php.net/pack。我用谷歌搜索问题的例子找不到任何解决方案。

非常感谢任何帮助。

5 个答案:

答案 0 :(得分:12)

给出适当的现代版本的PHP(在Windows上为> = 5.1.0或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';

答案 1 :(得分:3)

您可以使用here中的ipv6calc命令(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

答案 2 :(得分:2)

这是基于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;
}

答案 3 :(得分:0)

我这样做:

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";
}

答案 4 :(得分:-1)

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