version 0.0.12
Переходим с IPv4 на IPv6
На примере локальной сети.
Многие наверняка уже знают что такое IPv6, зачем он нужен, и когда заработает в полную силу. Я решил не оставаться в стороне от этого события и даже немного опередить его.
Сегодня некоторые провайдеры уже предоставляют доступ по IPv6, однако большинство предпочитает дожидаться "жареного петуха".
Для тех, кто не знает что такое IPv6, рекомендую заглянуть хотя бы в Википедию.
Итак начнём.
Действующие лица: PC-марштуизатор на Ubuntu 10.04 с поддержкой IPv6, туннельный брокер, radvd (bird, dnsmasq), bind9 (totd), dhcp 4.0 (dnsmasq), tayga, статический внешний IPv4-адрес.
Вот примерно так выглядит сеть.
__________________ ____________________
/ \ / \
| IPv4 Internet | | IPv6 Internet |
\__________________/ \____________________/
\ /
\ /
\ /
_\_____________________/_
/ \
| IPv6+IPv4 Маршутизатор |
\__________________________/
|
|
|
_______|________
/ \
| Наша IPv6 сеть |
\________________/
I. Туннельный брокер
Первый шаг, который необходимо сделать - зарегистрировать и создать туннель, с маршрутизируемой routed/48 сетью.
Для России можно воспользоваться этим брокером.
http://ipv6.ip4market.ru/ г. Москва.
Для Украины.
http://tb.netassist.ua г.Киев.
 | Server IPv4 address - адрес брокера Client IPv4 address - мой статический внешний IP Server IPv6 address - IPv6-адрес на конце туннеля брокера Client IPv6 address - IPv6-адрес на нашем конце туннеля Routed /48 IPv6 network - Маршрутизируемая IPv6-сеть. Можно сказать моя 
