Windows Server 2008: внедрение IPv6 в локальной сети

2010-06-29, 01:10 / Argon

Внедряя протокол IPv6 на своем предприятии, я столкнулся с тем, что для установки и настройки необходимых служб принцип Next-Next-Next не работает, а документации на русском не нашел вообще.

Эта статья пошагово расскажет на примере моей инфраструктуры о том, как развернуть IPv6 на предприятии используя стандартные службы DNS и DHCP операционной системы Windows Server 2008 / 2008 R2.

Адресация IPv6

Как известно, в IPv4 стандартизированы диапазоны «серых» адресов для локальных сетей (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16), аналогично и в IPv6 для локальных адресов принят диапазон fc00:/7.

Рассмотрим следующую схему адресации IPv6, которая принята для локальных сетей на платформе Windows Server:

  • префикс сети (адрес сети в терминологии IPv4):
    fc00:a:b:c::/64, где a, b, c — выбирайте на ваше усмотрение из диапазона 0000-ffff, например fc00:10:18:1::/64
  • адрес хоста в сети
    fc00:a:b:c:v:x:y:z, где v, x, y ,z определяют адрес хоста, например

    • fc00:10:18:1:feab:01cc:65de:180a — такой адрес может назначить DHCP-сервер
    • fc00:10:18:1::10 — настроенный вручную более читабельный адрес, например для сервера, который нужно будет указывать руками (:: означает пропуск группы нулей, может использоваться однократно в адресе).

На картинке показан пример настроек сервера, на котором далее будет настроена служба DHCPv6.

Диалог настроек IPv6

Как работает IPv6 совместно с IPv4

IPv6 замечательно работает совместно с уже развернутой инфраструктурой IPv4 следующим образом:

  • На Windows Server 2008 / 2008 R2 разворачиваются службы DNS и DHCP, поддерживающие IPv6.
  • Клиенты, поддерживающие IPv6 (Windows Vista, Windows 7), получают настройки от DHCP и регистрируют свои имена в DNS.
  • Далее при обращении к узлам по DNS-имени в первую очередь идет попытка получить их адреса IPv6 (тип записи AAAA), в случае их отсутствия — IPv4 (тип записи A).
  • Клиенты, не поддерживающие IPv6 (Windows Server 2003, Windows XP) продолжают пользоваться старым протоколом IPv4 как раньше.

При выборе префикса создаваемой сети IPv6 рекомендую схитрить: если в этой же физической сети располагается IPv4 сеть 10.18.1.0/24, то можно выбрать префикс fc00:10:18:1::/64 для сети IPv6.

Установка и настройка DNS

Так как адреса IPv6 еще менее человечны, чем в IPv4, то их применение без DNS можно оправдать только с точки зрения садомазохизма. Поэтому в первую очередь необходимо развернуть DNS сервер, поддерживающий IPv6 адреса. Такая поддержка есть в службе DNS начиная с Windows Server 2008.

Все, что нужно сделать — это сконфигурировать статические IPv6 адреса (например fc00:10:18:1::1) на DNS серверах, включить динамическое обновление записей клиентами (в окружении Active Directory — безопасное) и передать эти настройки клиентам локальной сети через DHCP, о чем рассказывается далее.

Установка и настройка DHCPv6

Протокол IPv6 менее приспособлен для ручных настроек, в отличии от IPv4, поэтому предполагает автоматическое конфигурирование параметров узлов сети через DHCP версии 6. Поддержка DHCPv6 появилась начиная с Windows Server 2008 и является частью стандартной роли DHCP сервера.

Перед установкой DHCP-сервера необходимо сконфигурировать статические адреса IPv6 для сетевых адаптеров, с которых сервер DHCPv6 будет обслуживать своих клиентов. Например, fc00:10:18:1::10.

Теперь можно перейти к установке стандартной роли DHCP. Первая опция, относящаяся к IPv6 называется DHCPv6 Stateless Mode. Её нужно включить, тогда на следующей странице у вас запросят адреса IPv6 DNS серверов и DNS-имя родительского домена.

Если DHCPv6 сервер был установлен с отключенным DHCPv6 Stateless Mode, то включить его можно выполнив команду:

netsh int ipv6 set interface InterfaceName other=en

и установив опции сервера DHCPv6:

  • 00023 DNS Recursive Name Server IPv6 Address ;mdash; адреса IPv6 DNS серверов
  • 00024 Domain Search List ;mdash; DNS-имя родительского домена

