Код, интерфейсы и трафик без воды
lawebbox
Серверы и безопасность

Доменное имя и адрес сервера: как работает связка

В логах всё выглядит жестоко просто: пользователь вводит site.ru, а браузер в итоге подключается к IP-адресу. Между этими двумя точками — DNS, кэш резолвера, делегирование зоны, правила веб-сервера, HTTP Host и TLS SNI.

Доменное имя и адрес сервера: как работает связка

Выпадает один слой — и твой проект получает классический набор проблем: сайт открывается не у всех, отдается чужой виртуальный хост или HTTPS показывает ошибку сертификата.

Связь «доменное имя — адрес сервера» не равна одной A-записи. Это целая цепочка. И если ты управляешь сайтом, миграцией, CDN или инфраструктурой клиента, её надо видеть целиком. Иначе будешь менять IP в панели регистратора, ждать «пропагацию» и удивляться, почему лиды уже пришли на сервер, а браузер всё ещё ругается на TLS.

DNS приводит пользователя к сети. Но именно веб-сервер и TLS решают, какой сайт он реально увидит.

Домен — не URL и не сервер

Начнём с терминов. Потому что именно здесь команды регулярно теряют часы.

Доменное имя — читаемый человеком идентификатор в системе DNS. Например, example.com. Оно состоит из меток, разделённых точками: api.eu.example.com. DNS устроен как дерево: корневая зона, доменная зона верхнего уровня, зона домена, затем поддомены.

У меток есть технические границы:

  • одна метка — от 0 до 63 октетов;
  • полное доменное имя — до 255 октетов, включая точки-разделители;
  • домен не обязан соответствовать одному IP;
  • один IP легко обслуживает десятки, сотни и тысячи доменов.

URL — это уже адрес конкретного ресурса в приложении. В нём есть схема, хост, порт, путь и иногда параметры:

https://app.example.com:443/catalog?utm_source=email

Здесь app.example.com — имя хоста. Это часть URL, которую браузер передаст в DNS-резолвер. Но https, /catalog и параметры кампании DNS вообще не интересуют. DNS не знает, какая страница нужна пользователю. Он знает только, куда направить сетевой запрос для конкретного имени.

IP-адрес — сетевой адрес узла. Для IPv4 это привычная запись из четырёх чисел. Для IPv6 — 128-битный адрес; его публикуют в DNS через запись AAAA. У типа AAAA есть даже числовой код — 28. Не то чтобы это поможет тебе в админке, но показывает масштаб: это не «поле в панели хостинга», а старый и чётко стандартизированный протокол.

А сервер — вообще отдельная сущность. Это может быть VPS, Kubernetes ingress, балансировщик, CDN edge-узел, reverse proxy или облачная платформа. Доменное имя не «прикрепляется к серверу» магически. Ты создаёшь DNS-запись, которая помогает клиенту найти нужный сетевой маршрут. Затем сервер должен быть готов принять запрос именно для этого имени.

Вот где рождается профит от правильной модели в голове: ты перестаёшь лечить DNS там, где сломан Nginx, и не перевыпускаешь сертификат там, где завис старый кэш.

Иерархия DNS: кто знает адрес твоего домена

Когда браузер хочет открыть www.example.com, он не отправляет запрос сразу на сервер сайта. Сначала операционная система или браузер обращается к DNS-резолверу — обычно это сервис провайдера, корпоративная сеть или публичный DNS.

Дальше происходит поиск по иерархии.

1. Резолвер смотрит кэш. Если актуальный ответ уже сохранён, он немедленно возвращает IP. Это быстрый сценарий.

2. Если кэша нет, начинается рекурсивное разрешение. Резолвер спрашивает корневую DNS-инфраструктуру: кто отвечает за зону верхнего уровня, например .com.

3. Серверы TLD направляют дальше. Они возвращают NS-записи — адреса авторитетных DNS-серверов, которым делегирован конкретный домен.

4. Авторитетный сервер зоны отдаёт нужную запись. Например, A для IPv4, AAAA для IPv6 или CNAME, ведущую к каноническому имени.

5. Резолвер возвращает результат клиенту и кэширует его на время TTL.

