В очередном «конспекте админа» остановимся на еще одной фундаментальной вещи – механизме разрешения имен в IP-сетях. Кстати, знаете почему в доменной сети nslookup на все запросы может отвечать одним адресом? И это при том, что сайты исправно открываются. Если задумались – добро пожаловать под кат..


Для преобразования имени в IP-адрес в операционных системах Windows традиционно используются две технологии – NetBIOS и более известная DNS.


Дедушка NetBIOS


NetBIOS (Network Basic Input/Output System) – технология, пришедшая к нам в 1983 году. Она обеспечивает такие возможности как:


  • регистрация и проверка сетевых имен;


  • установление и разрыв соединений;


  • связь с гарантированной доставкой информации;


  • связь с негарантированной доставкой информации;


  • поддержка управления и мониторинга драйвера и сетевой карты.

В рамках этого материала нас интересует только первый пункт. При использовании NetBIOS имя ограниченно 16 байтами – 15 символов и спец-символ, обозначающий тип узла. Процедура преобразования имени в адрес реализована широковещательными запросами.


Небольшая памятка о сути широковещательных запросов.

Широковещательным называют такой запрос, который предназначен для получения всеми компьютерами сети. Для этого запрос посылается на специальный IP или MAC-адрес для работы на третьем или втором уровне модели OSI.


Для работы на втором уровне используется MAC-адрес FF:FF:FF:FF:FF:FF, для третьего уровня в IP-сетях адрес, являющимся последним адресом в подсети. Например, в подсети 192.168.0.0/24 этим адресом будет 192.168.0.255


Интересная особенность в том, что можно привязывать имя не к хосту, а к сервису. Например, к имени пользователя для отправки сообщений через net send.

Естественно, постоянно рассылать широковещательные запросы не эффективно, поэтому существует кэш NetBIOS – временная таблица соответствий имен и IP-адреса. Таблица находится в оперативной памяти, по умолчанию количество записей ограничено шестнадцатью, а срок жизни каждой – десять минут. Посмотреть его содержимое можно с помощью команды nbtstat -c, а очистить – nbtstat -R.



Пример работы кэша для разрешения имени узла «хр».



Что происходило при этом с точки зрения сниффера.


В крупных сетях из-за ограничения на количество записей и срока их жизни кэш уже не спасает. Да и большое количество широковещательных запросов запросто может замедлить быстродействие сети. Для того чтобы этого избежать, используется сервер WINS (Windows Internet Name Service). Адрес сервера администратор может прописать сам либо его назначит DHCP сервер. Компьютеры при включении регистрируют NetBIOS имена на сервере, к нему же обращаются и для разрешения имен.


В сетях с *nix серверами можно использовать пакет программ Samba в качестве замены WINS. Для этого достаточно добавить в конфигурационный файл строку «wins support = yes». Подробнее – в документации.

В отсутствие службы WINS можно использовать файл lmhosts, в который система будет «заглядывать» при невозможности разрешить имя другими способами. В современных системах по умолчанию он отсутствует. Есть только файл-пример-документация по адресу %systemroot%\System32\drivers\etc\lmhost.sam. Если lmhosts понадобится, его можно создать рядом с lmhosts.sam.


Сейчас технология NetBIOS не на слуху, но по умолчанию она включена. Стоит иметь это ввиду при диагностике проблем.


Стандарт наших дней – DNS


DNS (Domain Name System) – распределенная иерархическая система для получения информации о доменах. Пожалуй, самая известная из перечисленных. Механизм работы предельно простой, рассмотрим его на примере определения IP адреса хоста www.google.com:


  • если в кэше резолвера адреса нет, система запрашивает указанный в сетевых настройках интерфейса сервер DNS;


  • сервер DNS смотрит запись у себя, и если у него нет информации даже о домене google.com – отправляет запрос на вышестоящие сервера DNS, например, провайдерские. Если вышестоящих серверов нет, запрос отправляется сразу на один из 13 (не считая реплик) корневых серверов, на которых есть информация о тех, кто держит верхнюю зону. В нашем случае – com.


  • после этого наш сервер спрашивает об имени www.google.com сервер, который держит зону com;


  • затем сервер, который держит зону google.com уже выдает ответ.


Наглядная схема прохождения запроса DNS.


Разумеется, DNS не ограничивается просто соответствием «имя – адрес»: здесь поддерживаются разные виды записей, описанные стандартами RFC. Оставлю их список соответствующим статьям.


Сам сервис DNS работает на UDP порту 53, в редких случаях используя TCP.


DNS переключается на TCP с тем же 53 портом для переноса DNS-зоны и для запросов размером более 512 байт. Последнее встречается довольно редко, но на собеседованиях потенциальные работодатели любят задавать вопрос про порт DNS с хитрым прищуром.