Теперь нужно создать область, в которой DHCPv6 серверу предстоит выдавать адреса своим клиентам. Особенностью DHCPv6 в Windows Server является то, что можно создать область только для адресов с длиной префикса сети равной 64, например fc00:10:18:1::/64.

На следующей странице предлагается указать область исключений, из которой DHCPv6 сервер не будет выдавать адреса. Так как адреса сервер выдает не по порядку, а псевдослучайным образом (по хитрому алгоритму, основанному на MAC адресе сетевого интерфейса), то область исключений должка включать IPv6 адреса серверов, которые был сконфигурированы вручную (DNS и DHCPv6 сервера). Пример области исключений: 0:0:0:1-0:0:0:99.

Казалось бы, осталось только активировать диапазон и авторизовать DHCPv6 сервер в Active Directory. Вскоре сервер начнет выдавать клиентам IPv6 адреса и настройки DNS. Но здесь начинается самое интересное: хоть клиенты эти настойки исправно получают, общаться между собой они не могут. Причем сие печальное поведение на момент написания этой статьи в официальной документации явно не отражено.

Чтобы исправить ситуацию, вызываем на клиенте

route print

и видим, что клиент не имеет маршрута в сеть fc00:10:18:1::/64.

Вызываем на сервере

netsh int ipv6 show route

и среди прочего видим:

Publish Type Met Prefix Idx Gateway/Interface Name
No Manual 256 fc00:10:18:1::/64 10 Local

Из этого следует, что маршрут в сеть fc00:10:18:1::/64 на сервере DHCPv6 существует, но не опубликован. Для того, чтобы этот маршрут выдавался клиентам, необходимо включить на сервере объявление маршрутов командой

netsh int ipv6 set interface Local adv=en man=en other=en

и опубликовать маршрут командой

netsh int ipv6 add route fc00:10:18:1::/64 Local publish=yes

где fc00:10:18:1::/64 — ваш префикс IPv6, Local — имя или индекс сетевого интерфейса DHCPv6 сервера.

Маршрутизация IPv6

Встроенная роль Routing and Remote Access начиная с Windows Server 2008 поддерживает маршрутизацию IPv6, однако для того, чтобы она полноценно заработала, необходимо выполнить следующие, не очевидные вещи.

1. В свойствах сервера Routing and Remote Access на вкладке IPv6 включить Enable IPv6 Forwarding и Enable Default Route Advertisement.

2. На сервере-маршрутизаторе IPv6 должно быть как минимум две сетевых карты.

Local (fc00:10:18:1::10/64 в моих примерах), смотрящая в локальную сеть, для которой мы на предыдущих шагах настраивали раздачу IPv6 адресов, префикса сети и других параметров по DHCP.

External (например fc00:10:18:2::10/64), которая по идее должна смотреть в другую сеть (у нас маршрутизатор все-таки), но может смотреть и в ту же, что и Local.

3. Для того, чтобы IPv6 клиенты в сети могли использовать наш маршрутизатор, он должен объявить себя как маршрут по умолчанию (Default Route Advertisement, как шлюз по умолчанию в терминах IPv4).

Для этого в Windows Server 2008 нужно выполнить команду

netsh int ipv6 add route ::/0 External fc00:10:18:2::180 publish=yes

где fc00:10:18:2::180 — адрес следующего маршрутизатора по умолчанию (next-hop), находящегося в сети External. Не важно, существует он реально или нет. Для объявления маршрута по умолчанию в сеть Local на текущем маршрутизаторе next-hop должен быть указан.

Для Windows Server 2008 R2 всё проще, достаточно выполнить команду

netsh int ipv6 set Local advertisedefaultroute=enabled

для объявления маршрутизатора в сети Local как Default Route.

Полезные ссылки



27 комментариев

Tiunov Igor
# Комментарий от 2010-07-11, 12:34

Вот эта проблема » клиенты эти настойки исправно получают, общаться между собой они не могут» решается добавлением в сеть обязательного для DHCPv6 маршрутизатора с поддержной ipv6 (в роли которого может выступать W2k8). Этот момент Вы как-то упустили при чтении обсуждения на technet.

Argon
# Комментарий от 2010-07-11, 12:45

Не упустил, последние две приведенные мной команды какраз решают эту проблему без установки ipv6 маршрутизатора. Как маршрутизатор после этого сервер работать не станет, но в пределах одной сети ipv6 будет работать исправно.