Исторически фундамент DNS описан ещё в RFC 1034 и RFC 1035, опубликованных в ноябре 1987 года. С тех пор интерфейсы панелей стали глянцевее, а архитектура осталась узнаваемой: дерево имён, делегирование ответственности, авторитетные ответы и кэширование.

Для проекта это означает одно: регистрация домена и настройка сайта — два разных процесса.

Ты купил brand.ru? Отлично, ты получил право управлять именем в рамках правил реестра и регистратора. Но сайт не появится автоматически. Нужно:

  • настроить делегирование на NS-серверы DNS-провайдера;
  • создать записи в зоне;
  • подготовить сервер, CDN или балансировщик;
  • настроить виртуальный хост;
  • выпустить и подключить сертификат;
  • проверить, что приложение принимает нужный Host.

На практике «домен не работает» часто означает не одну проблему, а две или три, наложенные друг на друга. DNS уже отдаёт правильный IP. Но сервер по этому IP возвращает дефолтную заглушку. Или сервер готов, но сертификат выпущен на старое имя. Или всё работает из твоей сети, потому что локальный резолвер уже увидел новый ответ, а часть аудитории ещё сидит на старом кэше.

Записи DNS: где команды делают самые дорогие ошибки

DNS-зона — это не поле «вставь IP». Это набор ресурсных записей с разными задачами. Не пытайся решить всё одной записью. Раздели роли.

ЗаписьЧто делаетТипичный сценарийЛовушка
AСвязывает имя с IPv4-адресомexample.com → IP балансировщика или сервераСчитать, что один A гарантирует работу сайта
AAAAСвязывает имя с IPv6-адресомПоддержка IPv6 на edge или originПубликовать AAAA, когда сервер не обслуживает IPv6
CNAMEДелает имя псевдонимом другого имениwww → целевой хост CDNСтавить рядом CNAME и A/MX/TXT/NS на одном имени
NSДелегирует DNS-зону авторитетным серверамПередача управления зоной DNS-провайдеруУказывать серверы, которые фактически зависят от одной точки отказа
MXНаправляет почту доменаПочта на example.comЛомать MX, меняя записи без инвентаризации
TXTХранит текстовые политики и подтвержденияSPF, DKIM, верификация сервисовЗатирать существующие значения при добавлении нового сервиса

Самая частая ловушка — CNAME. Это не «универсальная ссылка на что угодно». CNAME говорит: данное имя — псевдоним другого канонического имени. Поэтому рядом с ним не должно быть других DNS-данных для того же имени: ни A, ни MX, ни TXT, ни NS.

Плохой сценарий выглядит так: маркетинг просит подключить внешний сервис на promo.example.com, разработчик ставит CNAME, потом почтовый сервис требует TXT на это же имя, и кто-то добавляет запись в панели. Результат зависит от панели и поведения конкретного провайдера, но архитектурно ты уже создал конфликт. Не лечи его «попробуем ещё одну запись». Разнеси имена по ролям.

Отдельный нерв — apex домена, то есть example.com без www. В классической DNS-модели нельзя просто положить CNAME на имя, где уже нужны SOA и NS. Многие DNS-провайдеры предлагают ALIAS, ANAME или CNAME flattening — удобные платформенные механики. Они могут дать нужный эффект, но это уже не обычный CNAME в чистом виде. Не переноси настройки между провайдерами копипастой. Сначала пойми, какую именно абстракцию тебе продаёт панель.

Делегирование: не превращай DNS в single point of failure

NS-записи отвечают за делегирование: они говорят интернету, какие серверы авторитетны для зоны. В технических проверках делегирований для зон, которыми управляет IANA, требуется не меньше двух NS-записей. При этом их имена не должны разрешаться в один IP, а сети проверяются на топологическое разделение.

Не надо механически превращать это в «два NS всегда спасают любой домен». Но гипотеза железная: два сервера с разными красивыми именами не дают отказоустойчивости, если оба сидят на одной инфраструктуре, в одной сети или за одним провайдерским контуром.