Также как и у NetBIOS, у DNS существует кэш, чтобы не обращаться к серверу при каждом запросе, и файл, где можно вручную сопоставить адрес и имя – известный многим %Systemroot%\System32\drivers\etc\hosts.


В отличие от кэша NetBIOS в кэш DNS сразу считывается содержимое файла hosts. Помимо этого, интересное отличие заключается в том, что в кэше DNS хранятся не только соответствия доменов и адресов, но и неудачные попытки разрешения имен. Посмотреть содержимое кэша можно в командной строке с помощью команды ipconfig /displaydns, а очистить – ipconfig /flushdns. За работу кэша отвечает служба dnscache.



На скриншоте видно, что сразу после чистки кэша в него добавляется содержимое файла hosts, и иллюстрировано наличие в кэше неудачных попыток распознавания имени.


При попытке разрешения имени обычно используются сервера DNS, настроенные на сетевом адаптере. Но в ряде случаев, например, при подключении к корпоративному VPN, нужно отправлять запросы разрешения определенных имен на другие DNS. Для этого в системах Windows, начиная с 7\2008 R2, появилась таблица политик разрешения имен (Name Resolution Policy Table, NRPT). Настраивается она через реестр, в разделе HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\DnsClient\DnsPolicyConfig или групповыми политиками.



Настройка политики разрешения имен через GPO.


При наличии в одной сети нескольких технологий, где еще и каждая – со своим кэшем, важен порядок их использования.


Порядок разрешения имен


Операционная система Windows пытается разрешить имена в следующем порядке:


  • проверяет, не совпадает ли имя с локальным именем хоста;


  • смотрит в кэш DNS распознавателя;


  • если в кэше соответствие не найдено, идет запрос к серверу DNS;


  • если имя хоста «плоское», например, «servername», система обращается к кэшу NetBIOS. Имена более 16 символов или составные, например «servername.domainname.ru» – NetBIOS не используется;


  • если не получилось разрешить имя на этом этапе – происходит запрос на сервер WINS;


  • если постигла неудача, то система пытается получить имя широковещательным запросом, но не более трех попыток;


  • последняя попытка – система ищет записи в локальном файле lmhosts.

Для удобства проиллюстрирую алгоритм блок-схемой:



Алгоритм разрешения имен в Windows.


То есть, при запуске команды ping server.domain.com NetBIOS и его широковещательные запросы использоваться не будут, отработает только DNS, а вот с коротким именем процедура пойдет по длинному пути. В этом легко убедиться, запустив простейший скрипт:


@echo off
echo %time%
ping hjfskhfjkshjfkshjkhfdsjk.com
echo %time%
ping xyz
echo %time%
pause

Выполнение второго пинга происходит на несколько секунд дольше, а сниффер покажет широковещательные запросы.



Сниффер показывает запросы DNS для длинного имени и широковещательные запросы NetBIOS для короткого.


Отдельного упоминания заслуживают доменные сети – в них запрос с коротким именем отработает чуть по-другому.


Active Directory и суффиксы


Active Directory тесно интегрирована с DNS и не функционирует без него. Каждому компьютеру домена создается запись в DNS, и компьютер получает полное имя (FQDN — fully qualified domain name) вида name.subdomain.domain.com.


Для того чтоб при работе не нужно было вводить FQDN, система автоматически добавляет часть имени домена к хосту при различных операциях – будь то регистрация в DNS или получение IP адреса по имени. Сначала добавляется имя домена целиком, потом следующая часть до точки.


При попытке запуска команды ping servername система проделает следующее:


  • если в кэше DNS имя не существует, система спросит у DNS сервера о хосте servername.subdomain.domain.com;


  • если ответ будет отрицательный – система запросит servername.domain.com, на случай, если мы обращаемся к хосту родительского домена.

При этом к составным именам типа www.google.com суффиксы по умолчанию не добавляются. Это поведение настраивается групповыми политиками.



Настройка добавления суффиксов DNS через групповые политики.


Настраивать DNS суффиксы можно также групповыми политиками или на вкладке DNS дополнительных свойств TCP\IP сетевого адаптера. Просмотреть текущие настройки удобно командой ipconfig /all.



Суффиксы DNS и их порядок в выводе ipconfig /all.


Однако утилита nslookup работает немного по-другому: она добавляет суффиксы в том числе и к длинным именам. Посмотреть, что именно происходит внутри nslookup можно, включив диагностический режим директивой debug или расширенный диагностический режим директивой dc2. Для примера приведу вывод команды для разрешения имени ya.ru:


nslookup -dc2 ya.ru

