Конвертировать IPV6 в формат Nibble для записей PTR - PullRequest
7 голосов
/ 08 июля 2011

Мне нужно преобразовать адрес ipv6 в его формат nibble для использования при динамическом создании записей ptr. Вот информация, которую я получил из Википедии:

IPv6 обратное разрешение

Обратный поиск DNS для адресов IPv6 используйте специальный домен ip6.arpa. IPv6-адрес отображается как имя в этом домен как последовательность откусываний в обратный порядок, представленный в виде шестнадцатеричные цифры в качестве поддоменов. За Например, указатель доменного имени соответствует адресу IPv6 2001: db8 :: 567: 89ab is 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.

Единственное, что я смог найти в отношении клевов, было в функции pack, http://www.php.net/pack. Я не смог найти никаких решений с примерами из поиска этой проблемы.

Любая помощь очень ценится.

Ответы [ 5 ]

12 голосов
/ 08 июля 2011

Учитывая соответствующую современную версию PHP (> = 5.1.0 или 5.3+ в Windows), используйте функцию 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';
3 голосов
/ 11 января 2012

Вы можете использовать инструмент строки 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 голосов
/ 16 сентября 2011

И это наоборот, основанный на великолепном коде Альнитака, в виде функции:

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;
}
0 голосов
/ 10 апреля 2015

Я делаю это:

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";
}
0 голосов
/ 08 июля 2011

Итак, из этого примера вы можете видеть, что формат клева - это полный адрес ipv6 (включая поля 0), обратный, затем разделенный на символы и разделенный точками.Лично я бы просто использовал строковое представление и манипулировал им по мере необходимости.

...