Проверь не только количество NS. Проверь реальную независимость:

  • разные ли IP получают имена NS;
  • нет ли общего DNS-кластера под разными брендами;
  • не завязана ли авторитетная зона на тот же сервер, который ты мигрируешь;
  • есть ли доступ у команды к аккаунту DNS-провайдера, а не только у бывшего подрядчика;
  • документированы ли записи, которые держат почту, аналитику, платежи и сторонние интеграции.

DNS — это контрольная плоскость бизнеса. Потерял доступ к зоне — ты не просто не можешь поменять сайт. Ты не можешь быстро вернуть трафик, почту и верификации после инцидента.

Один IP на двух NS — это не резервирование. Это два указателя на одну проблему.

TTL и «пропагация»: почему новый IP видят не все

Слово «пропагация» звучит так, будто интернет должен синхронно получить пуш-уведомление о твоей новой A-записи. Нет. DNS работает через кэши.

У каждой ресурсной записи есть TTL — время, в течение которого резолвер может хранить ответ и не спрашивать авторитетный сервер заново. Пока TTL не истёк, разные пользователи и разные резолверы могут получать старые данные. Именно поэтому смена IP не становится видна «во всём интернете мгновенно».

Что реально влияет на картину:

  • TTL, который был у старой записи до изменения;
  • момент, когда конкретный резолвер закэшировал ответ;
  • локальный кэш ОС, браузера или корпоративной сети;
  • отдельные кэши CDN и приложений;
  • наличие нескольких A или AAAA-записей;
  • ошибка в самих авторитетных DNS-серверах.

Ставить TTL всегда минимальным — не growth-хак, а ленивый рефлекс. Низкий TTL даёт больше гибкости при миграции, но увеличивает частоту запросов к авторитетной зоне. Высокий TTL экономит запросы и делает ответы стабильнее, но ухудшает управляемость в день переезда.

Рабочая схема другая: планируй изменение заранее.

Сначала снизь TTL у изменяемой записи до значения, которое соответствует твоему окну миграции. Подожди, пока прежный высокий TTL выгорит из кэшей. Затем переключай адрес. После стабилизации возвращай TTL к нормальной для твоей инфраструктуры политике. Универсального числа здесь нет: у лендинга на одном VPS, SaaS с балансировщиками и высоконагруженного edge-контура разные риски.

И не забудь про IPv6. Если у имени есть AAAA-запись, часть клиентов выберет IPv6-маршрут. Ты можешь идеально обновить A-запись и продолжать видеть ошибки у части аудитории, потому что AAAA ведёт на старый или недоступный узел. Это особенно неприятный баг: команда тестирует по IPv4, метрики проседают на части сетей, а причина скрыта в одной забытой записи.

DNS-серверы принимают запросы и по UDP, и по TCP на порту 53. Открыть только UDP/53 — недостаточно для всех сценариев. Это касается тех, кто поднимает авторитетные DNS самостоятельно или строит строгие сетевые политики. Если не хочешь получать ночные сюрпризы, не проектируй инфраструктуру по принципу «у меня с ноутбука ответило».

IP найден. Почему сервер всё равно может отдать чужой сайт

Допустим, DNS сработал. Браузер получил IP и установил соединение. Кажется, финиш? Только начинается второй акт.

Один IP-адрес может обслуживать много сайтов. Это называется виртуальным хостингом. На одном Nginx, Apache, ingress-контроллере или CDN endpoint могут жить:

  • example.com;
  • www.example.com;
  • api.example.com;
  • домены десятков клиентов;
  • технические поддомены;
  • старые имена, которые команда забыла удалить.

Чтобы сервер понял, какой контент отдать, HTTP-запрос передаёт имя хоста в заголовке Host. В HTTP/2 и HTTP/3 ту же смысловую роль несёт поле :authority. Сервер читает имя, сравнивает его с настройкой виртуальных хостов и выбирает нужный сайт.

Вот почему правильная привязка домена к IP сервера не гарантирует правильный ответ приложения.

Представь типовой провал миграции. Ты создаёшь A-запись для newsite.ru, она указывает на новый IP. Браузер приходит на сервер. Но в Nginx нет server_name newsite.ru; есть только дефолтный server для другого проекта. Пользователь видит чужой лендинг, системную страницу или 404. DNS абсолютно здоров. Ошибка — на HTTP-уровне.

