Windows предпочитает IPv6: почему старые сервисы могут ломаться
Если для удаленного хоста доступны и IPv4, и IPv6, Windows по умолчанию может выбрать IPv6. То есть если DNS или mDNS в локальной сети вернул сразу две записи:
A -> IPv4-адрес
AAAA -> IPv6-адрес
то подключение с windows-клиента часто пойдет именно по IPv6-адресу из AAAA. В обычной современной сети это нормально. IPv6 - не лишний протокол, а полноценная часть сетевого стека Windows. Но иногда из-за этого начинаются странные проблемы. Например:
• имя хоста резолвится нормально;
• ping может работать;
• по IPv4 сервис доступен;
• но приложение пытается подключиться по IPv6;
• а сам сервис IPv6 не слушает или работает с ним криво.
Особенно часто это всплывает со старыми приложениями, самописными сервисами, легаси-софтом, SMB-сценариями в рабочих группах и внутренними утилитами, которые всегда жили на IPv4.
"Симптомы могут выглядеть так:
по IP 192.168.x.x все открывается
по имени хоста - ошибка
соседний компьютер виден, но сервис не отвечает
приложение пишет timeout
в логах видно попытку подключения к IPv6"
Первый импульс - полностью отключить IPv6. Но это плохая идея. Microsoft не рекомендует полностью отключать IPv6 в Windows, потому что часть компонентов системы рассчитывает на его наличие.
Более аккуратный обходной путь - поднять приоритет IPv4 над IPv6 в prefix policy. Посмотреть текущую таблицу префиксов:
netsh interface ipv6 show prefixpolicies
Увеличить приоритет IPv4-mapped адресов можно так:
netsh interface ipv6 set prefix ::ffff:0:0/96 55 4
В некоторых инструкциях также встречается настройка для ::/96:
netsh interface ipv6 set prefix ::/96 60 3
После изменения стоит проверить таблицу еще раз:
netsh interface ipv6 show prefixpolicies
Смысл этих настроек в том, что винда меняет предпочтения при выборе адреса назначения. IPv6 остается включенным, но при наличии IPv4 и IPv6 система может начать чаще выбирать IPv4.
Проверить резолвинг можно так:
nslookup hostname
А доступность порта:
Test-NetConnection hostname -Port 445
#windows #network
NetworkAdmin
Если для удаленного хоста доступны и IPv4, и IPv6, Windows по умолчанию может выбрать IPv6. То есть если DNS или mDNS в локальной сети вернул сразу две записи:
A -> IPv4-адрес
AAAA -> IPv6-адрес
то подключение с windows-клиента часто пойдет именно по IPv6-адресу из AAAA. В обычной современной сети это нормально. IPv6 - не лишний протокол, а полноценная часть сетевого стека Windows. Но иногда из-за этого начинаются странные проблемы. Например:
• имя хоста резолвится нормально;
• ping может работать;
• по IPv4 сервис доступен;
• но приложение пытается подключиться по IPv6;
• а сам сервис IPv6 не слушает или работает с ним криво.
Особенно часто это всплывает со старыми приложениями, самописными сервисами, легаси-софтом, SMB-сценариями в рабочих группах и внутренними утилитами, которые всегда жили на IPv4.
"Симптомы могут выглядеть так:
по IP 192.168.x.x все открывается
по имени хоста - ошибка
соседний компьютер виден, но сервис не отвечает
приложение пишет timeout
в логах видно попытку подключения к IPv6"
Первый импульс - полностью отключить IPv6. Но это плохая идея. Microsoft не рекомендует полностью отключать IPv6 в Windows, потому что часть компонентов системы рассчитывает на его наличие.
Более аккуратный обходной путь - поднять приоритет IPv4 над IPv6 в prefix policy. Посмотреть текущую таблицу префиксов:
netsh interface ipv6 show prefixpolicies
Увеличить приоритет IPv4-mapped адресов можно так:
netsh interface ipv6 set prefix ::ffff:0:0/96 55 4
В некоторых инструкциях также встречается настройка для ::/96:
netsh interface ipv6 set prefix ::/96 60 3
После изменения стоит проверить таблицу еще раз:
netsh interface ipv6 show prefixpolicies
Смысл этих настроек в том, что винда меняет предпочтения при выборе адреса назначения. IPv6 остается включенным, но при наличии IPv4 и IPv6 система может начать чаще выбирать IPv4.
Проверить резолвинг можно так:
nslookup hostname
А доступность порта:
Test-NetConnection hostname -Port 445
#windows #network
NetworkAdmin