Tiunov Igor
# Комментарий от 2010-07-12, 23:26

Представте, если не два клиента, а 1000, тогда может и DHCP не нужен? но как решение — не спорю.

Tiunov Igor
# Комментарий от 2010-07-12, 23:28

Хотя извиняюсь, я сам не додумал, DHCP рассылает объявления маршрутизатора…

Emulty
# Комментарий от 2010-08-10, 12:10

Перелопатил кучу информации по IPV6, только сил не хватило освоить мануалы на английском языке.
Очень благодарен за опыт выложенный в данной статье.
Реально основная трудность, что в отличие от IPv4 с IPV6 нет устоявшихся традиций настройки в доменной сети предприятия. В силу того, что если в большинстве случаев с IPv4 все использовали выделенные приватные диапазоны. С IPv6 ситуация другая, хочешь используй полностью аналогичную схему IPv4 с локальными адресами, хочешь бери область у туннельного брокера и используй прямые адреса шестой версии и настраивай максимально жестко свой FireWall. Можно использовать сразу оба варианта и единого мнения как это лучше сделать — нет. ForeFront tmg вообще толком не поддерживает IPv6. При этом Windows в качестве маршрутизатора использовать крайне не удобно, а роутеры типа Циски далеко не везде получается использовать, ибо дорого.

Argon
# Комментарий от 2010-08-10, 12:44

Во всем согласен. Особенно попал в точку насчет неподдержки IPv6 в Forefront TMG, это печально, люто, бешено!

Hitmank
# Комментарий от 2010-08-20, 21:20

хотел бы спросить, а как сделать чтобы и шлюз ipv6 по dhcp выдавался, dns выдает, ip выдает, а вот шлюз нет.

Argon
# Комментарий от 2010-08-23, 15:27

Хороший вопрос, для выдачи шлюза по умолчанию нужно объявить маршрут ::/0.

То есть, если на одной машине стоит DHCPv6 и Routing, то достаточно использовать команды

netsh int ipv6 set int Local adv=en
netsh int ipv6 add route ::/0 Local publish=yes

Hitmank
# Комментарий от 2010-08-23, 21:31

хм… интересно, а почему 0? и что если шлюз и dhcp сервер это не один и тот компьютер, тогда эти команды нужно объявить на той машине или нет?

Hitmank
# Комментарий от 2010-08-24, 00:08

Также хотелось бы отметить, почему сам сервер dhcp да другие машины которым дан статический адрес, берут еще один от dhcp сервера?

Hitmank
# Комментарий от 2010-08-24, 00:38

Следуя Вашим рекомендациям не вышло, шлюз по прежнему не высвечивается у клиента.

Argon
# Комментарий от 2010-08-24, 12:13

Шлюз должен объявлять себя сам.

Я исследовал этот вопрос, попробовал объявить
add route ::/0 Local fc00:10:18:1::1 publish=yes
где 10:18:1::1 — адрес другого компа со службой маршрутизации. Этот маршрут на самом серваке прописывается, но до клиентов не доходит.

Однако, если прописать
add route ::/0 Local fc00:10:18:1::10 publish=yes
где 10:18:1::10 — адрес того же компа, то до клиентов доходит маршрут «::/0 on-link» (виден в ipconfig как «::»), то есть без указания роутера, и, соответственно, маршрутизация не работает.

Если на клиенте руками прописать
route add ::/0 fc00:10:18:1::10
то шлюз работает как надо.

Я попробую решить эту проблему, так как мне тоже интересно.

Насчет второго IPv6 адреса… Так как флаг M в DHCPv6 установлен (netsh int ipv6 set interface Local man=en), то DHCP сервером назначаются клиентом адреса, при этом же сами клиенты генерируют еще Stateless IPv6 адреса (EUI-64) самостоятельно. Таким образом клиенты имеют по 2 адреса и больше.

Чтобы отключить автогенрацию IPv6 на стороне клиентов, нужно выполнить

netsh interface ipv6 set global randomizeidentifiers=disabled

…однако, зачем? Пусть живёт.

Hitmank
# Комментарий от 2010-08-24, 17:25

Спасибо, успеха Вам. Отпишитесь если получится.

Argon
# Комментарий от 2010-08-30, 16:56

Кое-что выяснил.

Чтобы работало объявление default router, я создал следующие условия.

На компе WS 2008 две сетевухи.