Проверь связку полностью:

1. DNS возвращает ожидаемые A и AAAA.

2. Сетевой адрес принимает соединения на нужном порту.

3. Reverse proxy или веб-сервер содержит виртуальный хост для домена и варианта с www.

4. Приложение знает свой публичный URL и не редиректит пользователя на внутреннее имя.

5. CDN передаёт корректный Host к origin, если это предусмотрено архитектурой.

6. Дефолтный виртуальный хост не раскрывает чужие сайты и служебные панели.

Последний пункт недооценивают. Дефолтный vhost — это не мусорная корзина. Сделай там нейтральный отказ, а не старый клиентский сайт. Иначе любой неизвестный домен, который случайно укажет на твой IP, станет поводом для путаницы, проблем с кэшем и странных обращений в поддержку.

Кстати, ту же дисциплину полезно перенести на фронтенд: адреса, редиректы и канонические URL — часть интерфейса продукта, а не декоративная мелочь. Вопрос «стоит ли платить профессионалу за дизайн интерьера» кажется далёким от DNS, но логика знакомая: базу можно собрать самому, а цена ошибки проявляется в деталях, которые пользователь замечает сразу. В инфраструктуре таким «интерьером» становятся редиректы, сертификаты, ошибки в Host и первый экран, который открывается не на том домене.

HTTPS: SNI приходит раньше HTTP Host

С HTTP всё логично: сервер получил запрос, увидел Host, выбрал виртуальный сайт. Но HTTPS добавляет шифрование. До того как браузер отправит обычный HTTP-запрос, он должен установить TLS-соединение и проверить сертификат.

И тут возникает проблема виртуального хостинга: как серверу выбрать правильный сертификат, если HTTP Host ещё скрыт внутри будущего шифрованного канала?

Ответ — SNI, Server Name Indication. Это расширение TLS, описанное в RFC 6066 в январе 2011 года. Клиент передаёт имя сервера уже в сообщении ClientHello. Сервер видит, к какому домену идёт подключение, и отдаёт подходящий сертификат.

Цепочка HTTPS выглядит так:

1. Браузер резолвит доменное имя через DNS.

2. Подключается к полученному IP на 443-м порту.

3. В TLS ClientHello передаёт SNI с именем хоста.

4. Сервер выбирает TLS-конфигурацию и сертификат.

5. Браузер проверяет, что сертификат действителен для запрошенного имени.

6. После TLS-рукопожатия браузер отправляет HTTP-запрос с Host или :authority.

7. Веб-сервер выбирает приложение и отдаёт ответ.

Это две разные проверки имени на двух слоях. SNI выбирает сертификат до HTTP. Host выбирает виртуальный сайт внутри HTTP. Не смешивай их.

Если A-запись указывает на правильный IP, но сертификат выпущен для old.example.com, браузер остановит пользователя ошибкой. Если сертификат покрывает имя, но Nginx не знает нужный server_name, TLS может пройти, а пользователь попадёт в дефолтный сайт. Если CDN завершает TLS на edge, а origin ждёт другой Host, клиент увидит одну проблему, а у тебя в логах будет совсем другая.

Проверь покрытие имён, а не только «сертификат зелёный»:

  • example.com и www.example.com — это разные имена для TLS;
  • поддомены вроде api.example.com требуют отдельного покрытия, если не используется подходящий wildcard;
  • сертификат должен быть действителен именно для имени, которое запросил клиент;
  • редирект с HTTP на HTTPS не исправит сертификатную ошибку: браузер сначала должен безопасно установить HTTPS-сессию;
  • тестируй домен, а не только IP, потому что при прямом заходе по IP SNI обычно не соответствует рабочей конфигурации.

И ещё один жёсткий инсайт: не открывай origin-IP всему интернету, если архитектура построена вокруг CDN или WAF. Иначе атакующий обходит защитный edge, подключается прямо к серверу и проверяет, как твой origin ведёт себя с разными Host и SNI. Ограничивай доступ сетевыми правилами, доверенными диапазонами или mTLS там, где это оправдано. Защита от DDoS и веб-уязвимостей начинается не с красивого облачного бейджа, а с реальной границы доступа.