------------
Got answer:
    HEADER:
        opcode = QUERY, id = 1, rcode = NOERROR
        header flags:  response, want recursion, recursion avail.
        questions = 1,  answers = 1,  authority records = 0,  additional = 0

    QUESTIONS:
        4.4.8.8.in-addr.arpa, type = PTR, class = IN

    ANSWERS:
    ->  4.4.8.8.in-addr.arpa
        name = google-public-dns-b.google.com
        ttl = 86399 (23 hours 59 mins 59 secs)

------------
TхЁтхЁ:  google-public-dns-b.google.com
Address:  8.8.4.4

------------
Got answer:

    HEADER:
        opcode = QUERY, id = 2, rcode = NOERROR
        header flags:  response, want recursion, recursion avail.
        questions = 1,  answers = 1,  authority records = 0,  additional = 0

    QUESTIONS:
        ya.ru.subdomain.domain.com, type = A, class = IN

    ANSWERS:
    ->  ya.ru.subdomain.domain.com
        internet address = 66.96.162.92
        ttl = 599 (9 mins 59 secs)

------------
Не заслуживающий доверия ответ:

------------
Got answer:

    HEADER:
        opcode = QUERY, id = 3, rcode = NOERROR
        header flags:  response, want recursion, recursion avail.
        questions = 1,  answers = 0,  authority records = 1,  additional = 0

    QUESTIONS:
        ya.ru.subdomain.domain.com, type = AAAA, class = IN

    AUTHORITY RECORDS:
    ->  domain.com
        ttl = 19 (19 secs)
        primary name server = ns-2022.awsdns-60.co.uk
        responsible mail addr = awsdns-hostmaster.amazon.com
        serial  = 1
        refresh = 7200 (2 hours)
        retry   = 900 (15 mins)
        expire  = 1209600 (14 days)
        default TTL = 86400 (1 day)

------------
Lь :     ya.ru.subdomain.domain.com
Address:  66.96.162.92

Из-за суффиксов утилита nslookup выдала совсем не тот результат, который выдаст например пинг:


ping ya.ru -n 1
Обмен пакетами с ya.ru [87.250.250.242] с 32 байтами данных:
Ответ от 87.250.250.242: число байт=32 время=170мс TTL=52

Это поведение иногда приводит в замешательство начинающих системных администраторов.


Лично сталкивался с такой проблемой: в домене nslookup выдавал всегда один и тот же адрес в ответ на любой запрос. Как оказалось, при создании домена кто-то выбрал имя domain.com.ru, не принадлежащее организации в «большом интернете». Nslookup добавляла ко всем запросам имя домена, затем родительский суффикс – com.ru. Домен com.ru в интернете имеет wildcard запись, то есть любой запрос вида XXX.com.ru будет успешно разрешен. Поэтому nslookup и выдавал на все вопросы один ответ. Чтобы избежать подобных проблем, не рекомендуется использовать для именования не принадлежащие вам домены.

При диагностике стоит помнить, что утилита nslookup работает напрямую с сервером DNS, в отличие от обычного распознавателя имен. Если вывести компьютер из домена и расположить его в другой подсети, nslookup будет показывать, что всё в порядке, но без настройки суффиксов DNS система не сможет обращаться к серверам по коротким именам.


Отсюда частые вопросы – почему ping не работает, а nslookup работает.


В плане поиска и устранения ошибок разрешения имен могу порекомендовать не бояться использовать инструмент для анализа трафика – сниффер. С ним весь трафик как на ладони, и если добавляются лишние суффиксы, то это отразится в запросах DNS. Если запросов DNS и NetBIOS нет, некорректный ответ берется из кэша.


Если же нет возможности запустить сниффер, рекомендую сравнить вывод ping и nslookup, очистить кэши, проверить работу с другим сервером DNS.


Кстати, если вспомните любопытные DNS-курьезы из собственной практики – поделитесь в комментариях.

Поделиться с друзьями
-->

