Наши серверы Windows регистрируют AAAA
записи IPv6 на наших DNS-серверах Windows. Однако в нашей сети не включена маршрутизация IPv6, поэтому это часто приводит к зависанию.
Microsoft RDP - худший преступник. При подключении к серверу, имеющему AAAA
запись в DNS, клиент удаленного рабочего стола сначала попытается использовать IPv6 и не будет использовать IPv4 до истечения времени ожидания подключения. Опытные пользователи могут обойти это, подключившись к IP-адресу напрямую. Разрешение IPv4-адреса ping -4 hostname.foo
всегда работает мгновенно.
Что я могу сделать, чтобы избежать этой задержки?
- Отключить IPv6 на клиенте?
- Нет, Microsoft говорит, что IPv6 является обязательной частью операционной системы Windows.
- Слишком много клиентов, чтобы гарантировать, что это установлено везде последовательно.
- Позже будет больше проблем, когда мы, наконец, внедрим IPv6.
- Отключить IPv6 на сервере?
- Нет, Microsoft говорит, что IPv6 является обязательной частью операционной системы Windows.
- Требуется неудобный взлом реестра, чтобы отключить весь стек IPv6.
- Гарантировать, что это правильно установлено на всех серверах, неудобно.
- Позже будет больше проблем, когда мы, наконец, внедрим IPv6.
- Маска записей IPv6 на рекурсоре DNS для пользователя?
- Нет, мы используем NLNet Unbound, и он не поддерживает это .
- Предотвратить регистрацию записей IPv6 AAAA на DNS-сервере Microsoft?
- Я не думаю, что это даже возможно.
На данный момент я рассматриваю возможность написания сценария, который удаляет все записи AAAA из наших зон DNS. Пожалуйста, помогите мне найти лучший способ.
ОБНОВЛЕНИЕ: разрешение DNS не проблема. Как указывает @joeqwerty в своем ответе, записи DNS возвращаются мгновенно. Оба A
и AAAA
записи сразу доступны. Проблема в том, что некоторые клиенты ( mstsc.exe
) будут пытаться подключиться через IPv6, и потребуется некоторое время для возврата к IPv4.
Это похоже на проблему маршрутизации. Команда ping
выдает сообщение об ошибке «Общий сбой», поскольку адрес назначения не маршрутизируется.
C:\Windows\system32>ping myhost.mydomain
Pinging myhost.mydomain [2002:1234:1234::1234:1234] with 32 bytes of data:
General failure.
General failure.
General failure.
General failure.
Ping statistics for 2002:1234:1234::1234:1234:
Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),
Я не могу получить захват пакета этого поведения. Выполнение этой (сбойной) команды ping не создает пакетов в Microsoft Network Monitor. Точно так же попытка соединения с mstsc.exe
узлом с AAAA
записью не приводит к трафику, пока не произойдет откат к IPv4.
ОБНОВЛЕНИЕ: Все наши хосты используют общедоступные адреса IPv4. Я думаю, что эта проблема может сводиться к сломанной конфигурации 6to4. 6to4 ведет себя по-разному на хостах с публичными IP-адресами и адресами RFC1918.
ОБНОВЛЕНИЕ: В моей сети есть что-то подозрительное с 6to4. Когда я отключаю 6to4 на клиенте Windows, соединения разрешаются мгновенно.
netsh int ipv6 6to4 set state disabled
Но, как говорит @joeqwerty, это только маскирует проблему. Я все еще пытаюсь выяснить, почему связь IPv6 в нашей сети полностью не работает.
Ответы:
Этот вопрос довольно интересный, и я должен признать, что никогда не видел такого поведения. Выполняя некоторые действия, пытаясь лучше понять его, я взял фрагмент nslookup, запрашивающего один из моих серверов W2K8R2 RDS, с другого сервера W2K8R2, а также собрал фрагмент сеанса RDP на тот же сервер RDS с того же тестового сервера. , Nslookup не показал задержки при возврате записи IPv6, а nslookup показал, что мой тестовый сервер запрашивал запись IPv4 перед запросом записи IPv6. Дельта времени в захвате не показывает заметной задержки (которую я могу установить) ни в одном запросе.
РЕДАКТИРОВАТЬ
Теперь вы к чему-то.
Убедитесь, что вы захватываете трафик для адаптера Microsoft 6To4, иначе вы не увидите IPv6:
Вот результат nslookup для моего сервера RDS. Запишите адреса IPv6:
Теперь вот фрагмент моего захвата:
И наконец, вот фрагмент из netstat, показывающий соединение:
Итак, как вы уже убедились, разрешение DNS не является проблемой. Проблема заключается в том, что RDP-соединение предпочитает IPv6 по сравнению с IPv4 (по умолчанию для Windows - Windows предпочитает IPv6 по IPv4), а поскольку IPv6 не работает должным образом, это вызывает задержку (как вы указали) при переходе от IPv6 к IPv4. Вы можете исправить это, настроив клиенты так, чтобы они предпочитали IPv4, а не IPv6, но я думаю, что это всего лишь маскировка проблемы. Лучшим решением было бы выяснить, почему IPv6 не работает, и исправить это. Я не знаю достаточно об IPv6, чтобы помочь, но я предполагаю, что записи IPv6, возвращаемые DNS, являются «локальными» адресами, действительными только в подсети, где существуют хосты RDS, и поскольку клиенты находятся в другой подсети, они могут ' T достичь этих адресов IPv6.
источник
Технология перехода IPv6 под названием 6to4 печально известна тем, что вызывает подобные проблемы. Есть несколько факторов на работе. По отдельности они безвредны, но совокупный эффект заключается в том, что конечные пользователи могут испытывать задержки соединения.
Список стимулирующих факторов и соображений по их смягчению представлен ниже.
Windows включает 6to4 по умолчанию
Если на ваших хостах установлена последняя версия Windows (Vista или более поздняя версия), Windows автоматически включит туннелирование 6to4, когда будет доступен общедоступный IPv4-адрес. Критически это относится как к серверам, так и к клиентам.
Чтобы выяснить, использует ли система 6to4, запустите
ipconfig
и найдите IPv6-адрес, начинающийся с префикса 6to42002:
. Это будет выглядеть примерно так.netsh int ipv6 6to4 set state disabled
Публично маршрутизируемые IPv4-адреса используются
6to4 работает только на хостах, которые имеют общедоступные IPv4-адреса, поэтому эта проблема никогда не затрагивает хосты за брандмауэром NAT.
6to4 не работает правильно в сети
Чрезвычайно сложно устранить неполадки 6to4 в любом режиме. Это настолько хлопотно, что в IETF поступил официальный запрос, что 6to4 следует реклассифицировать как исторический . По мнению этого автора, 6to4 устарела.
Вкратце, 6to4 работает путем инкапсуляции пакетов IPv6 в пакеты IPv4 с использованием протокола, называемого 6in4 (протокол IP = 41). Пакеты IPv4 адресуются на любой адрес
192.88.99.1
в надежде, что он попадет на работающий ретранслятор 6to4 где-нибудь в Интернете. Это может быть даже географически поблизости, если вам повезет.На практике некоторые ретрансляторы 6to4 настроены неправильно, и многие сети даже не позволяют трафику 6in4 проходить через межсетевой экран. Обычно это происходит, когда брандмауэр разрешает весь исходящий трафик, но явно не позволяет пакетам IP-протокола 41 возвращаться через брандмауэр. (TODO обратите внимание на соответствующий RFC для устранения неполадок.) Этот сбой («входящая черная дыра») и многие другие описаны в RFC 6343 .
Динамическая регистрация DNS
В типичной среде Active Directory каждому компьютеру разрешено регистрировать свои собственные адреса на DNS-сервере. Когда хост является многосетевым, он регистрирует все свои адреса, даже из туннеля 6to4.
Большинство интернет-сервисов не используют динамический DNS, поэтому эта проблема обычно ограничивается корпоративными сайтами, где клиенты и серверы являются «внутренними» в одной сети.
Клиентское приложение не перестает работать изящно
RDP-клиент Microsoft является одним из примеров клиентского приложения, которое не справляется с проблемами маршрутизации IPv6. Большинство веб-браузеров лучше справляются с такими крайними случаями IPv6, как этот, поэтому они не склонны демонстрировать такое поведение.
источник
Я понимаю, что это не очень полезно в этой ситуации, но для разработчиков, сталкивающихся с подобной дилеммой, есть метод реализации, известный как «Счастливые глазные яблоки» (RFC 6555), который определяет метод для одновременного подключения к ipv4 и ipv6 и выбора того, который подключается первым.
источник
Здесь было мое решение. По умолчанию Windows отдает маршруты IPv6 более высокий приоритет, чем маршруты IPv4. Если вы измените политику префикса IPv6, вы можете изменить это поведение, чтобы оно использовало IPv4 вместо IPv6.
Чтобы убедиться, что все системы в моей сети настроены одинаково, я поместил следующие команды в скрипт .bat, который запускается во время установки программного обеспечения после сборки или восстановления машины.
Чтобы объяснить, что это делает:
Первые 3 строки отключают встроенные туннельные интерфейсы, поскольку они являются избыточными для большинства сетей. Возможно, вы не захотите использовать эти 3 строки, если вы не предоставляете своим компьютерам адреса IPv6 самостоятельно, в моем случае у меня есть сервер DHCPv6 и связанная инфраструктура, назначающая IPv6 для туннельного подключения
Второй блок команд удаляет все существующие политики префиксов маршрутизации IPv6.
Третий блок затем воссоздает префиксные политики IPv6, но использует другой набор приоритетов. Точно так же префикс, соответствующий IPv4, получает преимущество перед IPv6, и тогда машина захочет использовать IPv4, если в приложении не указано использование IPv6.
Это решение сохраняет функциональные возможности двойного стека, но предпочтение использовать IPv4 означает, что сайты с неполным, ненадежным или плохо работающим IPv6 будут избегать его использования, если это не предписано программой в системе.
По моему мнению, использование операционных систем, использующих IPv6 вместо IPv4, на самом деле мешает внедрению. В течение переходного периода будут моменты, когда хост думает, что у него есть подключение к IPv6, но на самом деле нет полностью функционального подключения, что приводит к сбоям программного обеспечения и большим задержкам. Многие люди, которых я знаю, полностью отключили IPv6 на своем маршрутизаторе в качестве обходного пути для интернет-провайдеров, которые сначала развернули IPv6 с перебоями, прежде чем устанавливать полное подключение, и эти люди просто забудут включить его снова, оставив их без IPv6, пока они не перенастроят свой маршрутизатор снова.
источник