Разбирай инцидент по слоям, а не по ощущениям

Когда проект «не открывается», не делай десять изменений одновременно. Это убивает диагностику. Тебе нужна последовательность, где каждый слой даёт чёткий сигнал.

Слой DNS. Какой NS авторитетен для зоны? Какие A и AAAA возвращаются? Совпадает ли ответ у авторитетного сервера и у публичного резолвера? Какой TTL у записи?

Слой сети. Доступен ли нужный IP и порт? Нет ли разницы между IPv4 и IPv6? Не режет ли трафик firewall, security group или балансировщик?

Слой TLS. Какой сертификат реально отдаётся для нужного SNI? Есть ли в нём запрошенное имя? Не истёк ли срок, не сломана ли цепочка?

Слой HTTP. Какой virtual host выбирается для Host? Какой статус, редирект и контент отдаёт сервер? Не утекает ли технический домен в Location или canonical?

Слой приложения. Правильно ли выставлены публичный base URL, trusted hosts, CORS, cookie domain и callback URL внешних сервисов?

Это не бюрократия. Это быстрый способ не сжечь день на хаотичных правках. Воронка инцидента становится прозрачной: на каком шаге пользователь перестал получать ожидаемый ответ — там и работай.

Внедри это до следующей миграции

Твой домен — не наклейка на сервер. Это маршрут, контракт имени и набор зависимостей. Хорошо собранная связка даёт аптайм, чистую индексацию, стабильные редиректы и меньше потерь в момент запуска. Плохо собранная — съедает CTR, заявки и доверие ещё до того, как пользователь увидел интерфейс.

Сделай сегодня пять вещей:

1. Собери карту DNS-зоны. Отметь A, AAAA, CNAME, MX, TXT и NS. Подпиши владельца каждой записи и сервис, который она поддерживает.

2. Проверь IPv4 и IPv6 отдельно. Не считай A-запись единственной реальностью, если в зоне уже есть AAAA.

3. Настрой явные виртуальные хосты. Для основного домена, www, API и технических имён. Дефолтный vhost пусть безопасно отказывает.

4. Прогони HTTPS по настоящим именам. DNS-ответ, SNI, сертификат, Host, редирект, конечный контент. Именно в таком порядке.

5. Подготовь миграционный сценарий. TTL меняется заранее, старый origin живёт до подтверждения стабильности, откат документирован, доступ к DNS не хранится в личном аккаунте одного человека.

Вот и вся механика. Доменное имя находит адрес. SNI выбирает сертификат. Host выбирает сайт. Каждый слой делает свою работу. Не путай роли — и получишь не просто работающий сайт, а инфраструктуру, которую можно быстро масштабировать, безопасно переносить и уверенно бустить.

Частые вопросы

Почему сайт открывается не у всех пользователей после смены IP?
Это происходит из-за кэширования DNS-записей. Резолверы хранят старый IP в течение времени, заданного в TTL, поэтому часть аудитории продолжает обращаться по старому адресу.
Можно ли использовать CNAME для основного домена (apex)?
В классической модели DNS это невозможно, так как CNAME конфликтует с обязательными записями SOA и NS. Для решения этой задачи провайдеры предлагают альтернативные механики, такие как ALIAS или ANAME.
Зачем нужен SNI при настройке HTTPS?
SNI позволяет серверу понять, какой домен запрашивает клиент, еще до начала передачи HTTP-запроса. Это необходимо для выбора правильного SSL-сертификата на сервере, где размещено несколько сайтов.
Почему при правильной настройке DNS сервер отдает чужой сайт?
Скорее всего, проблема в настройках виртуального хостинга на веб-сервере. Сервер не нашел в своей конфигурации нужного имени в заголовке Host и отдал контент, назначенный по умолчанию.
Нужно ли создавать отдельные записи для IPv6?
Да, для поддержки IPv6 необходимо добавить AAAA-запись. Если она опубликована, но сервер не настроен на работу с IPv6, часть пользователей столкнется с ошибками доступа.