Комментарии (13)


  1. zedalert
    15.06.2017 12:21

    Да какие там курьёзы, надо просто следовать стандартам и правилам, тогда Windows сеть работает чётко.


  1. vesper-bot
    15.06.2017 12:29

    Про политику разрешения имен с локальными суффиксами — ой мама, какие грабли! Реально, кому нужен такой функционал? Разве что типа проксировать запросы в Интернет, запретив на локальных станциях внешний DNS resolve. (Хотя чем не способ применения?)


    Про DNS-курьезы: Недавно один из серверов DNS стал отдавать внутренние адреса по запросам извне. Долго бились, оказалось, в ответы или пакеты передачи зоны (сервер secondary) влезала циска, за которой он сидел за натом, и правила адреса. Исправили, настроив NAT с флагом no-payload.


  1. Impet
    15.06.2017 12:39

    "|При использовании NetBIOS имя ограниченно 16 битами" — вероятно, байтами?


    1. Tri-Edge
      15.06.2017 12:41

      Точно, спасибо что указали на ошибку.


  1. periskop
    15.06.2017 14:49

    В статье хорошо бы еще смотрелось описание проблемы на Windows 10:

    И было бы интересно почитать про резолв, если есть несколько VPN-подключений.


    1. Tri-Edge
      15.06.2017 15:10

      Конфигурации с несколькими подключениями – скорее исключительный случай и потому не попала в статью. Я больше ориентировался на обычную локальную сеть.


    1. ildarz
      16.06.2017 10:59

      описание проблемы на Windows 10

      Там нет никакой "проблемы" (в том смысле, что разрешение имен корректно работает). Есть поведение, которое при определенных обстоятельствах можно считать угрозой безопасности, но тема безопасности в статье вообще не затрагивается.


  1. ifaustrue
    15.06.2017 17:43

    Каждому компьютеру домена создается запись в DNS, и компьютер получает полное имя (FQDN — fully qualified domain name) вида name.subdomain.domain.com.

    Я бы поправил последнее как name.subdomain.domain.zone.


  1. navion
    15.06.2017 23:14

    Суффикс добавляется только к неполным именам без точки на конце.

    А вообще, Microsoft писал отличную документацию во времена Windows Server 2003 в которой можно почерпнуть особенности реализации.


  1. ildarz
    16.06.2017 10:56
    +2

    Для преобразования имени в IP-адрес в операционных системах Windows традиционно используются две технологии – NetBIOS и более известная DNS.

    У вас на каждом скрине сниффера видны какие-то буковки LLMNR. В 2017 году подробно рассказывать про netbios и WINS и не упомянуть про это?


    В крупных сетях из-за ограничения на количество записей и срока их жизни кэш уже не спасает. Да и большое количество широковещательных запросов запросто может замедлить быстродействие сети. Для того чтобы этого избежать, используется сервер WINS (Windows Internet Name Service).

    Уменьшение количества броадкастов — это, конечно, хорошо, но WINS решает куда более серьезную проблему — разрешение имен NetBIOS работает только в пределах одного широковещательного сегмента.


    Но в ряде случаев, например, при подключении к корпоративному VPN, нужно отправлять запросы разрешения определенных имен на другие DNS. Для этого в системах Windows, начиная с 7\2008 R2, появилась таблица политик разрешения имен

    А в ОС, где эта политика не настроена или ее вообще нет, вопрос обычно решается тем, что используемый при подключении к VPN виртуальный адаптер получает нужные настройки (DNS, маршруты и т.п.) с самого VPN-сервера. Т.е. политики — это хорошо, но и до них, и без них жизнь вполне себе кипит.


    Для удобства проиллюстрирую алгоритм блок-схемой:

    По вашей блок-схеме ни одно имя короче 16 байт и не разрешимое через NetBIOS или WINS вообще не будет разрешено. Что, очевидно, не так.


    То есть, при запуске команды ping server.domain.com NetBIOS и его широковещательные запросы использоваться не будут, отработает только DNS, а вот с коротким именем процедура пойдет по длинному пути.

    Это не так. Причем ответ на вопрос "почему не так" лежит у вас чуть ниже по тексту, но в очень узком контексте. Вы почему-то наличие у хоста доменных суффиксов привязали к членству в домене AD, политикам и т.п., что неверно.


    Однако утилита nslookup работает немного по-другому: она добавляет суффиксы в том числе и к длинным именам.

    Неверно. Она добавляет суффиксы не к "коротким" или "длинным" в каком-либо смысле именам, а просто к любым неполным (без точки в конце).


  1. Dee3
    17.06.2017 12:01

    Active Directory тесно интегрирована с DNS и не функционирует без него. Каждому компьютеру домена создается запись в DNS, и компьютер получает полное имя (FQDN — fully qualified domain name) вида name.subdomain.domain.com.

    Для того чтоб при работе не нужно было вводить FQDN, система автоматически добавляет часть имени домена к хосту при различных операциях – будь то регистрация в DNS или получение IP адреса по имени. Сначала добавляется имя домена целиком, потом следующая часть до точки.

    Это все прекрасно, имена рабочих станций AD знает. А как она узнает IP, для привязки в DNS, если DHCP работает отдельно а не в связке с AD? В случае с динамическими IP адресами получается DNS не работает, тк. IP сменился, и уже по имени доступа к машине не будет


    1. ildarz
      17.06.2017 18:25

      А как она узнает IP, для привязки в DNS, если DHCP работает отдельно а не в связке с AD?

      Хосты сами регистрируются, и к способу выдачи IP это никакого отношения не имеет. Читайте про динамический DNS.


  1. ildarz
    17.06.2017 18:25

    [промах]