Имена, адреса и TLS
Что это такое
Прежде чем отправить запрос, имя должно стать адресом, а прежде чем ответу можно доверять, соединение нужно защитить. Разрешение проходит по иерархии серверов имён, чтобы найти адрес; рукопожатие TLS доказывает подлинность сервера и согласует шифрование. И то и другое происходит до первого байта запроса, поэтому оба появляются в инцидентах как задержки или сбои вообще без участия приложения.
Почему это важно
Самые частые причины «сайт недоступен» лежат не в приложении: сертификат истёк, имя разрешается в старый адрес, запись не распространилась или имя разрешается иначе изнутри сети, чем снаружи. Ничего из этого не видно в логах приложения, и всё это быстро подтвердить, когда модель под рукой. Понимание последовательности объясняет и то, почему добавить запись быстро, а изменить её может занять часы.
Ключевые идеи
Разрешение идёт от самого конкретного к самому авторитетному
Клиент спрашивает резолвер, который идёт от корня к авторитетному серверу домена и возвращает ответ. Ответы кэшируются на каждом шаге на время, которое объявляет сама запись, — поэтому изменение не мгновенно и поэтому понизить это значение перед миграцией стало стандартной практикой.
клиент -> резолвер -> корень -> домен верхнего уровня -> авторитетный сервер
(каждый кэширует ответ на время жизни записи)
Типы записей отвечают на разные вопросы
Запись адреса даёт адрес, запись имени даёт другое имя, почтовые записи говорят, куда идёт почта, а записи сервиса описывают, где живёт сервис. Несколько записей адреса могут распределять трафик, а значит, клиента могут отправить к любой из них. Явность в том, на какой вопрос отвечает каждая запись, делает файл зоны читаемым и мешает случайным подменам.
Имена в сертификате должны совпадать с запрошенным именем
Сертификат действителен для набора имён, и клиент проверяет, что запрошенное имя входит в него. Сертификат для одного имени не удостоверяет другое, поэтому добавить имя в сервис можно только расширив сертификат или выпустив новый. Шаблоны покрывают одну метку домена, а не все.
Рукопожатие доказывает подлинность и согласует ключ
Клиент и сервер обмениваются ключевым материалом, а сервер предъявляет свой сертификат и доказательство, что владеет соответствующим закрытым ключом. Затем клиент проверяет сертификат по доверенному удостоверяющему центру, по срокам действия и по запрошенному имени. Только после этого начинается шифрование, поэтому медленная часть нового соединения — рукопожатие, а не запрос.
приветствие клиента -> сертификат сервера + обмен ключами -> проверка клиентом -> шифрованная сессия
Срок жизни сертификата — запланированное событие
Сертификаты истекают, и истечение — это сбой с известной датой и временем. Автоматическое продление делает его не-событием; ручное делает его повторяющимся инцидентом, который случается, когда человек, помнящий о нём, недоступен. Сбой обычно невидим до дня, когда он тотален, — именно поэтому его стоит автоматизировать, а не документировать.
Последовательность задержек указывает на виновника
Задержка разрешения, задержка рукопожатия соединения и задержка ответа — разные этапы с разными причинами. Измерение их по отдельности превращает «сайт медленный» в «имя медленно разрешается из этой сети» или «рукопожатие занимает две секунды», и у каждого свой способ лечения.
Практика
Проследите имя до его ответа
Разрешите имя шаг за шагом, определите авторитетный сервер, который ответил, и время жизни на записи.
Готово, когда: вы можете сказать, сколько ответ будет кэшироваться и какое изменение потребовало бы сначала понизить время жизни записи.
Проверьте покрытие сертификата
Получите сертификат и перечислите имена, которые он покрывает, затем проверьте, будет ли принято имя, которого в списке нет.
Готово, когда: вы можете назвать точный набор имён, которые удостоверяет сертификат, и почему родственное имя не проходит.
Частые ошибки
- Менять запись, не понизив сначала её время жизни — клиенты держат старый ответ часами; исправить: понизьте значение, подождите, затем меняйте.
- Доверять сертификату, чьё имя не совпадает — клиент говорил не с тем сервисом; исправить: проверьте запрошенное имя против покрытия сертификата.
- Продлевать сертификаты вручную — истечение становится запланированным сбоем; исправить: автоматизируйте продление и оповещайте о его сбое.
- Читать запись адреса как запись имени — разрешение падает или тихо указывает в другое место; исправить: убедитесь, что тип записи отвечает на заданный вопрос.
- Диагностировать разрешение изнутри той же сети — внутренние и внешние ответы различаются; исправить: проверяйте с позиции клиента, а не сервера.
Что читать дальше
- Запросы и ответы HTTP (06-cloud-devops/10-networking-fundamentals-http-dns-tls/01-http-requests-and-responses) — сообщение, которое следует за этим разрешением и рукопожатием.
- Основы сетей (HTTP / DNS / TLS) (06-cloud-devops/10-networking-fundamentals-http-dns-tls) — уровень, который составляют эти два дочерних урока.
- Nginx (06-cloud-devops/19-nginx) — где завершение TLS обычно настраивается на практике.