Как предотвратить задержки, связанные с записями AAvA IPv6?

11

Наши серверы Windows регистрируют AAAAзаписи IPv6 на наших DNS-серверах Windows. Однако в нашей сети не включена маршрутизация IPv6, поэтому это часто приводит к зависанию.

Microsoft RDP - худший преступник. При подключении к серверу, имеющему AAAAзапись в DNS, клиент удаленного рабочего стола сначала попытается использовать IPv6 и не будет использовать IPv4 до истечения времени ожидания подключения. Опытные пользователи могут обойти это, подключившись к IP-адресу напрямую. Разрешение IPv4-адреса ping -4 hostname.fooвсегда работает мгновенно.

Что я могу сделать, чтобы избежать этой задержки?

На данный момент я рассматриваю возможность написания сценария, который удаляет все записи 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 в нашей сети полностью не работает.

Nic
источник
11
Конечно, завершите развертывание IPv6 в своей сети.
Майкл Хэмптон
1
Вы запустили захват сети на клиенте, чтобы подтвердить этот сбой / задержку разрешения IPv6?
Joeqwerty
1
Кроме того, Microsoft предоставляет несколько удобных инструментов Fixit для отключения / включения различных компонентов IPv6: support.microsoft.com/kb/929852
joeqwerty
1
@joeqwerty Серверы и пользователи находятся в разных подсетях, но все это один большой сайт. Мы не используем раздельный DNS, поэтому понятия «внутренний DNS» не существует.
Nic
2
Также я думаю, что вы найдете эту статью из RIPE, а также RFC 6343 очень интересной и актуальной для чтения. Моя личная рекомендация - полностью сбросить 6to4.
Майкл Хэмптон

Ответы:

10

Этот вопрос довольно интересный, и я должен признать, что никогда не видел такого поведения. Выполняя некоторые действия, пытаясь лучше понять его, я взял фрагмент 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.

joeqwerty
источник
Братан, ты вообще RFC 1918?
Райан Райс
ЛОЛ. Они пришли рано, получили собственный блок / 24 и решили использовать его внутри, а не работать с NAT. Они используют около 80% блока и заняли позицию «если он не сломан, не чините его».
Joeqwerty
@joeqwerty Я обновил свой вопрос с некоторыми разъяснениями. nslookup работает нормально, но ping не работает с General Failure.
Nic
@joeqwerty Спасибо за ваш вклад. Я разместил ответ на этот вопрос, который разъясняет, что произошло в моей среде, и предлагает то, что другие люди могут сделать в аналогичной ситуации.
Nic
9

Технология перехода IPv6 под названием 6to4 печально известна тем, что вызывает подобные проблемы. Есть несколько факторов на работе. По отдельности они безвредны, но совокупный эффект заключается в том, что конечные пользователи могут испытывать задержки соединения.

Список стимулирующих факторов и соображений по их смягчению представлен ниже.


Windows включает 6to4 по умолчанию

Если на ваших хостах установлена ​​последняя версия Windows (Vista или более поздняя версия), Windows автоматически включит туннелирование 6to4, когда будет доступен общедоступный IPv4-адрес. Критически это относится как к серверам, так и к клиентам.

Чтобы выяснить, использует ли система 6to4, запустите ipconfigи найдите IPv6-адрес, начинающийся с префикса 6to4 2002:. Это будет выглядеть примерно так.

C:\> ipconfig
Tunnel adapter 6TO4 Adapter:
IPv6 Address. . . . . . . . . . . : 2002:1111:2222::1111:2222
  • Если ваши конечные точки подключены к Active Directory, вы можете использовать групповую политику для отключения протоколов перехода, таких как 6to4 и Teredo. Это хорошо задокументировано в KB929852 . (Применение этого к вашим клиентам или серверам было бы достаточно, но если вы делаете этот шаг, вероятно, имеет смысл отключить его везде, как на клиентах, так и на серверах.)
  • Если вы управляете только несколькими хостами, вы можете отключить 6to4 в каждом конкретном случае. Это намного лучше, чем полное отключение IPv6.netsh int ipv6 6to4 set state disabled
  • Используйте другую клиентскую операционную систему. Например, в Mac OS X по умолчанию 6to4 не включен.

Публично маршрутизируемые IPv4-адреса используются

6to4 работает только на хостах, которые имеют общедоступные IPv4-адреса, поэтому эта проблема никогда не затрагивает хосты за брандмауэром NAT.

  • Вы можете переместить клиентов и / или серверы за брандмауэр NAT и начать использовать адресацию RFC1918. Но в некоторых случаях общедоступные маршрутизируемые адреса на самом деле предпочтительнее. Изменение адресации всей сети также может быть нереальным выбором.

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 .

  • Настройте брандмауэр на громкое отклонение IP-протокола 41 (с сбросом TCP) при отправке с внутренних узлов вашей сети. Это должно привести к «быстрому отказу», которое имеет больше смысла, чем недетерминированные задержки соединения. Это было продемонстрировано для работы в ограниченных средах тестирования .
  • Попросите вашего интернет-провайдера или транзитного провайдера первого перехода настроить рабочее реле 6to4. Если это сделано правильно, это приведет к лучшему опыту для конечных пользователей. Любой конечный пользователь с публично маршрутизируемым IPv4-адресом сможет участвовать в IPv6-интернете.

Динамическая регистрация DNS

В типичной среде Active Directory каждому компьютеру разрешено регистрировать свои собственные адреса на DNS-сервере. Когда хост является многосетевым, он регистрирует все свои адреса, даже из туннеля 6to4.