|
В итоге в /etc/network/interfaces случилась следующая запись:
auto na0
iface na0 inet6 v4tunnel
address 2a01:d0:ffff:124::2
netmask 64
gateway 2a01:d0:ffff:124::1
endpoint 62.205.132.12
local 1.1.1.1
ttl 255
up ip l s dev $IFACE mtu 1280
post-down ip tunnel del $IFACE
Как результат в ifconfig появился псевдо-интерфейс na0:
@localhost:~$ ifconfig na0
na0 Link encap:IPv6-in-IPv4
inet6 addr: fe80::d58d:8829/128 Scope:Link
inet6 addr: 2a01:d0:ffff:124::2/64 Scope:Global
UP POINTOPOINT RUNNING NOARP MTU:1280 Metric:1
RX packets:547813 errors:0 dropped:0 overruns:0 frame:0
TX packets:898840 errors:21 dropped:0 overruns:0 carrier:21
collisions:0 txqueuelen:0
RX bytes:49542195 (49.5 MB) TX bytes:955494086 (955.4 MB)
@localhost:~$
Можно проверить работу:
@localhost:~$ ping6 -n -c4 ipv6.yandex.ru
PING ipv6.yandex.ru(2a02:6b8:0:261::1) 56 data bytes
64 bytes from 2a02:6b8:0:261::1: icmp_seq=1 ttl=58 time=105 ms
64 bytes from 2a02:6b8:0:261::1: icmp_seq=2 ttl=58 time=104 ms
64 bytes from 2a02:6b8:0:261::1: icmp_seq=3 ttl=58 time=104 ms
64 bytes from 2a02:6b8:0:261::1: icmp_seq=4 ttl=58 time=104 ms
--- ipv6.yandex.ru ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3003ms
rtt min/avg/max/mdev = 104.092/104.765/105.885/0.746 ms
@localhost:~$
С почином! Доступ к IPv6-интернету есть.
II. Router advertisement ( radvd | bird ) и sysctl.conf
Следующим шагом для достижения моей цели было конфигурирование параметров ядра, интерфейса IPv6 для локальной сети, установка и настройка RA.
Разрешаю форвадинг IPv6 пакетов:
sudo -s
echo -e "net.ipv6.conf.all.forwarding = 1\nnet.ipv6.conf.default.forwarding = 1" >> /etc/sysctl.conf
sysctl -p
Конфигурирую интерфейс локальной сети, у меня он обзывается vlan8, у вас может быть другим. Необходимо отметить небольшой ньюанс, для верной работы RA в режиме SLAAC (Stateless Address Autoconfiguration), маска локальной подсети обязательно должна быть равна /64. Я взял первую routed64 подсеть из моей routed48-сети.
Т.е если есть моя routed48 сеть:
2a01:00d0:8124:0000:0000:0000:0000:0000 - 2a01:00d0:8124:ffff:ffff:ffff:ffff:ffffТогда первая routed64:
2a01:00d0:8124:0000:0000:0000:0000:0000 - 2a01:00d0:8124:0000:ffff:ffff:ffff:ffff/etc/network/interfaces
auto vlan8
iface vlan8 inet6 static
address 2a01:d0:8124::1
netmask 64
vlan-raw-device eth0
Можно проверить:
@localhost:~$ ifconfig vlan8
vlan8 Link encap:Ethernet HWaddr 70:71:bc:d5:37:00
inet6 addr: fe80::7271:bcff:fed5:3700/64 Scope:Link
inet6 addr: 2a01:d0:8124::1/64 Scope:Global
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:12558 errors:0 dropped:0 overruns:0 frame:0
TX packets:12670 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:3004490 (3.0 MB) TX bytes:4360278 (4.3 MB)
@localhost:~$
Устанавливаем radvd:
sudo aptitude install radvd
И настраиваем:
/etc/radvd.conf
interface vlan8 {
AdvSendAdvert on;
AdvOtherConfigFlag on;
AdvManagedFlag off;
AdvLinkMTU 1280;
MinRtrAdvInterval 30;
MaxRtrAdvInterval 100;
prefix 2a01:d0:8124::/64
{
AdvOnLink on;
AdvAutonomous on;
AdvRouterAddr on;
};
RDNSS 2a01:d0:8124::1;
{
};
};
Берём последнюю версию с сайта разработчиков
http://bird.network.cz/ или с launchpad
apt-add-repository ppa:cz.nic-labs/bird
apt-get update
apt-get install bird
И приводим /etc/bird6.conf примерно к следующему виду
router id 192.168.10.1;
protocol device {
scan time 20;
primary "vlan8" 2a01:d0:8124::1;
};
protocol radv {
interface "vlan8";
rdnss 2001:4860:4860::8888;
};
Необходимо дать некоторые пояснения относительно параметра RDNSS - этот параметр отвечает за передачу адреса DNS для Linux-хостов, на которых установлен rdnssd, для Windows нужен DHCP, ну или руками выставлять сетевые реквизиты, что, как нетрудно догадаться, задача в IPv6 сетях тривиальная.
III. DHCP
Поддержка IPv6 в ISC DHCP появилась с версии 4.0.
В более младших дистрибутивах UBUNTU DCHP 4.0 включен в состав, мне же пришлось бэкпортировать сервер на 10.04 и изменить startup-скрипт для запуска DHCP в IPv6-режиме. Ниже представлю небольшой патч:
--- /etc/init.d/isc-dhcp-server 2013-02-11 14:34:56.633980586 +0400
+++ /etc/init.d/isc-dhcp-server-ipv6 2013-02-11 14:57:39.537930379 +0400
@@ -17,11 +17,11 @@
PATH=/sbin:/bin:/usr/sbin:/usr/bin
# Default config file
-CONFIG_FILE=/etc/dhcp/dhcpd.conf
+CONFIG_FILE=/etc/dhcp/dhcpd6.conf
# Allow ltsp to override
-if [ -f /etc/ltsp/dhcpd.conf ]; then
- CONFIG_FILE=/etc/ltsp/dhcpd.conf
+if [ -f /etc/ltsp/dhcpd6.conf ]; then
+ CONFIG_FILE=/etc/ltsp/dhcpd6.conf
fi
test -f /usr/sbin/dhcpd || exit 0
@@ -37,18 +37,18 @@
# Read init script configuration (so far only interfaces the daemon
# should listen on.)
-[ -f /etc/default/isc-dhcp-server ] && . /etc/default/isc-dhcp-server
+[ -f /etc/default/isc-dhcp-server-ipv6 ] && . /etc/default/isc-dhcp-server-ipv6
NAME=dhcpd
-DESC="ISC DHCP server"
-DHCPDPID=/var/run/dhcp-server/dhcpd.pid
+DESC="ISC DHCPv6 server"
+DHCPDPID=/var/run/dhcp-server/dhcpd6.pid
test_config()
{
- if ! /usr/sbin/dhcpd -t -q -cf $CONFIG_FILE > /dev/null 2>&1; then
+ if ! /usr/sbin/dhcpd -6 -t -q -cf $CONFIG_FILE > /dev/null 2>&1; then
echo "dhcpd self-test failed. Please fix the config file."
echo "The error was: "
- /usr/sbin/dhcpd -t -cf $CONFIG_FILE
+ /usr/sbin/dhcpd -6 -t -cf $CONFIG_FILE
exit 1
fi
}
@@ -77,14 +77,14 @@
# allow dhcp server to write lease and pid file
mkdir -p /var/run/dhcp-server
chown dhcpd:dhcpd /var/run/dhcp-server
- [ -e /var/lib/dhcp/dhcpd.leases ] || touch /var/lib/dhcp/dhcpd.leases
- chown dhcpd:dhcpd /var/lib/dhcp /var/lib/dhcp/dhcpd.leases
- if [ -e /var/lib/dhcp/dhcpd.leases~ ]; then
- chown dhcpd:dhcpd /var/lib/dhcp/dhcpd.leases~
+ [ -e /var/lib/dhcp/dhcpd6.leases ] || touch /var/lib/dhcp/dhcpd6.leases
+ chown dhcpd:dhcpd /var/lib/dhcp /var/lib/dhcp/dhcpd6.leases
+ if [ -e /var/lib/dhcp/dhcpd6.leases~ ]; then
+ chown dhcpd:dhcpd /var/lib/dhcp/dhcpd6.leases~
fi
start-stop-daemon --start --quiet --pidfile $DHCPDPID \
- --exec /usr/sbin/dhcpd -- -q -pf $DHCPDPID -cf $CONFIG_FILE $INTERFACES
+ --exec /usr/sbin/dhcpd -- -q -pf $DHCPDPID -6 -cf $CONFIG_FILE $INTERFACES
sleep 2
if check_status -q; then
Следует скопировать /etc/default/isc-dhcp-server в /etc/default/isc-dhcp-server-ipv6, и указать интерфейс, который будетслушать DHCPv6-сервер.
Смысл использования DHCP 4.0 прост. Как известно, в Майкрософте читают RFC по-своему, и только для передачи Windows-хостам адреса DNS-сервера нужен DHCP, поэтому я указал одну единственную опцию - передачу DNS.
/etc/dhcp/dhcpd.conf
ddns-update-style interim;
default-lease-time 43200;
max-lease-time 86400;
log-facility local7;
subnet6 2a01:d0:8124::/64 {
option dhcp6.name-servers 2a01:d0:8124::1;
}
Основная задача по конфигурированию IPv6 сети сделана. Но нашей сети будет доступен только IPv6 интернет, а что же делать с IPv4?
IV. Tayga (NAT64)
Официальная станица проекта -
http://www.litech.org/tayga/В кратце этот демон транслирует IPv4 в IPv6. Для настройки мне нужно было выделить еще одну подсеть из моей routed48-сети, но с маской /96 - туда аккурат влезает весь IPv4-интернет. Я взял 2a01:d0:8124:2:ffff::/96
Конфигурация выглядит следующим образом:
/etc/tayga.conf
tun-device nat64 # Интерфейс транслирования IPv4 в IPv6
ipv4-addr 192.168.255.1 # Адрес IPv4 для NAT
ipv6-addr 2a01:d0:8124::2 # Адрес IPv6 для NAT64
prefix 2a01:d0:8124:2:ffff::/96 # Сеть для трансляции IPv4 в IPv6
dynamic-pool 192.168.255.0/24 # Сеть IPv4 для NAT
data-dir /var/spool/tayga # Файлы с данными
Также небходимо добавить правило NAT iptables для NAT64:
iptables -t nat -A POSTROUTING -s 192.168.255.0/24 -j MASQUERADE
Так как для Ubuntu нет собранных пакетов, то вполне можно занять их у папаши Debian'а
http://packages.debian.org/sid/tayga - init-скрипт сам добавит NAT
Или собрать самому.
Проверяю работу:
@localhost:~$ ifconfig nat64
nat64 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:8529 errors:0 dropped:0 overruns:0 frame:0
TX packets:8529 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:500
RX bytes:4359464 (4.3 MB) TX bytes:4336364 (4.3 MB)
@localhost:~$
C:\>tracert 2a01:d0:8124:2:ffff::212.1.224.34
Трассировка маршрута к 2a01:d0:8124:2:ffff:0:d401:e022 с максимальным числом прыжков
1 <1 мс <1 мс <1 мс 2a01:d0:8124::1
2 <1 мс <1 мс <1 мс 2a01:d0:8124::2
3 * * * Превышен интервал ожидания для запроса.
4 <1 мс 1 ms <1 мс 2a01:d0:8124:2:ffff:0:d401:fe73
5 <1 мс <1 мс <1 мс 2a01:d0:8124:2:ffff:0:d401:fc21
6 1 ms 1 ms 1 ms 2a01:d0:8124:2:ffff:0:d401:fbb2
7 1 ms 1 ms 1 ms 2a01:d0:8124:2:ffff:0:d401:e022
Трассировка завершена.
C:\>
Видно, что 2a01:d0:8124:2:ffff: это моя сеть, а 0:d401:e022 - это преобразованный в часть ipv6-адреса - 212.1.224.34.
Как же быть с именами?
V. DNS. Bind9 или totd
totd - маленький dns64-форвадер, преобразует FQDN в ipv6 адреса заданной подсети. Есть в репазитарии. Чрезвычайно прост.
/etc/totd.conf
forwarder 212.1.224.34 port 53 # Откуда брать имена
prefix 2a01:d0:8124:2:ffff:: # NAT64 - подсеть
port 53 # Какой порт слушать
pidfile /var/run/totd.pid
interfaces lo vlan6 # Какие интерфейсы слушать
Bind9 - знаменитый DNS-сервер, ньюанс заключается в том, что функция dns64 в нем появилась с версии 9.8.0, поэтому опять пришлось заниматься бэкпортированием на 10.04
Настройка dns64 сводится к тому, что в опцию добавляется следующее:
/etc/bind/named.conf.options
options {
// Skip
dns64 2a01:d0:8124:2:ffff::/96 // Моя NAT64 - подсеть
{
clients { 2a01:d0:8124::/64; }; // Моя routed64 подсеть
};
// Skip
};
VI. DNSmasq. (вместо пунктов II, III, и частично V)
Что же, тем кому знаком этот сервер, приятно будет узнать, что он вполне себе может работать как RouterAdvertisement, DHCPv6, и кеширующий DNS, правда использовать его пока можно в первых двух эпостасиях, (функция dns64 ему пока не доступна). Испробовано на v2.62. Пример конфигурации /etc/dnsmasq.conf
port=0
enable-ra
# конфигурация dhcp6
dhcp-range=2a01:d0:8124::2, 2a01:d0:8124::ffff, 64, 12h
dhcp-option=option6:dns-server,[2a01:d0:8124::1]
# конфигурация SLAAC
dhcp-range=2a01:d0:8124::2, 2a01:d0:8124::ffff:ffff, slaac, 64, 12h
Примечание: Для корректной работы в сетях ipv6, с DHCPv6-сервером, версия dhclient должна быть >= 4.1. Такая версия dhclient поставляется с дистрибутивом Ubuntu 11.10 и младше.
VII. Заключение
Этот мини-ЧаВо не претеднует на пошаговое действие, он лишь пытается объяснить принцип настройки оборудования для небольшой сети, предоставив возможность перейти на IPv6.
Так сейчас выглядит хост в этой сети, с которого и был написан этот пост.
C:\>ipconfig -all
Настройка протокола IP для Windows
Имя компьютера . . . . . . . . . : workstation
Основной DNS-суффикс . . . . . . :
Тип узла. . . . . . . . . . . . . : Смешанный
IP-маршрутизация включена . . . . : Нет
WINS-прокси включен . . . . . . . : Нет
Порядок просмотра суффиксов DNS . : linux.lan
Ethernet adapter Подключение по локальной сети 2:
DNS-суффикс подключения . . . . . :
Описание. . . . . . . . . . . . . : Microsoft Windows Mobile Remote Adapter
Физический адрес. . . . . . . . . : 80-00-60-0F-E8-00
DHCP включен. . . . . . . . . . . : Да
Автонастройка включена. . . . . . : Да
IPv4-адрес. . . . . . . . . . . . : 169.254.2.2(Основной)
Маска подсети . . . . . . . . . . : 255.255.255.0
Аренда получена. . . . . . . . . . : 16 марта 2012 г. 11:10:58
Срок аренды истекает. . . . . . . . . . : 15 апреля 2012 г. 11:10:58
Основной шлюз. . . . . . . . . :
DHCP-сервер. . . . . . . . . . . : 169.254.2.1
NetBios через TCP/IP. . . . . . . . : Включен
Ethernet adapter Подключение по локальной сети:
DNS-суффикс подключения . . . . . : linux.lan
Описание. . . . . . . . . . . . . : NVIDIA nForce 10/100/1000 Mbps Ethernet
Физический адрес. . . . . . . . . : F4-6D-04-94-C8-1D
DHCP включен. . . . . . . . . . . : Да
Автонастройка включена. . . . . . : Да
IPv6-адрес. . . . . . . . . . . . : 2a01:d0:8124:0:183c:3cb0:45c3:38d6(Основной)
Локальный IPv6-адрес канала . . . : fe80::183c:3cb0:45c3:38d6%11(Основной)
Основной шлюз. . . . . . . . . : fe80::7271:bcff:fed5:3700%11
IAID DHCPv6 . . . . . . . . . . . : 250899716
DUID клиента DHCPv6 . . . . . . . : 00-01-00-01-15-BC-2F-8E-F4-6D-04-94-C8-1D
DNS-серверы. . . . . . . . . . . : 2a01:d0:8124::1
NetBios через TCP/IP. . . . . . . . : Отключен
C:\>tracert forum.ubuntu.ru
Трассировка маршрута к forum.ubuntu.ru [2a01:d0:8124:2:ffff:0:d56c:fc99]
с максимальным числом прыжков 30:
1 <1 мс <1 мс <1 мс ipv6-gw.linux.lan [2a01:d0:8124::1]
2 <1 мс <1 мс <1 мс nat64.linux.lan [2a01:d0:8124::2]
3 <1 мс <1 мс <1 мс 2a01:d0:8124:2:ffff:0:1f82:2702
4 1 ms <1 мс <1 мс 2a01:d0:8124:2:ffff:0:1f82:2701
5 <1 мс <1 мс <1 мс 2a01:d0:8124:2:ffff:0:1f82:27fe
6 <1 мс <1 мс <1 мс 2a01:d0:8124:2:ffff:0:d56d:1ffb
7 <1 мс <1 мс <1 мс 2a01:d0:8124:2:ffff:0:c0a8:c8fd
8 1 ms 1 ms 1 ms vl-989.br1.msk1.ip.di-net.ru [2a01:d0:8124:2:ffff:0:c1e8:f458]
9 1 ms 1 ms 1 ms vl-711.br2.msk1.ip.di-net.ru [2a01:d0:8124:2:ffff:0:d5f8:388]
10 2 ms 2 ms 1 ms te1-4.sr3.msk7.ip.di-net.ru [2a01:d0:8124:2:ffff:0:d5f8:3bf]
11 2 ms 2 ms 2 ms 2a01:d0:8124:2:ffff:0:59d0:883e
12 3 ms 2 ms 2 ms s2.ubuntu.ru [2a01:d0:8124:2:ffff:0:d56c:fc99]
Трассировка завершена.
C:\>
В более новых дистрибутивах наверняка нет проблем с бэкпортированием и все необходимые пакеты, надеюсь, будут присутствовать в репозитарии.
Трудности, которые могут возникнуть в работе IPv6-сети, связаны с программным обеспечением, которое до сих пор не научилась работать с протоколом новой версии, такие, как например как Skype и операционных систем Microsoft старше Windows Vista, которые не могут полностью отказаться от IPv4, из-за проблем с DNS. (опять привет Microsoft'у).
Спасибо за внимание!
Добавлено (09.IX.2013): Поинтересуйтесь у провайдера, в доступности протокола 41 абонентам, как выяснилось, некоторые провайдеры могут блокировать его.
VIII Эпилог. PREFIX DELEGATION. DHCPv6-PD
Что это такое и зачем оно нужно.
Prefix Delegation (далее PD) — это совокупность условий при котором абонентскому маршрутизатору выделяется собственная подсеть, машрутизируемая в Интернет.
Сразу хочу отметить, что механизм работы похожий на PD можно получить и в ipv4, в ipv6 PD является частью сетевого протокола.
В кратце, как это выглядит:
- Абонентский маршутизатор формирует dhcpv6 пакет с запросом на PD.
- Провайдерский dhcpv6-сервер отвечает пакетом, в котором содержится информация о выделяемой подсети, посылает информацию на провайдреский маршрутизатор о машруте на выделяемую подсеть через link-local абоненского маршрутизатора, провайдерский маршрутизатор добавляет маршрут на выделяемую подсеть.
В примере будет рассмотрен частный случай, когда dhcpv6-сервер и шлюз находятся на одной машине, если кто-то хочет дополнить пример, когда шлюз и dhcpv6-сервер находятся на разных хостах, буду только рад.
О недостатках в программном обеспечении ISC.
dhclient вплоть до крайних версий содержит достаточно странную конфигурацию, когда на интерфейс присваивается адрес с префиксом 64 и меньше, из-за этого могут возникать некторые коллизии в таблице маршрутизации, чтобы избежать этого, необходимо присваивать адрес с префиксом 128 (кстати говоря, Windows это делает искаропки). Чтобы добиться этого, для isc-dhcp-client версий =<4.2 необходимо применить патч
--- isc-dhcp-4.2.2.dfsg.1.orig/client/dhc6.c
+++ isc-dhcp-4.2.2.dfsg.1/client/dhc6.c
@@ -3899,11 +3899,10 @@ dhc6_marshall_values(const char *prefix,
piaddr(addr->address),
(unsigned) addr->plen);
} else {
- /* Current practice is that all subnets are /64's, but
- * some suspect this may not be permanent.
+ /* Prefixlen set to 128 since this is only an address.
*/
client_envadd(client, prefix, "ip6_prefixlen",
- "%d", 64);
+ "%d", 128);
client_envadd(client, prefix, "ip6_address",
"%s", piaddr(addr->address));
}
Для версий >=4.3 применить вот такой
--- isc-dhcp-4.3.1.orig/includes/site.h
+++ isc-dhcp-4.3.1/includes/site.h
@@ -293,7 +293,7 @@
is a host address and doesn't include any on-link information.
64 indicates that the first 64 bits are the subnet or on-link
prefix. */
-#define DHCLIENT_DEFAULT_PREFIX_LEN 64
+#define DHCLIENT_DEFAULT_PREFIX_LEN 128
/* Enable the gentle shutdown signal handling. Currently this
means that on SIGINT or SIGTERM a client will release its
Другие dhcp-клиенты (dhcp6c/udhcpc/wide-dhcp/dibbler) не рассматривал. Заработало в "штатной" поставке.
Рассмотрим два варианта, первом случае будем пытаться запросить PD у провайдера, во втором случае сами будем выступать в роли провайдера.
Для получения PD у провайдера достаточно запустить dhclient c нужными флагами. В общем случае, смотрим man dhclient и в if-up.d/ пишем скрипт следующего содержания.
#!/bin/sh
# if-up script for dhcpv6-pd
# default wan iface - eth0
test -x $(which dhclient) && DHCL=$(which dhclient) || exit 0
case $IFACE in
eth0)
$DHCL -6 -P -N -cf /etc/dhcp/dhclient6.conf \
-lf /var/lib/dhcp/dhclient6.${IFACE}.lease \
-pf /var/run/dhclient6.${IFACE}.pid $IFACE
;;
*)
exit 0
;;
esac
exit $?
где:
-6 - переходить в режим ipv6
-P - запрашивать PD (ia-pd)
-N - запрашивать адрес (ia-na)
-cf - путь к конфиг файлу
-lf - путь к файлу с лизами (leases)
-pf - путь к PID-файлу
и dhclient6.conf следующего содержания:
# file: /etc/dhcp/dhclient6.conf
request dhcp6.domain-search, dhcp6.name-servers, dhcp6.reconf-accept, dhcp6.ia-pd, dhcp6.ia-na;
В случае успеха провайдер Вам выделит подсеть, её значение можно подсмотреть в /var/lib/dhcp/dhclient6.${IFACE}.lease, который мы указали в if-up.d
Для получения PD у провайдера достаточно сконфигурировать строфу с интерфейсом следующим образом:
iface eth0 inet6 dhcp
request_prefix 1
В случае успеха провайдер Вам выделит подсеть, её значение можно подсмотреть в /var/lib/dhcp/dhclient6.${IFACE}.lease.
awk '/iaprefix/{print $2}' /var/lib/dhcp/dhclient6.eth0.lease
Дальнейшая настройка описана выше и с этим более-менее понятно.
Так-как провайдеры обычно делегируют префиксы сетей 48, 56, 64 то в адренду нам достаётся туева хуча адресного пространства, которое грех не поделить на подсетки поменьше, выдавая их уже своим локальным клиентам, эдакое Prefix Delegation after Prefix Delegation. Уже есть вопросы, а типа нахрена? Отвечу в украинской манере: "а щоб було!". Если в протоколе есть этот функционал, надо его использовать! Масштабируемость сети — задел на будущее.

Изучая этот вопрос и проводя эксперименты на стенде выяснил, что вполне себе можно делегировать ЛЮБОЙ префикс. Для простоты понимания приведу пример с префиксом /120, который по ёмкости аналог /24 в четвёртой версии протокола.
Принцип прост как яичница: при DHCP-запросе на сервер, необходимо составить триггер, который бы реагировал на опцию PD в запросе dhcp-клиентов, записывая маршут на сеть через link-local абоненского машрутизатора, а так же удалял его при истечении аренды PD. Вероятно существует и другое ПО способное выдавать PD, не искал.
В моём случае выбор пал на ISC-DHCP версии 4.3.1. Почему именно 4.3.1?
Дело в том, что в isc-dhcpd есть замечательная опция execute, которая позволяет выполнить произвольные команды на сервере, однако в версии 4.2 при работе сервера в режиме ipv6 это не работает, а в версиях выше уже ограничили PD префиксами <= /64 в пределах объявленной subnet6. 4.3.1 выполняет execute в режиме v6 с ЛЮБЫМИ префиксами и ЛЮБЫМИ сетями.
Честно говоря, конфигурация получилась нетривиальная, пришлось подглядеть её тут
http://bnpcs.blogspot.com/2013/05/isc-dhcpd-programming-fun-attempting-to.htmlВ примере указан частный случай, в общем случае следует использовать сети с масками /56, /60, /64Вот, что получилось:
# file /etc/dhcp/dhcpd6.conf
# общие настройки ddns, логгирования
ddns-update-style interim;
ddns-updates on;
update-static-leases on;
update-conflict-detection false;
update-optimization false;
include "/etc/bind/keys";
log-facility local7;
# Объявление PD-prefix, link-local
option dhcp6.ll-addr code 9995 = string;
option dhcp6.pd-prefix code 9997 = string;
option dhcp6.pd-preflen code 9998 = string;
option dhcp6.pd-cidr code 9999 = string;
# пока затрудняюсь описать значения этих параметров
option dhcp6.ulo code 6010 = integer 32;
option dhcp6.uli code 6011 = integer 32;
option dhcp6.uli = substring(suffix(option dhcp6.client-id, 6), 0, 1);
if substring(suffix(binary-to-ascii(2, 8, "",
config-option dhcp6.uli), 2), 0, 1) = "1" {
# Seems there's no minus so we gotta do subtraction by addition overflow
option dhcp6.ulo = encode-int(
extract-int(config-option dhcp6.uli, 8) + 254, 8);
} else {
option dhcp6.ulo = encode-int(
extract-int(config-option dhcp6.uli, 8) + 2, 8);
}
# Определение link-local адреса
option dhcp6.ll-addr = concat("fe80::", binary-to-ascii(16,16, ":",
concat(config-option dhcp6.ulo,
substring(suffix(option dhcp6.client-id, 6), 1, 2),
encode-int(255, 8),
encode-int(254, 8),
substring(suffix(option dhcp6.client-id, 6), 3, 3))) );
# Определение делегируемой подсети
option dhcp6.pd-prefix = binary-to-ascii(16,16, ":",
suffix(substring(option dhcp6.ia-pd, 12, 100), 16)
);
# Определение длинны префикса делегируемой подсети
option dhcp6.pd-preflen = binary-to-ascii(10,8, ".",
substring(suffix(substring(option dhcp6.ia-pd, 12, 100), 17), 0, 1)
);
# составление CIDR Вытекает из двух опций выше.
option dhcp6.pd-cidr = concat (config-option dhcp6.pd-prefix,
"/", config-option dhcp6.pd-preflen);
shared-network lan0 {
subnet6 2a01:d0:8124::/120 {
authoritative;
option dhcp6.name-servers 2a01:d0:8124::1;
option dhcp6.domain-search "132.lan";
range6 2a01:d0:8124::3 2a01:d0:8124::ff;
# делегируем подсеть 2a01:d0:8124::1:0/112, разбивая её на 256 сетей по /120
prefix6 2a01:d0:8124::1:0 2a01:d0:8124::1:ff00 /120;
# Проверяем нет ли в запросе клиентв PD и если есть добавляем/удаляем маршрут
if substring(config-option dhcp6.pd-prefix, 0, 1) = "2" {
on commit {
execute("/sbin/ip", "-6",
"route", "add",
config-option dhcp6.pd-cidr,
"via",
config-option dhcp6.ll-addr,
"dev", "eth1");
}
on release {
execute("/sbin/ip", "-6",
"route", "del",
config-option dhcp6.pd-cidr);
}
on expiry {
execute("/sbin/ip", "-6",
"route", "del",
config-option dhcp6.pd-cidr);
}
}
}
}
где eth1 - LAN-интерфейс
Конфигурация клиентских роутеров на Linux требует принудительно указывать на каком интерфейсе слушать Route Advertisement. Это можно сделать в interfaces, указав в строфе с wan-интефейсом
accept_ra 2# example of interfaces file
auto eth0
iface eth0 inet manual
up ip l s dev $IFACE up
accept_ra 2
down ip l s dev $IFACE down
Либо в /etc/sysctl.conf
net.ipv6.conf.eth0.accept_ra = 2
Дальнейшая настройка описана выше и не требует дополнительной конфигурации при условии, что клиенты за абонентским маршрутизатором получают адреса по dhcpv6.
PS Пользуясь случаем, хочется передать привет разработчикам Android, в котором до сих пор не реализована поддержка ipv6-stateful.