Продолжая начатую ранее тему об IPv6, сегодня мы поговорим о глобальных IPv6-адресах, маршрутизации, раздаче адресов и службе имён. Всё, о чём пойдёт речь в этой статье, вы можете свободно тестировать в своей локальной сети между двумя хостами, не мешая при этом нормальному функционированию IPv4.
Предотвращение утечки IPv6
В своих экспериментах мы будем использовать глобальные IPv6-адреса из диапазона, предназначенного для использования в Интернет. Сегодня, когда провайдеры не поддерживают и не выдают IPv6-адреса своим клиентам, такие эксперименты не должны вызвать каких-либо проблем. Однако на всякий случай, всё же заблокируйте на вашем маршрутизаторе пропуск IPv6-пакетов наружу. Если ваш роутер работает под управлением Linux, то вы можете заблокировать весь IPv6-трафик следующими командами:
# ip6tables -P OUTPUT DROP # ip6tables -p INPUT DROP # ip6tables -p FORWARD DROP
Присваивание глобальных IPv6-адресов
Адреса link-local, которыми мы пользовались в первой статье довольно ограничены в применении. В реальной жизни нам понадобятся глобальные unicast-адреса. Такими адресами являются адреса из области 2000::/3. Любознательные люди могут знать, что адреса из области 2001:0DB8::/32 предназначены для использования в экспериментах, так что их мы и будем использовать. Давайте присвоим реальный IP-v6-адрес сетевому интерфейсу eth0:
# ip -6 addr add 2001:0db8::1/64 dev eth0
Обратите внимание: /64 — это не CIDR-нотация, это количество бит префикса. Следующая диаграмма поможет понять о чём идёт речь:
2001:db8:0000:0000:0000:0000:0000:0001 _____________|____|___________________ Network ID Subnet Interface ID
Network ID определяется провайдером, когда он выдаёт блок IPv6-адресов. Вы же можете управлять значением Subnet и Interface ID. Таким образом, в нашем случае 64 бита отведены под Network ID + Subnet и 64 бита под Inetrface ID. Вспомните, что в IPv4 для адреса в целом отводилось 32 бита, так что выделенного такого размера блока адресов вам хватит очень надолго!
Теперь вы можете пинговать интерфейс в пределах локальной системы по назначенному ему IPv6-адресу. Здесь я только для примера ввожу длинный IPv6-адрес в полном формате, чтобы вы увидели, как программа ping6 автоматически сократит его:
$ ping6 2001:db8:0:0:0:0:0:1 PING 2001:db8:0:0:0:0:0:1(2001:db8::1) 56 data bytes 64 bytes from 2001:db8::1: icmp_seq=1 ttl=64 time=0.043 ms
Однако пинг с другого хоста у вас не пройдёт, поскольку для этого, так же как и с IPv4 нам понадобится роутер.
Добавление адресов
Вы можете добавлять сколько угодно адресов интерфейсам ваших систем. Просто считайте в шестнадцатиричной системе по порядку: 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, 10, 11 и так далее, получая таким образом новые адреса:
2001:db8::1 2001:db8::2 2001:db8::3 ... 2001:db8::18 2001:db8::19 2001:db8::1a 2001:db8::1b
Маршрутизация
Само-собой разумеется, ваш роутер должен поддерживать IPv6. Если вашим роутером является Linux-система, то включить маршрутизацию можно следующей командой:
# sysctl -w net.ipv6.conf.all.forwarding=1
Проверить, включена ли маршрутизация IPv6, можно командой:
# cat /proc/sys/net/ipv6/conf/eth0/forwarding 1
«1» означает, что всё хорошо и в вашем устройстве маршрутизация шестой версии IP включена. Теперь установите radvd — router advertiser daemon и в его файле конфигурации /etc/radvd.conf поместите следующее, изменив имя интерфейса eth0, если нужно:
interface eth0 { AdvSendAdvert on; prefix 2001:db8::/64 { }; };
Теперь добавьте интерфейсу вашего роутера IPv6-адрес:
# ip address add 2001:db8::1a/64 dev eth0
Проверьте, всё ли у вас получилось так, как нужно, при помощи команд
$ ifconfig eth0 | grep inet6 inet6 addr: 2001:db8::1a/64 Scope:Global inet6 addr: fe80::20e:2eff:feb9:cbad/64 Scope:Link
$ ip -6 route show 2001:db8::/64 dev eth0 metric 1024 mtu 1500 advmss 1440 hoplimit 0 fe80::/64 dev eth0 proto kernel metric 256 mtu 1500 advmss 1440 hoplimit 0
И теперь можно запустит radvd:
# /etc/init.d/radvd start
Теперь вы должны без проблем пинговать интерфейс вашего роутера. обратите внимание, что в случае с глобальным адресом, в отличие от link-local, вам не нужно указывать имя интерфейса:
$ ping6 2001:0db8::1a PING 2001:db8::1a(2001:db8::1a) 56 data bytes 64 bytes from 2001:db8::1a: icmp_seq=1 ttl=64 time=1.73 ms
Все компьютеры, находящиеся на одном свитче с маршрутизатором должны теперь автоматически получить адреса из диапазона 2001:0db8::/64. Чтобы добавить в таблицу маршрутизации ваших хостов роутер по-умолчанию воспользуйтесь командой:
# ip -6 route add default via 2001:db8::1a
Можно избавиться от ручного добавления этой записи в таблицы маршрутизации хостов, немного дополнив конфигурацию вашего radvd:
interface eth0 { AdvSendAdvert on; prefix 2001:db8::/64 { AdvOnLink on; AdvAutonomous on; }; route ::/0 { }; }
Теперь в таблицах маршрутизации IPv6 ваших хостов вы будете видеть следующее:
$ ip -6 route show ... default via 2001:db8::1a dev eth0 metric 1024 mtu 1500 advmss 1440 hoplimit 0 ...
Что делать, если вам не нужно, чтобы radvd раздавал IPv6-адреса всем подряд в вашей сети? Про перечислите в файле конфигурации демона link-local адреса тех станций, которым вы хотите выдавать адрес, а запросы от остальных будут просто проигнорированы:
interface eth0 { AdvSendAdvert on; prefix 2001:db8::/64 { AdvOnLink on; AdvAutonomous on; }; route ::/0 { }; clients { fe80::20d:b9ff:fe05:25b4; fe80::20b:6aff:feef:7e8d; fe80::221:97ff:feed:ef01; }; };
Калькулятор IPv6-адресов
Понимание двоичной арифметики очень важно для понимания принципов адресации в IP. Вычисления адресов вручную бывают довольно утомительными и нередко приводят к ошибкам. Почему бы не возложить эти вычисления на плечи компьютера? Существует масса онлайн-утилит для этого, выбирайте себе любую! Также в большинстве дистрибутивов вы найдёте в репозиториях утилиту ipv6calc, которая пригодится для локального пользования.
Службы имён
Вообще, настройка DNS для IPv6 — тема достаточно объёмной статьи, однако я надеюсь что некоторые описанные здесь моменты дадут вам нужное направление.
Идея, лежащая в основе автоконфигурации сетевых IPv6 интерфейсов (link-local адреса и router advertisements), призвана избавить от необходимости держать DHCP-сервер, однако вам всё ещё нужно поддерживать DNS-сервер, чтобы хосты могли выполнять преобразование имён в IP-адреса и обратно. BIND9 уже поддерживает IPv6, но как всегда в случае с BIND, вам придётся потрудиться, перелопатив несколько конфиг-файлов, расположенных в разных местах. В других DNS-демонах от вас понадобилось бы меньше усилий, однако ещё никакой из них не поддерживает IPv6 в полном объёме. Если вас заинтересовала тема настройки IPv6 в BIND, вы может обратить к руководству по BIND.
В предыдущей статье мы рассматривали вариант использования старого-доброго /etc/hosts. Как вариант, вы можете использовать Dnsmasq, который является моим любимым средством организации DNS в локальных сетях. Он поддерживает IPv6-DNS и TFTP, однако в нём нет DHCP, что не позволяет ему быть универсальным решением. Dnsmasq делает содержимое /etc/hosts доступным по сети, используя DNS-протокол. Сперва настройте IPv6-интерфейсы ваших хостов на использование статических адресов, а затем разместите соответствие адресов именам в файле /etc/hosts вашего Dnsmasq-сервера и перезапустите демон Dnsmasq. Далее установите rdnssd — recursive DNS server discovery daemon на том же хосте, где у вас установлен radvd, затем добавьте в файл конфигурации /etc/radvd.conf строку, указывающую адрес вашего Dnsmasq-сервера:
RDNSS 2001:0db8::1b
Перезапустите radvd. Проекты radvd и rdnssd находятся в стадии разработки, поэтому не исключено, что вы можете столкнуться с какими-нибудь проблемами, хотя на моих Debian-системах они работают отлично.
Источник: linux.com
Спасибо, ashep!
Прочитал, вечером буду пробовать.
Статью – в закладки.
Беда...
А разве нельзя заставить radvd обновлять ipv6 адреса в зоне bind-а, как это раньше было? Статические ip-шники слишком грустно.
И в репозиториях я давно вижу несколько вариантов DHCPv6-серверов. В чем их отличие от radvd?
2 afunix
Варианты DHCPv6-серверов отличаются степенью реализованности различных РФСи, например, умением/не умением делегировать префиксы.
Кроме того, например, ИСЦ ДХЦП умеет обрабатывать запросы по МАС адресу, а не по ДУИДу, как описано в РФЦ.
А про ДДНС лучше посмотреть в 20й главе IPv6 in Practice by Benedict Stockebrand
Он поддерживает IPv6-DNS и TFTP, однако в нём нед DHCP
Извините, здесь небольшая грамматическая ошибка.
За статью спасибо! Как раз то, что нужно было: беглый обзор некоторых особенностей, ввиду малого пока распространения.
yurror, благодарю за найденную опечатку ;)
Здравствуйте,
а у вас есть планы на «вторую редакцию» этих материалов? Обе части курса легко читаются и несомненно интересны, но и время идет, и подправить кое-что надо.
Статья интересная, но есть пара комментариев:
1. У меня настроена эта схем + Dhcp — dhcp не может корректно отдавать клиенту адрес роутеар из за чего и запущен radvd
2. radvd иногда подвисает т.е. висит в процессах, но не работает, на срандартную restart не реагирует, приходится прибивать процесс и заново запускать.
На роутере взведено 150 vlan по 5-15 клиентов в каждой подсети.