# DNS

### Лекция

<iframe width="560" height="315" src="https://www.youtube.com/embed/bzqS7d0nOPg" frameborder="0" allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

## 3 сетевых точки работы домена 📍

[![![](/img/dns_scheme.png)](https://flag-docs.storage.yandexcloud.net/storage-prod/uploads/images/gallery/2022-12/scaled-1680-/image-1670161126712.png)](https://flag-docs.storage.yandexcloud.net/storage-prod/uploads/images/gallery/2022-12/image-1670161126712.png)

### Регистратор

- Место, где регистрируются **домены**
- У регистратора хранится информация о владельце домена
- У регистратора задаются **NS-записи** для домена
- 💰 Домен стоит от 500 руб/год


### Хостинг DNS


- Место, где хранятся **все DNS-записи домена, кроме NS-записей**
- Часто такую услугу предлагает и регистратор, и веб-хостинг
- DNS-хостинг, обычно, связывает между собой домен и сервер (A-запись). Но кроме этого выполняет еще ряд функций
- 💰Большинство DNS-хостингов бесплатны или почти бесплатны

### Веб-хостинг

- Сервер, на котором физически распологаются исполняемые скрипты сайта, а также, чаще всего, база данных сайта
- Веб-хостинг обычно предоставляет для каждого сервера отдельный **IP-адрес** (иногда их два: IPv4 и IPv6)
- 💰 В среднем от 1000 руб/мес (минимально рабочая VPS с отдельным файловым хранилищем)

#### О независимости трех точек

Интересно во всей этой схеме то, что эти три сетевых точки часто обслуживаться у разных провайдеров и ими могут владеть разные люди. Например, вы можете владеть доменом, но не иметь доступа к веб-хостингу. Понимая это обстоятельство вы можете, например, разместить свой сайт на чужом домене, не давая владельцу домена доступа к коду. Или, наоборот, вы можете купить домен и разместить на нем не принадлежащий вам SaaS сервис типа Tilda или Medium.

---

## Типы DNS-записей и их параметры ⛓

- **NS** 👑 — запись, связывающая домен и DNS-хостинг. Их может быть несколько. В первую очередь будет использоваться запись с наименьшим приоритетом
- **A** 🌐 — запись для сопоставления доменного имени (например, domain.ru) и IPv4-адреса сервера (например, 192.168.0.1)
- **АААА** 🌐 — то же самое, но для IPv6 адреса (например, 2a03:6f00:1::5c35:6084)
- **MX** 📧 — запись, необходимая для работы почты на домене (например, info@domain.ru). Указывает на домен, на котором работает почтовый сервер (например, mail.domain.ru)
- **TXT** 📝 — запись, в которой просто хранится текст. Обычно используется для подтверждения владения доменом и подобного.
- **CNAME** 🎭 — запись-алиас. То же, что и **A** запись, но ссылается не на IP, а на домен
- **SOA** ℹ️ - запись, содержащая инфу о DNS-регистраторе и владельце домена. Обычно, она создается автоматически. У каждого домена обязательно есть одна SOA-запись

Обратите внимание, что значением записей **A** и **AAAA** может быть только IP-адрес, а не домен или его часть. Именно для обхода этого ограничения была создана запись **CNAME**.

### Примеры записей

| Тип записи | Имя записи | Значение | Результат |
| --- | --- | --- | --- |
| A | flagsoft.ru (или @) | 95.217.16.92 | Домен flagsoft.ru размещен на сервере с IP 95.217.16.92 |
| A | www.flagsoft.ru (или www) | 95.217.16.92 | Поддомен www домена flagsoft.ru размещен на том же ip |
| AAAA | flagsoft.ru (или @) | 2a01:4f9:c010:5ccf:: | Домен flagsoft.ru размещен на сервере с IP 2a01:4f9:c010:5ccf:: |
| MX | flagsoft.ru или @ | mx.yandex.net. | Почтовые ящики вида info@flagsoft.ru обслуживаются Яндекс.Почтой |
| NS | flagsoft.ru | ns1.digitalocean.com. | Домен делегирован на NS сервера Digital Ocean. Такая запись обычно размещается у регистратора домена |
| TXT | flagsoft.ru | google-site-verification=usZ... | TXT-запись, которую мы прописали для домена flagsoft.ru, чтобы подтвердить, что это наш домен. У TXT-записей в значении может быть произвольный набор символов |

### Скорость применения изменений

- **NS** могут применяться долго, до нескольких часов
- **A**, **MX**, **TXT** и все остальные записи, кроме **NS** обычно применяются быстро, за несколько минут

---

## IPv4 и IPv6

Пример IPv4: `95.217.16.92`

Пример IPv6: `2a01:4f9:c010:5ccf:4f9:5ccf` (`2a01:4f9:c010:5ccf::` тоже валидный)

### История

IP-адреса с начала интернета были IPv4. Затем, они стали кончаться. Для решения проблемы был создан стандарт IPv6. Согласно статистике Google на январь 2020 года, доля IPv6 в сетевом трафике составляла около 30 %.

### Количество адресов

Общее возможное количество адресов IPv4 — 4,3 миллиарда (2^32).

Общее количество IPv6-адресов — 2^128. Теоретически для IPv6 доступны 340,282,366,920,938,463,463,374,607,431,768,211,456 адреса или 340 ундециллионов (это число 340, за которым следует 36 нолей).

---

## Инструменты для анализа DNS 🛠


### Узнать DNS-провайдера и регистратора

Менеджерам следует пользоваться сервисами https://www.cy-pr.com/ или https://www.nic.ru/whois/.

<!-- ![](/img/cy-pr.png) -->


Консольная команда для разработчиков

```bash
whois domain.ru
```

### Узнать **все** DNS-записи домена

Менеджерам для проверки DNS-записей можно воспользоваться онлайн-сервисом https://www.reg.ru/nettools/dig

<!-- ![](/img/regru_dig.png) -->

Консольная команда для разработчиков

```bash
dig <website.ru> any
```

### Узнать IP

Менеджеры могут посмотреть прямо через браузер. Это надежнее, чем онлайн-сервисы, потому что такой способ учитывает влияние файла hosts (о нем ниже).

[![](https://flag-docs.storage.yandexcloud.net/storage-prod/uploads/images/gallery/2022-12/scaled-1680-/image-1670161158954.png)](https://flag-docs.storage.yandexcloud.net/storage-prod/uploads/images/gallery/2022-12/image-1670161158954.png)

Аналог для разработчиков

```bash
ping domain.ru
```

### Боремся с кэшем DNS у нашего интернет-провайдера

DNS-записи кэшируются у разных интернет-провадйеров по разному, поэтому после смены этих записей, пользователи разных провайдеров могут какое-то время видеть разный сайт: кто-то будет видеть старый, кто-то новый. У нас в офисе интернет-провайдер, у которого медленно обновляется кэш DNS, поэтому для проверки стоит либо зайти на сайт через телефон (через сотовую связь, не используя Wi-Fi), либо воспользоваться сервисом **Netrenderer**, либо настроить использование сторонних DNS. Проще всего, использовать **Netrenderer**. В перспективе удобнее прописать сторонние DNS на компьютере.

1. Посмотреть на телефоне, используя 3G (LTE, EDGE), а не Wi-Fi.

2. http://netrenderer.com - онлайн сервис, с помощью которого можно посмотреть на сайт из интернета, чтобы проверить применились ли DNS-записи у других пользователей. Важно понимать, что сервис создан не для этого, а для проверки отображения сайта в Internet Explorer. Поэтому не стоит смотреть на верстку, а только на то, отображается ли правильный сайт.

3. Прописать сторонние DNS на компьютере можно с помощью инструкции. Используйте **8.8.8.8** и **1.1.1.1**, это максимально актуальные и, при этом, бесплатные DNS-провайдеры. Пример инструкции (их полно в сети) https://vynesimozg.com/izmenit-adres-dns-servera-v-windows-10/

### Управляем парой домен-IP самостоятельно

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


Файл hosts позволяет на вашем локальном компьютере "насильно" сопоставить домен и IP-адрес. Это нужно, например, для того, чтобы проверить как работает сайт, до того, как на него будет переключен домен.


В Linux и MacOS этот файл расположен по адресу `/etc/hosts`
В Windows он расположен в `c:\windows\system32\drivers\etc\hosts`


Так как файл `hosts` является системным, то в любой ОС вам понадобятся права администратора для изменения этого файла.


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


Пример содержимого файла hosts:

```bash
135.181.82.90 m2data.net
192.241.249.96 new.pixelbuddha.net
```

На Windows можно воспользоваться программой https://hostsfileeditor.com/ Хотя я ее еще не пробовал ставить, так что аккуратнее.