Local1 fc00:10:18:1::10/64 — раздает этот префикс и адреса клиентам по DHCP.
Сконфигурирован
netsh int ipv6 add route fc00:10:18:1::/64 Local1 publish=yes

Local2 fc00:10:18:2::10/64 — для объявления Default Router в сеть Local1 нужен сконфигурированный next-hop адрес (следующего маршрутизатора для текущего роутера).
Сконфигурирован
netsh int ipv6 add route ::/0 Local2 fc00:10:18:2::180 publish=yes

Таким образом, клиенты получают DHCP адреса и префикс fc00:10:18:1::/64, а также default router (маршрут ::/0), который указывает на link-local адрес (fe80:…) адаптера Local1.

Как сделать, чтобы клиенты как адрес шлюза получали назначенный адаптеру Local1 адрес (fc00:10:18:1::10) вместо link-local — еще не знаю.

Не проверял, но пишут, что для WS 2008 R2 уже нет необходимости объявлять на роутере next-hop адрес следующего роутера, достаточно выполнить

netsh int ipv6 set int advertisedefaultroute=enabled

Hitmank
# Комментарий от 2010-08-31, 10:13

Интересно, обязательно попробую. Спасибо!

Argon
# Комментарий от 2010-08-31, 11:42

Пожалуйста, дополнил статью добытой инфой по маршрутизации.

Traum
# Комментарий от 2010-10-20, 14:21

Вопрос про шлюз надо-бы задать дяде Биллу. Какого хрена, в сведениях о подключении параметр «Шлюз IPv6» есть, а в Параметрах области DHCP его задать нельзя!?

Argon
# Комментарий от 2010-10-20, 15:07

Все нормально у дяди Билла, он следует новым стандартам IPv6, в которых значится, что шлюзы IPv6 должны объявлять себя сами. Это команда

netsh int ipv6 add route ::/0 External fc00:10:18:2::180 publish=yes

в моём примере.

Алексей
# Комментарий от 2010-11-17, 09:06

Тут поковырял немного, написал скрипт. Для Назначения IPv6 и для показа EUI-64. Если нужно выложу.

Argon
# Комментарий от 2010-11-20, 15:47

Интересно, а для чего вы задумали использовать ваш скрипт? Как писал, IPv6 на клиентах дополнительных настроек не требует, всё раздается с серверов.

Дмитрий
# Комментарий от 2010-11-26, 07:37

Скажите, а это нормально, что помимо статического адреса, сервер получил от DHCP еще два адреса IPv6?

Argon
# Комментарий от 2010-12-03, 03:55

Да, один конфигурируется самим клиентом по методу Stateless (генерируется на основе мак адреса сетевухи, EUI-64), другой назначается DHCP сервером. Ну а третьим адресом будет статически назначенный, если есть.

Pan@lj
# Комментарий от 2011-01-20, 23:26

Наконец то толковый Howto. Спасибо, завтра офис ждут перемены :evil:

Tom
# Комментарий от 2012-06-01, 15:33

Как показывает практика, всегда обрашщения между клиентами или клиентами с серверами проходят по полученым Stateless адрессами, по этому нет обходимости создавать область адресов на DHCPv6 сервере. Достаточно установить только опции сервера DHCPv6:
•00023 DNS Recursive Name Server IPv6 Address ;mdash; адреса IPv6 DNS серверов
•00024 Domain Search List ;mdash; DNS-имя родительского домена. Если DHCPv6 сервер и маршрутизатор поставлены на разные машины, то на DHCPv6 сервере больше никаких манипуляций в настройках сети пролеловать не надо, за иссключением команды „netsh int ipv6 set interface InterfaceName other=en“. А на шлюзе исспользовать только Windows Server 2008 R2 (без R2 не получилось) „netsh int ipv6 set interface Local adv=en for=en“, „netsh int ipv6 set interface Internal for=en“, „netsh int ipv6 add route fc00:10:18:1::/64 Local publish=yes“ и „netsh int ipv6 set Local advertisedefaultroute=enabled“.

Argon
# Комментарий от 2012-06-01, 17:21

Спасибо за инфу! Я тоже не вижу смысла раздавать stateful адреса.

Loader
# Комментарий от 2013-10-07, 13:18

Поправьте в статье
netsh int ipv6 set route fc00:10:18:1::/64 Local publish=yes

Argon
# Комментарий от 2014-12-01, 18:13

Loader, ваш вариант работает, если маршрут уже создан.

Добавить комментарий