Заметки о DNS

Разное:

  • DNS запросы/ответы обычно передаются в виде UDP, но если ответ слишком большой, то TCP сервер может отправить ошибку клиенту, после которой клиент подключится к серверу по TCP.
  • Никогда не забываем что host файл смотрится перед запросом к DNS, причем даже на телефонах
  • DNSSEC – безопасный DNS. Подробнее в security.
  • public DNS, использовать рекомендуется только для траблшутинга т.к. в теории возможен перехват запроса и подмена DNS ответа, если запрос не зашифрован (чаще всего)
1.1.1.1 CloudFlare
8.8.8.8 Google
8.8.4.4 Google
4.2.2.4 Level3 (от 4.2.2.1 до 4.2.2.6)

Типы DNS серверов (любой DNS может выполнять все роли) и зон:

  • Recursive – выполняют full-resolution (начиная от Root, кончая Authoritive) DNS-запрос для резолва имени в IP. Обычно это сервера ISP/LAN, чаще всего роли recursive и cashing выполняются на одном сервере.
  • Cashing – сохраняют информацию из ответа на какое-то время в памяти, чтобы не делать full-resolution DNS-запрос при обращении к тому-же домену. Обычно это сервера ISP/LAN, чаще всего роли recursive и cashing выполняются на одном сервере. Время хранение записи о FQDN можно ограничить используя DNS TTL – администратор сайта может в конфигурации зоны задать максимальное количество секунд (обычно счет в минутах для сайтов типа google/yandex/amazon, часах и реже днях для обычных) хранения записей в cash до удаления на DNS-серверах, которые запрашивают резолв домена из зоны. Кеш так же есть и на обычных ПК, поэтому запросы DNS могут совсем отсутствовать после заполнения кеша. Посмотреть TTL можно используя nslookup в интерактивном режиме и установив set debug.
  • Root – корневые сервера, отвечают за за root зону, отдают в ответе на запрос адреса серверов доменов верхнего (Top level domain (TLD) like .com, .net, .ru). Их формально всего 13 штук, посмотреть непосредственно на сайте http://root-servers.org или в wiki.
  • TLD (top level domain) – сервера доменов верхнего уровня, отвечают за конкретную TLD зону, отдают в ответе на запрос адреса серверов домена второго уровня (Authoritive like weril.me, redkin.net).
  • Authoritive – отвечают за резолв домена и нижестоящих доменов (напр. weril.me, life.weril.me, 11.22.33.weril.me). За домены третьего уровня (life.weril.me) уровня может отвечать как один сервер, так и специальный сервер для каждого домена (основной сервер выдает с помощью SOA записи сервер, ответственный за нижестоящую зону).

DNS записи бывают разных типов. Используя nslookup можно запросить не только A-запись, но и другие. Весь список DNS-записей можно посмотреть тут, ниже самые популярные:

  • Запись А – указывает IPv4 для доменного имени. Основная запись. В общем случае под DNS-запросом имеется именно запрос А записи. В базовом случае одна А-запись указывает на один домен, но может быть и несколько А-записей для одного домена. Несколько записей позволяют реализовать DNS round robin (balancing, redundancy) – список серверов для каждого клиента будет один, но в разном порядке (1-2-3-4, 2-3-4-1, 3-4-1-2, etc).
Вообще Round Robin используется во многих системах, например в QoS очереди могут диспетчеризироваться по алгоритму Round Robin. Но чаще используется Weighted Round Robin (WRR), который позволяет указывать вес каждой очереди (напр. на 3 пакета очереди №1 отдает 1 пакет очереди №2). К этому может добавляется Priority Queuing - при получения пакета из этой очереди он в любом случае отдается первым, а остальное на основе WRR. В результате рождается конструкция 1 PQ + 3 WRR. Цифры обозначают количество очередей.
  • Запись AAAA (quad A) –  аналог Записи A, только возвращает IPv6 адрес для доменного имени.

  • Запись MX (mail exchange) – указывает способ маршрутизации mail. Тут указывается почтовый сервер, на который нужно перенаправлять почту для этого DNS домена.
  • Запись CNAME – используется для перенаправления с одного домена на другой, в том числе в кейсе www.example.com -> example.com (можно сделать две или несколько A-записей, но проще и лучше одну CNAME)
  • Запись SRV – service record, используется для указания местоположения разных конкретных сервисов (не только для почты, как MX). Например сервер SIP, CalDAV, etc.
  • Запись TXT – изначально предполагалось использование как описание для домена, но произвольная форма позволила использовать его в других назначениях – передавать данные, которые не относились изначально к роли DNS. Например, настройки конфигурации, верификации сайтов, дополнительной информация о электронном письме. Его так же используют для передачи домена от одного хозяина домена или регистратору другому – настроив в TXT нужную информацию для регистратора/админа-приемника, регистратор/админ-приемник понимает, что ты управляешь доменом и соглашаешься на его миграцию.
  • Записи SOA (Start Of Authority) – используется в файле dns-конфига для указания сервера, ответственного за какую-то зону.
  • Запись NS – указывает на дополнительные DNS сервера, которые отвечают за запрашиваемую зону, используется для отказоустойчивости
  • Запись PTR (Pointer Resource Record) – хранит информацию для Reverse lookup. Reverse lookup позволяет получить по IP хоста его FQDN.
NSLOOKUP & DIG
nslookup без всего на FQDN  выдает А запись для домена через DNS сервер по умолчанию. Аналог nslookup – dig.
Используя интерактивный режим можно изменить это поведение:
1) задав переменную server (просто прописав в интерактивном режиме server x.x.x.x) можно поменять DNS для резолва
2) задав set type=MX/AAAA/TXT/NS можно запросить информацию по конкретному типу
3) задав set debug можно увидеть все-все
Пример разбора запроса-ответа на A record.
$ sudo tcpdump -i eth0 -vn host 8.8.8.8 and port 53
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
21:02:36.484819 IP (tos 0x0, ttl 64, id 32534, offset 0, flags [none], proto UDP (17), length 68)
10.0.0.2.40596 > 8.8.8.8.53: 64482+ [1au] A? example.com. (40)
21:02:36.486077 IP (tos 0x0, ttl 115, id 11509, offset 0, flags [none], proto UDP (17), length 84)
8.8.8.8.53 > 10.0.0.2.40596: 64482$ 1/0/1 example.com. A 93.184.216.34 (56)

The first packet is the DNS query, which is our question (from the second terminal) going to the server. Note that, in this case, the traffic is UDP. Tcpdump's analysis of the DNS query begins right after the UDP checksum field. It starts with the DNS ID number, followed by some UDP options, then the query type (in this case A? which means we're asking for an A record). Next is the domain name we're interested in (example.com). The second packet is the response from the server, which includes the same DNS ID from the original query, followed by the original query. After this is the answer to the query, which contains the IP address associated with the domain name.
Запрашиваем A запись о домене example.com у DNS 8.8.8.8
dig @8.8.8.8 A example.com

Leave a Reply