Большинство интернет-сервисов не используют динамический DNS, поэтому эта проблема обычно ограничивается корпоративными сайтами, где клиенты и серверы являются «внутренними» в одной сети.

  • Вы можете отключить динамические обновления DNS. Тогда, если вы не поместите какие-либо записи ресурса AAAA в файл зоны, они никогда не будут обработаны. Однако динамический DNS часто желателен для внутренних DNS-серверов. (Если вы сделаете это, обязательно удалите все записи AAAA, которые могут уже присутствовать.)
  • Настройте DNS-сервер, чтобы не предоставлять ответы для записей ресурсов AAAA. Но не делайте этого, потому что это действительно доставит вам неприятности, когда вы захотите начать реализацию IPv6. (Кто-нибудь знает о брандмауэре DNS с открытым / открытым исходным кодом?)

Клиентское приложение не перестает работать изящно

RDP-клиент Microsoft является одним из примеров клиентского приложения, которое не справляется с проблемами маршрутизации IPv6. Большинство веб-браузеров лучше справляются с такими крайними случаями IPv6, как этот, поэтому они не склонны демонстрировать такое поведение.

  • Попробуйте использовать другой клиент. Может быть, вам повезет.
Nic
источник
Я бы расширил обсуждение вопросов 6to4, упомянув, как адреса RFC 6598 могут усугубить проблему. Большая часть программного обеспечения, которое автоматически включает 6to4, если публичный IPv4-адрес доступен, было написано до этого RFC. Следовательно, адрес RFC 6598, естественно, будет обнаружен, как если бы это был публичный адрес IPv4. Но это не так, и запуск 6to4 по адресу RFC 6598 не сработает. Если вы видите какой-либо IPv6-адрес из 2002: 6440 :: / 26, то вы столкнулись с проблемой 6to4 + RFC 6598.
Касперд
Anycast Relay 6to4 является релевантным только при обмене данными между хостом 6to4 и собственным хостом IPv6, и не ретранслируется при обмене данными между двумя хостами 6to4 (как ни странно, это означает, что добавление родного IPv6 к некоторым, но не ко всем хостам может ухудшить ситуацию).
Питер Грин
2

Я понимаю, что это не очень полезно в этой ситуации, но для разработчиков, сталкивающихся с подобной дилеммой, есть метод реализации, известный как «Счастливые глазные яблоки» (RFC 6555), который определяет метод для одновременного подключения к ipv4 и ipv6 и выбора того, который подключается первым.

Джо Миллер
источник
0

Здесь было мое решение. По умолчанию Windows отдает маршруты IPv6 более высокий приоритет, чем маршруты IPv4. Если вы измените политику префикса IPv6, вы можете изменить это поведение, чтобы оно использовало IPv4 вместо IPv6.

Чтобы убедиться, что все системы в моей сети настроены одинаково, я поместил следующие команды в скрипт .bat, который запускается во время установки программного обеспечения после сборки или восстановления машины.

netsh int ipv6 isatap set state disabled
netsh int ipv6 6to4 set state disabled
netsh interface teredo set state disable

netsh interface ipv6 delete prefixpolicy ::1/128
netsh interface ipv6 delete prefixpolicy ::/0
netsh interface ipv6 delete prefixpolicy 2002::/16
netsh interface ipv6 delete prefixpolicy ::/96
netsh interface ipv6 delete prefixpolicy ::ffff:0:0/96
netsh interface ipv6 delete prefixpolicy 2001::/32

netsh interface ipv6 add prefixpolicy ::1/128 50 0
netsh interface ipv6 add prefixpolicy ::ffff:0:0/96 40 1
netsh interface ipv6 add prefixpolicy ::/0 30 2
netsh interface ipv6 add prefixpolicy 2002::/16 20 3
netsh interface ipv6 add prefixpolicy ::/96 10 4
netsh interface ipv6 add prefixpolicy 2001::/32 5 5

Чтобы объяснить, что это делает:

Первые 3 строки отключают встроенные туннельные интерфейсы, поскольку они являются избыточными для большинства сетей. Возможно, вы не захотите использовать эти 3 строки, если вы не предоставляете своим компьютерам адреса IPv6 самостоятельно, в моем случае у меня есть сервер DHCPv6 и связанная инфраструктура, назначающая IPv6 для туннельного подключения

Второй блок команд удаляет все существующие политики префиксов маршрутизации IPv6.

Третий блок затем воссоздает префиксные политики IPv6, но использует другой набор приоритетов. Точно так же префикс, соответствующий IPv4, получает преимущество перед IPv6, и тогда машина захочет использовать IPv4, если в приложении не указано использование IPv6.

Это решение сохраняет функциональные возможности двойного стека, но предпочтение использовать IPv4 означает, что сайты с неполным, ненадежным или плохо работающим IPv6 будут избегать его использования, если это не предписано программой в системе.

По моему мнению, использование операционных систем, использующих IPv6 вместо IPv4, на самом деле мешает внедрению. В течение переходного периода будут моменты, когда хост думает, что у него есть подключение к IPv6, но на самом деле нет полностью функционального подключения, что приводит к сбоям программного обеспечения и большим задержкам. Многие люди, которых я знаю, полностью отключили IPv6 на своем маршрутизаторе в качестве обходного пути для интернет-провайдеров, которые сначала развернули IPv6 с перебоями, прежде чем устанавливать полное подключение, и эти люди просто забудут включить его снова, оставив их без IPv6, пока они не перенастроят свой маршрутизатор снова.

OdinYggd
источник
+1 за отключение туннелирования, -1 за предпочтение IPv4. Это не проблема для большинства людей, и должна применяться только для конкретных пользователей в определенных обстоятельствах.
Майкл Хэмптон