Принцип работы dns – Как работает dns — Энциклопедия хостинга

Содержание

Основы работы со службой DNS (domain name system)

Общая информация

В этой статье рассмотрены необходимые для практического применения базовые аспекты функционирования DNS.

DNS (Domain Name System - система доменных имен) представляет собой распределенную систему хранения и обработки информации о доменных зонах. Она необходима, в первую очередь, для соотнесения IP-адресов устройств в сети и более адаптированных для человеческого восприятия символьных имен. Предоставление информации об IP-адресах хостов по символьному адресу - не единственная задача DNS. Система работает с разными типами ресурсных записей, позволяющими реализовывать весьма широкий круг задач: переадресация между доменными именами, балансировка нагрузки между хостами, привязка специфических сервисов (напр., эл. почты) к домену.

 

 

Система доменных имен является одной из фундаментальных технологий современной интернет-среды, так как информация об IP-адресе запрашиваемого узла - обязательное условие получения ответа на любой интернет-запрос. Но IP-адрес представляет собой числовое значение вида "1.23.45.67", неподходящее для комфортного восприятия человеком. К тому же основной принцип распределения IP-адресов в сети - уникальность. Важно и то, что сетевой адрес - не самый устойчивый параметр. Он может изменяться (напр., при смене хоста, обслуживающего запрашиваемый узел, смене хостинг-провайдера, и т.п.). Все перечисленные особенности делают систему навигации по сетевым адресам сложной для человека.

DNS обеспечивает преобразование запрашиваемого клиентом символьного имени домена в IP-адрес (адреса) обслуживающего эту доменную зону сервера (серверов). Изначально, до разрастания сети интернет, адреса преобразовывались согласно содержимому файла "hosts", составлявшегося централизованно и автоматически рассылавшегося на каждую из машин в сети. По мере роста глобальной сети такой метод перестал оправдывать себя - появилась потребность в новом механизме, которым и стала DNS, разработанная в 1983 году Полом Мокапетрисом.

Ключевыми характеристиками DNS являются:

  • Распределенность хранения и управления - каждый DNS-сервер обязан хранить информацию только по делегированным ему доменам, а ответственность за различные узлы дерева доменных имен несут разные лица
  • Кэширование данных
    - DNS-сервер может временно хранить некоторое количество информации о неделегированных ему доменах для уменьшения уровня общей нагрузки
  • Иерархическая структура - узел, ответственный за доменную зону, может самостоятельно делегировать нижестоящие узлы другим DNS-серверам
  • Резервирование - хранение и обработка информации об одних и тех же узлах обычно обеспечивается несколькими DNS-серверами, изолированными физически и логически. Такой подход обеспечивает доступность информации даже при сбое одного или нескольких узлов.

Иерархия и делегирование доменных имен

Домен представляет собой именованную ветвь в дереве имен, включающую в себя сам узел (напр., домен первого уровня ".com"), а также подчиненные ему узлы (напр., домен второго уровня "example.com", домен третьего уровня "mail.example.com" и т.д.). Для обозначения иерархической принадлежности доменных имен принято использовать понятие "уровень" - показатель положения узла в дереве доменов. Чем ниже значение уровня, тем выше иерархическое положение домена

  • "."
    - домен нулевого уровня
  • ".ru" - домен первого (верхнего) уровня
  • "example.com" - домен второго уровня
  • "mail.example.com" - домен третьего уровня
  • Этот список можно продолжать
 

 

Обратите внимание на домен нулевого уровня "." (dot - точка), также называемый корневым. На практике точку обычно не указывают ("example.com" вместо "example.com."), т.е. указание корневого домена не является обязательным условиям разрешения IP-адреса. Большинство клиентских программ (интернет-браузеров и т.д.) добавляют домен нулевого уровня автоматически и не отображают его пользователю. Доменное имя, не включающее обозначение домена нулевого уровня называется относительным, включающее же точку на конце - полностью определенным (FQDN - Fully Qualified Domain Name).

Доменная зона - часть иерархического дерева доменных имен (напр. ".ru"), целиком переданная на обслуживание определенному DNS-серверу (чаще нескольким) с целью делегирования другому лицу ответственности за этот и все подчиненные домены ("anyaddress.ru", "any.anyaddress.ru").

Делегирование - передача ответственности за определенную ветвь дерева доменных имен другому физическому или юридическому лицу. Именно эта процедура практически реализует важный принцип работы DNS - распределенность хранения записей и обработки запросов. Сам процесс делегирования представляет собой добавление в ресурсные записи родительской зоны (".ru"), так называемых "склеивающих" ("glue") NS-записей для делегируемой дочерней зоны ("example.com"), указывающих на DNS-сервера принимающей домен стороны (например, DNS-сервера нашей компании). С этого момента все ресурсные записи домена второго уровня "example.com" и всех его дочерних доменов (например, "mail.example.com" и т.д.) хранятся на DNS-серверах этой компании, а родительская зона ".ru" хранит только указывающие на эти сервера NS-записи.

DNS-сервер - хост, хранящий ресурсные записи и обрабатывающий DNS-запросы. DNS-сервер может самостоятельно разрешать адреса, относящиеся к зоне его ответственности (в примере выше это зона example.com), или передавать запросы по зонам, которые он не обслуживает, вышестоящим серверам.

DNS-клиент

- набор программных средств для работы с DNS. Сам DNS-сервер периодически также выступает в качестве клиента.

 

Основные типы ресурсных записей

Ресурсная запись (RR - Resource Record) - единица хранения и передачи информации в DNS, включающая в себя следующие элементы (поля):

  • Имя (Name) - имя домена, к которому относится запись
  • TTL (Time To Live) - допустимое время хранения записи неответственным сервером
  • Тип (Type) - параметр, определяющий назначение и формат записи в поле данных (Rdata)
  • Класс (Class) - тип сети передачи данных (подразумевается возможность DNS работать с типами сетей, отличных от TCP/IP)
  • Длина поля данных (Rdlen)
  • Поле данных (Rdata) - содержание и формат поля зависят от типа записи

 

Ниже представлены типы ресурсных записей, используемые чаще всего:

  • A (IPv4 Address Record - адресная запись) - связывает доменное имя с IPv4-адресом хоста
  • AAAA (IPv6 Address Record)
    - связывает доменное имя с IPv6-адресом хоста (аналогично А-записи)
  • CNAME (Canonical Name Record - каноническая запись имени) - используется для перенаправления на другое доменное имя
  • MX (Mail Exchange - почтовый обменник) - ссылается на почтовый сервер, обслуживающий домен
  • NS (Name Server - сервер имен) - ссылается на DNS-сервер, ответственный за домен
  • TXT - текстовое описание домена. Зачастую требуется для выполнения специфических задач (например, подтверждения права собственности на домен при привязке его к почтовому сервису)
  • PTR (Point to Reverse - запись указателя) - связывает ip-адрес машины с доменом, используется преимущественно для проверки сторонними почтовыми сервисами отправляемых через эту машину электронных писем на отношение к домену, указанному в параметрах почтового сервера. При несоответствии этих параметров письмо проверяется более тщательно по другим критериям.

 

Рекурсивные и нерекурсивные DNS-запросы

Рекурсией называется модель обработки запросов DNS-сервером, при которой последний осуществляет полный поиск информации, в том числе о доменах, неделегированных ему, при необходимости обращаясь к другим DNS-серверам.

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

 

 

Кэширование - еще одна важная характеристика DNS. При последовательном обращении сервера к другим узлам в процессе выполнения рекурсивного запроса DNS-сервер может временно сохранять в кеш-памяти информацию, содержащуюся в получаемых им ответах. В таком случае повторный запрос домена не идет дальше его кэш-памяти. Предельно допустимое время кэширования содержится в поле TTL ресурсной записи.

 

P. S. Другие инструкции:

Спасибо за Вашу оценку! К сожалению, проголосовать не получилось. Попробуйте позже

1cloud.ru

Основы работы DNS

2

 

Ключевые характеристики:

  • Распределенность хранения информации Данные о разных зонах хранятся на разных серверах
  • Распределенность администрирования За различные зоны отвечают разные сотрудники
  • Возможность кэширования запросов Для снижения загрузки и уменьшение времени отклика.
  • Отказоустойчивость Несколько серверов отвечают за хранение информации об одной зоне

DNS сервера решают одну из главных задач: для подключения к узлу необходимо знать его IP адрес, а людям гораздо проще запоминать обычные имена, чем IP адреса.

При большом стремлении можно изучить следующие RFC 1034 1035

 

Терминология  

Домен — Единица в дереве имен, вместе со всеми подчиненными узлами. Уровни домена считаются справа налево.

  • Корневым доменом является «.» (точка, которая ставится в конце DNS имени. Пример: server1.moscow.domain.org. ). Обычно ее опускают при наборе имени, но можно ее ставить, тогда это определит имя как FQDN (Fully Qualified Domain Name).
  • Домены первого уровня ( обычно это org, com, me, tv, ru и тд ) относятся к тематическим или региональным. Определяющими страну или род деятельности.
  • Домены второго уровня ( пример: mail, gmail, yandex ) Такие обычно и встречаются в интернете, их продают регистраторы. Некоторые стоят копейки, другие же как несколько самолетов.
  • Домены третьего и остальных уровней редко когда продаются и регистрируются. Исключением может являться, к примеру, ****.com.ru и подобные имена.

Поддомен — Подчиненный домен. К примеру: server1.moscow.domain.org

  • Для домена domain.org поддоменом будет moscow
  • Длина может составлять до 127 поддоменов, каждый  из которых до 63 символов. Но при этом общая длина не  должна превышать 254 символов

Ресурсная запись — Единица хранения информации, имеет имя и привязана к доменному имени. К примеру: server1.moscow.domain.org

  • ресурсная запись будет server1 и иметь формат A-Записи

Зона — Часть доменного имени вместе с ресурсными записями и поддоменами, которая хранится на  одном сервере. Часто служит для передачи ответственности  за актуальность данных третьим лицам.

Root-Hint — Well-known сервера отвечающие  за  корневой  домен «.» (точка)

Ответственность — Бывает двух типов:

  • Authoritative — Когда DNS сервер хранит на себе запрашиваемую зону
  • Non-Authoritative — Когда DNS сервер не хранит на себе запрашиваемую зону

 

 

Рекурсивный и итеративный запрос

Есть два  способа разрешения имен.

Первый это итеративный — это такой метод, при котором DNS сервер выступает в роли клиента и опрашивает другие DNS сервера в порядке убывания  (начиная от корневых DNS серверов и заканчивая последним, авторитарным за  нужную DNS зону ). Давайте рассмотрим как  работает данный метод:

  1. Пользователь хочет получить доступ по имени www.inadmin.ru и отправляет  запрос на свой  DNS сервер.
  2. DNS сервер видит, что пришел  запрос и у него в  кэше нет значения.
  3. Так как сервер не  знает  где находится  этот WWW, то нужно обратиться к корневому DNS серверу (их на самом деле несколько десятков), к примеру 198.41.0.4,  и спрашивает, где  находится www.inadmin.ru.
  4. Корневой DNS сервер (198.41.0.4) не  знает где  хранятся записи для  домена www.inadmin.ru , но  знает кто  ответственный  за  домен первого уровня  ru. и возвращает нашему DNS серверу его IP 193.232.142.17
  5. Наш DNS сервер обращается к нему (193.232.142.17) с просьбой сообщить  IP для www.inadmin.ru. Но этот DNS тоже не  знает ничего про наш адрес. Но  знает, что есть  DNS который отвечает  за  inadmin.ru. и возврщает его IP 195.128.64.3
  6. Наш DNS сервер обращается к нему 195.128.64.3 с просьбой  сообщить  IP для www.inadmin.ru. А вот он уже  знает  про запись www для нашего домена и возвращает нужный нам IP
  7. Наш DNS сервер отдает данный IP клиенту. Теперь клиент может подключиться по имени к серверу.

Второй это рекурсивный — это такой метод, при котором  DNS сервер просто пересылает данные от клиента  другому серверу, что бы  он обработал данный запрос и вернул конечные данных. (другой сервер  может работать рекурсивно или точно так же интерактивно )

Как пример можно привести следующий сюжет:

 

  1. Resolver посылает рекурсивный запрос на  свой  DNS сервер NameServer1
  2. NameServer1 итеративными запросами обращается к root-hint
  3. Т.к. данные не могу разрешится, то возвращается  IP DNS сервера, ответственного за зону COM
  4. NameServer1 итеративными запросами обращается к NS, ответственного за зону COM
  5. Т.к. данные не могу разрешится, то возвращается  IP DNS сервера, ответственного за зону Reskit.com
  6. NameServer1 итеративными запросами обращается к NS, ответственного за зону Reskit.com
  7. Получает нужные данные
  8. Отправляет данные обратно клиенту Resolver

Обратный DNS запрос

Служит  для  обратной цели, для разрешения из ip в имя. Для  этого  зарезервирован специальный  домен in-addr.arpa, в котором хранятся PTR записи. Октеты IP адреса хранятся в  обратном порядке, будьте внимательны. Так для  ip 1.2.3.4  будет создана  запись вида  4.3.2.1.in-addr.arpa

 

Виды записей DNS серверов

Приведем только основные, т.к. их большое количество:

  • Запись A (address record) — Связывает имя с IP адресом
  • Запись CNAME (canonical name record) — используется для перенаправление на  другое имя. Используется в связке с  Запись A
  • Запись MX (mail exchange) — Указывает на почтовый сервер
  • Запись NS (name server) — указывает на  Name Server
  • Запись PTR (pointer) — Обратная  Запись A
  • Запись SOA - Указывает где хранится начальная  запись зоны, а так же ключевую информацию о зоне.
  • Запись SRV - Указывает на серверы  для сервисов, к примеру Active Directory.

 

 

Порядок разрешения имен и поправки связанные с кэшированием

При запросе имени происходит  несколько важных процедур, которые необходимо учитывать. Во первых это данные  о связке имя — IP адрес может храиться в нескольких местах ( Hosts, DNS Cash, Lmhosts, DNS Server и др). Для того что бы полностью понимать принцип работы — нужно  знать порядок в котором  Windows пытается  разрешить  любое имя.

  1. При разрешении имени сверяется  с локальным именем компьютера.
  2. Если локальное имя не совпадает с запрашиваемым, то выполнятеся поиск в DNS Cash. ВАЖНО: в DNS кэш динамически загружюется  данные из файла HOSTS ( поэтому поиск по файлу hosts не происходит, его данные всегда в памяти ПК, что ускоряет обработку ). Файл Hosts расположен в %systemroot%\System32\Drivers\Etc
  3. Если имя не разрешилось в IP адрес, то пересылается  на DNS сервер, который задан в сетевых настройках.
  4. Если имя сервера плоское ( к примеру: server1 ) и не может быть разрешено с помощью DNS, то имя конвертируется в NetBIOS имя и ищется в локальном  кэше
  5. Если имя не может разрешиться, то ишется на WINS серверах
  6. Если имя не может быть опрделено и на WINS сервере, то ищется с помощью BROADCAST запроса в локальной подсети
  7. Если имя не определилось, то ищется в файле LMHOSTS

На данном рисунке показывается  все пункты:

Поиск по всем 7-ми шагам прекращается как только  находится первое вхождение, удовлетворяющие условиям.

Примечание:
-Посмотреть  DNS кэш можно по команде c:\>ipconfig /displaydns

c:\>ipconfig /displaydns

Windows IP Configuration

api.wordpress.org

----------------------------------------

Record Name . . . . . : api.wordpress.org

Record Type . . . . . : 1

Time To Live  . . . . : 158

Data Length . . . . . : 4

Section . . . . . . . : Answer

A (Host) Record . . . : 72.233.56.138

Record Name . . . . . : ns1.mobiusltd.com

Record Type . . . . . : 1

Time To Live  . . . . : 158

Data Length . . . . . : 4

Section . . . . . . . : Additional

A (Host) Record . . . : 67.19.16.228

 

-Очистить  DNS кэш можно по команде ipconfig /flushdns
c:\>ipconfig /flushdns

Windows IP Configuration

Successfully flushed the DNS Resolver Cache.

Как можно самому посмотреть  ответы на  запросы?

Отличной  утилитой  для диагностики DNS является  NSLookup.exe
На какие ключи я бы обратил внимание:

  • LServer — Можно принудительно подключиться к определенному DNS серверу
  • set type=** для выбора параметров, которые мы хотим получить, к примеру set type=mx

Приведу пример использования утилиты NSLookup. Допустим нам надо узнать MX и NS записи  для  домена mail.ru

 

C:\>nslookup

 

Default Server:  china-lo-oldnbn.ti.ru

Address:  212.1.224.53

 

Server:  china-lo-oldnbn.ti.ru

Address:  212.1.224.53

 

Non-authoritative answer:

mail.ru MX preference = 10, mail exchanger = mxs.mail.ru

 

mail.ru nameserver = ns.mail.ru

mail.ru nameserver = ns1.mail.ru

mail.ru nameserver = ns3.mail.ru

mail.ru nameserver = ns4.mail.ru

mail.ru nameserver = ns5.mail.ru

mail.ru nameserver = ns2.mail.ru

mxs.mail.ru     internet address = 94.100.176.20 n

s4.mail.ru     internet address = 94.100.178.64

ns.mail.ru      internet address = 94.100.178.70

ns1.mail.ru     internet address = 94.100.179.159

 

Состав UDP пакета

DNS сервера использую 53-й UDP порт для запросов. Обычно отвечают одной дейтаграммой.

Состав UDP датаграммы содержащей  DNS запрос

 

 

 

Состав UDP дейтаграммы содержащей  DNS ответ

 

Примечание: Все основные параметры и так понятны, не стану уточнять

В первой части я рассказал о  основах DNS запросов, серверов и терминологии. Теперь приступим к изучении на конкретных примерах, я буду  использовать  стандартный  DNS сервер из Windows 2008 R2. В этой части рассмотрю какие настройки можно покрутить и к чему  это приведет, где хранятся  данные о  зонах, как планировать инфраструктуру  DNS для корпоративной инфраструктуры.

 

 

Системные требования

Когда сервис DNS-сервера запускается, то в оперативную память помещаются данные из всех зон. Так же помним, что в памяти будет храниться кэш DNS запросов. Полезно будет помнить системные требования для DNS серверов:

  1. DNS сервер без зон  занимает порядка  4 Мб в оперативной памяти
  2. При добавлении зон, данные  загружаются в оперативную память
  3. Каждая запись занимает порядка  100 байт. Так если у вас  1000 записей это займет еще 100 кб

 

Роли DNS серверов

  1. Cashing-only — не хранят на себе никаких зон, являются только серверами, где хранится кэш DNS запросов. Поэтому они не создают Zone Transfer трафик. Можно использовать у филиальном офисе, для уменьшения DNS трафика между ним и главным офисом.
  2. Non-recursive — Сервера, на которых хранится DNS зона и у которых отключена возможность рекурсивного разрешения имени. Это приводит к тому, что если сервер не может разрешить имя (не имеет ресурсной записи) то DNS запрос будет не разрешен. Такие сервера можно ставить в роли внешних DNS серверов  компаний. Так же  это  защитит от использования внешними пользователями ваших DNS серверов для  разрешения DNS имен в интеренете.
  3. Forward-only — Понятно из названия, что сервера  занимаются только пересылкой  DNS запросов на  другие сервера (обычный рекурсивный запрос — отключен). В таком случае, если сервер не получит ответа от других, то запрос будет не разрешен. Такие сервера можно использовать  для управления  DNS трафиком между корпоративной сетью и интернетом. В таком сценарии все внутренние сервера будет обращаться к Forward-only серверу с просьбой разрешить внешние  имена. Пятно контакта с интернет уменьшится  до одного DNS сервера.
  4. Conditional forwards — Очень похоже на  сервера Forward-only , но в отличии от них в том, что задается связка какой домен на какой IP нужно пересылать.
contoso.msft 10.10.0.10
talspintoys.msft 172.16.0.20

Таким образом все запросы связанные с contoso.msft , к примеру www.corp.contoso.msft будут перенаправлены на  10.10.0.10

 

Уровни безопасности Microsoft DNS серверов

Выделяют 3 уровня:

  • Низкий уровень безопасности
    1. Ваша DNS инфраструктура полностью выставлена в интернет
    2. Обычное разрешение имен DNS выполняют все сервера в вашей сети
    3. Все DNS сервера сконфигурированы на использование Root-Hint`ов
    4. Все DNS сервера позволяют перемещение  зоны на  любые сервера
    5. Все DNS сервера  слушают на всех своих IP
    6. Отключено очистка от старых записией в кэше
    7. Динамическое обновление разрешено для всех зон
    8. На пограничном  Firewall пропускается DNS трафик в  обе стороны
  • Средний уровень безопасности
    1. Ваша DNS инфраструктура имеет ограниченный доступ в интернет
    2. Все DNS сервера  настроены на использование пересылки запросов на специальные сервера, когда  они не могут разрешить имя локально
    3. Перемещении зоны  разрешено только  для  своих NS серверов
    4. Сервера настроены  прослушивать только на определенных IP
    5. Включена  очистка  загрязнений в DNS кэше
    6. Общение между внутренним и внешними  DNS серверами происходит через Firewall, который  частично ограничивает  запросы. Есть  жесткий список  от кого и кому разрешены DNS запросы.
    7. Внешние  DNS сервера настроены  на использование Root-Hints
  • Высокий уровень безопасности — немного больше  закрученных гаек по сравнению со средним уровнем.  В такой структуре полностью отсутствует взаимодействие с  интернетом. Это не стандартная конфигурация, но она идеальна, если не нужен  доступ в интернет.
    1. Ваша  DNS инфраструктура полностью не доступна из интернета
    2. Внутри сети используются DNS сервера, которые являются корневыми и хранят все адресное пространство.
    3. Сервера,  настроенные для пересылки  запросов используют только внутренние IP DNS серверов
    4. Перемещение  зоны  жестко ограничено IP адресами
    5. Сервера настроены  прослушивать только на определенных IP
    6. Включена  очистка  загрязнений в DNS кэше
    7. Внутренние  DNS сервера настроены  на  использование root-hint  прикрепленым к корневым  внутренним DNS, на которых хранится корневая  зона  для вашего пространства имен
    8. Все DNS сервера хранятся на  Domain controllers  и имеют  ограниченный доступ (DACL)
    9. Все зоны  хранятся в Active Directory и имеют ограниченный доступ (DACL)
    10. Безопасные динамические обновления разрешены  за  исключением верхнего уровня корневых зон.

 

Планирование пространства имен

 

При правильном планировании пространства  DNS имен, не  будет проблем с  разрешением  этих имен. В текущее время, каждая компания нуждается в  связи с внешним миром. Что  это  означает  для  нас ?

 

  1. Внутренние имена DNS серверов и  служб — не  должны быть  доступны из интернета
  2. Внутренние сервера  должны уметь разрешать внешние (интернет) имена
  3. Внешние пользователи должны иметь возможность  разрешать внешние имена ( к примеру, имя сайта, точка подключения VPN, Exchange OWA и тд)

Правильным решением  будет  расщепить структуру  DNS на  области  действия ( локальная сеть и интернет ).  Есть несколько  типовых решений. Давайте их рассмотрим и решим  какие же выбрать. Одно пространство имен. К преимуществам можно отнести одно пространство имен для локальной сети и интернет. При этом разные DNS сервера отвечают за разные ресурсные записи. Если внутренний  DNS используется  для Active Directory и подобных ресурсов, то внешний DNS используется  для WWW сайтов, VPN точки вхождения и тд. Так же различные области видения зон.

  • Одно пространство имен. К преимуществам можно отнести одно пространство имен для локальной сети и интернет. При этом разные DNS сервера отвечают за разные ресурсные записи. Если внутренний  DNS используется  для Active Directory и подобных ресурсов, то внешний DNS используется  для WWW сайтов, VPN точки вхождения и тд. Так же различные области видения зон.
  •  

     

  • Поддомен. Случай когда  для внутренний  инфраструктуры мы выделяем  от основного домена поддомен.
    1.  
      1. Проще в администрирование
      2. Сразу понятна топология сети
      3. Внутреннее пространство имен  остается невидимым для внешних запросов
  • Отдельное пространство имен. Довольно похоже на второй случай, мы тоже разделяем пространство имен. Но в данном случае, к примеру по воле религиозных мировоззрений или  иных задач — есть необходимость  не  разделять  публичный  домен. В таком случае мы сделаем отдельный домен для  внутренних нужд, и отдельный  для  внешних. Хоть у меня на рисунке и домены второго уровня совпадают, но  это не обязательное условие.
  • Виды DNS зон

Есть три вида DNS зон, каждая может использоваться для своих нужд:

Primary Active Directory Реплицируется  в интегрированые DNS зоны в Active Directory -Является точкой обновления для зоны

-Доступ на чтение и запись

File Перемещается на Secondary DNS сервера
Secondary обеспечивает ограниченную отказоустойчивость обеспечивает ограниченную отказоустойчивость -Доступ только на чтение

-Увеливает доступность DNS зоны

Stub Active Directory Переодически запрашивает зону на изменения -Увеличивает эффективность разрешения имен-Упрощает администрирование
File
  • Primary -  Дает возможность читать и писать в зону. Обычно Primary передает  зону на Secondary сервера целиком, а потом передаются только изменения, произошедшие после последней синхронизации. Могут храниться в Active Directory ( При этом на всех DC все DNS сервера будут Primary).
  • Secondary — Увеличиваю отказоустойчивость DNS зоны, из таких зон можно только читать, писать нельзя. Не могут храниться в Active Directory.
  • Stub — зоны заглушки, содержат только NS и SOA сервера  для требуемого  домена. Это увеличивает эффективность разрешения имен. Информация в Stub зонах может реплицироваться  с помощью Active Directory.

Динамические обнавления

Windows DNS сервера поддерживаю динамические  обновления. Их несколько видов.

  • Secured Dynamic Update in Active Directory — эта фича доступна только при интегрированных в AD DNS зон. Поскольку  зона  будет  храниться в AD, то можно обезопасить  данные использую возможности Active Directory. Можно использовать ACL (Access Control list) для  определения прав на редактирование/чтение
  • Dynamic DNS update from DHCP - Данная возможность  позволяет обновлять  записи DNS только  DHCP серверам. Обновление происходит, когда клиент DHCP сервера получает IP. На DHCP серверах необходимо определить  DNS зоны, в которых сервер будет динамически обновлять  значения. На DNS сервере определить, что только DHCP сервера могут обновлять записи.
  • DNS client dynamic update — Почти тоже самое, что  и п.2. отличие заключается в том, что  данные в DNS будут обновлять сами клиенты. Такая возможность есть Windows  начиная с версии XP. Этот способ менее безопасен, т.к. атакующий может  легко сменить  запись в DNS. Разрешая  данные динамические обновления, вы открываете дополнительную дверь для атакующего.

Передача зон и репликация

Поскольку  для обеспечения  высоко доступности DNS серверов  применяют распределенные структуры. То необходимо синхронизировать обновление данных на всех серверах отвечающих за  данную  зону. Для  этого и применяю передачу зон  (репликацию в Active Directory).

  • Передача зоны. При первой  синхронизации передается полностью вся зона с  Primary на Secondary сервер. В последующем, когда primary сервер получает запрос на  синхронизацию (и у него  версия  зоны больше чем у secondary), то он может передать, либо всю зону, либо только последние изменения (это сокращает трафик. Инкриментальную передачу должны поддерживать оба сервера).
  • Репликация в Active Directory. Все контролеры  домена могу хранить у себя  DNS зоны, синхронизация зон будет происходить по средствам  репликации AD. Все DC в домене могут вносить изменения в  зоны и такая  схема  называется  мультимастерной репликацией. Хранение зоны в AD дает возможность  легко  задавать область синхронизации DNS в лесу.
    1. All DNS servers in the Active Directory forest — реплицирует  на  все DC в лесу Active Directory
    2. All DNS servers in the Active Directory domain — реплицирует на все DC в текущем домене Active Directory
    3. All domain controllers in the Active Directory domain — Если есть необходимость использовать DNS сервера под управлением Windows 2000
    4. All domain controllers in a specified application directory partition — Можно создать раздел приложений в Active Directory и настроить его только на нужных DC в лесу. В таком случае репликация  будет проходить только между DC, в которых этот параметр задан вручную. О том как создавать разделы приложений

Места хранения зон

  • File — %systemroot%\dns
  • Active Directory — В зависимости от того области видимости  зоны.
    1. Domain Partition. Часть раздела Active Directory, присутствующая на каждом  DC в лесу. DNS зоны реплицируются на все DC в домене. Используется только для DC под управлением Windows 2000
    2. Forest-wide DNS Application directory partition. Хранится в разделе приложений Active Directory. DNS зоны, хранящиеся в  данном разделе, реплицируются на все DC в лесу. Этот раздел создается автоматически, когда устанавнивается роль DNS сервера на первом DC в лесу под управлением Windows 2003 и выше.
    3. Domain-wide DNS Application directory partition. Раздел DNS для каждого отдельного домена в лесу. Хранится в разделе приложений Active Directory и реплицируется на все DC в текущем домене. Автоматички создается при установки роли DNS сервера в домене под управлением Windows 2003 и выше. Для каждого  нового домена в лесу создается новая зона и область доступности, ограниченная  текущим  доменом.
    4. Custom DNS Application directory partition. Используется для  репликации между зарание  определенными DC. Хранится в разделе приложений Active Directory. Доступна во всем  лесу Active Directory, на  зарание определенных DC.

Передача прав

Делегирование — процесс передачи прав на часть доменного имени, к примеру, другой организации, филиалу, и тд.

Когда нужно делегировать ?

  1. Когда нужно передать управление части доменного имени, что бы осуществлять администрирование без вашего участия
  2. Когда  есть большая база DNS, для обеспечения  отказоустойчивости можно разнести базу по разным серверам
  3. Когда необходимо добавить  новый поддомен для нового офиса, и передать права на его администрирование.

Изучаем возможности Windows DNS сервера

Основу мы прошли, теперь давайте пробежимся по возможностям, которые дает стандартный DNS. Для  этого нужно установить  роль DNS Server на сервере. Эти шаги пропустим, т.к. выходят за рамки данной статьи.

  1. Запустим мастер создания  новой  DNS зоны.
  2. Выберем тип зоны и место ее расположения

     

    • Primary, Secondary и Stub
    • Store the zone in Active Directory — пусть мы  будем  хранить  новую  зону в Active Directory
  3. Зададим имя зоны (без www или других поддоменов)

     

  4. Если вы  экспортировали  зону, то есть возможность просто ее вставить из файла (Use the existing file).  При этом файл должен быть помещен в %systemroot%\system32\dns

     

  5. Выберем нужны ли  динамические обновления  для  зоны. Т.к. Я создаю  зону для своего веб сайта, то  обновления мне ни к чему. Я буду сам ручками  добавлять  записи, т.к. записей будет не больше десятка.

     

  6. Ну вот и все, зону мы создали. Теперь можно посмотреть  ее свойства
    • Serial Number — номер зоны, на него ориентируются DNS сервера, сверяя не произошло ли обновлений  после  последней синхронизации.
    • Primary Server — Сервер, отвечающий  за  данную зону
    • Responsible person — введите адрес электронной почты, который Вы хотите (в формате «username.domain.com»). Например, если адрес электронной почты [email protected]inadmin.ru, введитеhostmaster.inadmin.ru.
    • Тут же можно настроить  информацию о том как долго кэшируюшие сервера  должны  хранить  у себя данные, через сколько повторять попытки обновления.

       

  7. Во вкладке Name Servers можно указать, где еще  будет храниться  данные о этой  зоне, т.е. другие NS сервера.

     

  8. Во вкладке Zone Transfers можно определить кому разрешено передавать  зону. Самым простым вариантом является  вариант Only to servers listed on the Name Servers tab. Который указывает, что только  на явно указанные NS сервера  возможна передача зоны. Так же  можно разрешить всем серверам или  только выбранным IP

     

DNS и Active Directory

Как уже многие знают, Active Directory очень сильно опирается на инфраструктуру  DNS. Она  является  основоной рабочей лошадкой. Итак давайте посмотрим, какие записи присутствуют и необходимы для  работы AD.

Прежде всего надо отметить, что DNS должен поддерживать SRV записи, они являются ключевыми и указывают на Well-Known службы. Когда  клиент  подключается к домену, то  он запрашивает  эти  записи и получает  адреса нужных служб.

Во время поднятия роли сервера до DC, все необходимые  записи в DNS создаются автоматически. В последующем, когда  вы добавляете другие DC, сайты, удаляете данные. Все это прописывается в  DNS. Именно по  этой причине  DNS сервер должен поддерживать  динамические обновления ресурсных записей.  Данные записи  можно  найти в файле %systemroot%\System32\Config\Netlogon.dns.

Теперь  давайте  поговори поподробней и начнем с _msdcs

  • _msdcsэто поддомен, определнный Microsoft. Его задача определять  расположение  DC, которые выполняю определнные роли в лесу и в домене.  Данная зона  хранится в forest-wide application directory partition. Служба  Net Logon регистрирует SRV записи для индентификации Well-Known ресурсов, таких как DC (Domain Controller), GC (Global Catalog), PDC (Primary Domain Controller), Domains (Globally Unique Identifier, GUID), как прфиксы в поддомене _msdcs. Определенные таким  образом поддомены опрделеяют Domain Controllers, находящиеся в  домене или лесу и выполнящие  определнные роли. Что бы определять  расположение DC по типу  или по GUID, сервера Windows регистрируют SRV по следующему шаблону:

_Service._Protocol.DcType._msdcs.DnsDomainName

  • SRV Записи. Когда контроллер домена загружается, служба Net Logon с помощью динамических обновлений  регистрирует SRV и А записи на DNS сервере. SRV записи используются  для закрепления имени службы ( к примеру LDAP) за  DNS именем компьютера, на котором запущена  данная  служба. Когда рабочая станция подключается  к  домену, то она  запрашивает DNS на наличие SRV записей по такой  форме:

_Service._Protocol.DnsDomainName

Так как  Active Directory использует TCP протокол, клиенты находять LDAP сервер в таком виде:

_ldap._tcp.DnsDomainName

  • SRV записи регистрируемые службой Net Logon
_ldap._tcp.DnsDomainName. Позволяет клиенту найти сервер с запущенным LDAP сервисом в домене DnsDomainName. К примеру: _ldap._tcp.inadmin.ru
_ldap._tcp.SiteName. _sites.DnsDomainName. Позволяет клиенту найти сервер с запущенным LDAP сервисом в домене DnsDomainName в сайте SiteName. SiteName относительное имя, которое хранится в контейнере Configuration в Active Directory. К примеру: _ldap._tcp.Moscow._Sites.inadmin.ru
_ldap._tcp.dc._msdcs.DnsDomainName. Позволяет клиенту найти контроллер домена в домене DnsDomainName. Все DС регистрируют данную SRV запись.
_ldap._tcp.SiteName. _sites.dc._msdcs.DnsDomainName. Позволяет клиенту найти контроллер домена в домене DnsDomainName в сайте SiteName. Все DС регистрируют данную SRV запись.
_ldap._tcp.pdc._msdcs.DnsDomainName. Позволяет клиенту найти PDC в домене DnsDomainName.Только PDC сервер регистрирует данную SRV запись.
_ldap._tcp.gc._msdcs.DnsForestName. Позволяет клиенту найти PDC в лесу DnsForestName.Только GC сервера регистрируют данную SRV запись.
_ldap._tcp.SiteName. _sites.gc._msdcs.DnsForestName. Позволяет клиенту найти GC в лесу DnsForestName.Только GC сервера принадлежащие данному лесу регистрируют данную SRV запись. К примеру: _ldap._tcp.Moscow._Sites._gc._msdcs.inadmin.ru
_gc._tcp.DnsForestName. Позволяет клиенту найти GC в данном домене. Только GC сервера принадлежащие данному лесу DnsForestName регистрируют данную SRV запись. К примеру: _gc._tcp.inadmin.ru
_gc._tcp.SiteName. _sites.DnsForestName. Позволяет клиенту найти GC в данном лесу DnsForestName в сайте SiteName. Только GC сервера принадлежащие данному лесу DnsForestName регистрируют данную SRV запись. К примеру: _gc._tcp._Moscow._Sites.inadmin.ru
_ldap._tcp.DomainGuid. domains._msdcs.DnsForestName. Позволяет клиентам найти DC по GUID. GUID это 128-битный уникальный указатель. Расчитано на тот момент, когда  DnsDomainName и DnsForestName изменились. К примеру:  _ldap._tcp.4f904480-7c78-11cf-b057-00aa006b4f8f.domains. _msdcs.inadmin.ru
_kerberos._tcp.DnsDomainName. Позволяет клиентам найти Kerberos KDC в данном домене DnsDomainName. Все DC регистрируют данную SRV запись.
_kerberos._udp.DnsDomainName. Тоже самое, что и _kerberos._tcp. DnsDomainName только через UDP
_kerberos._tcp.SiteName. _sites.DnsDomainName. Позволяет клиентам найти Kerberos KDC в данном домене DnsDomainName в сайте SiteName. Все DC регистрируют данную SRV запись.
_kerberos._tcp.dc._msdcs.DnsDomainName. Позволяет клиентам найти DC на котором запущена роль Kerberos KDC в данном домене DnsDomainName. Все DC с ролью KDC регистрируют данную SRV запись.
_kerberos.tcp.SiteName. _sites.dc._msdcs.DnsDomainName. Позволяет клиентам найти DC на котором запущена роль Kerberos KDC в данном домене DnsDomainName в сайте SiteName. Все DC с ролью KDC регистрируют данную SRV запись.
_kpasswd._tcp.DnsDomainName. Позволяет найти Kerberos Password Change для текущего домена. Все DC c ролью kerberos KDC регистрирую данную SRV запись
_kpasswd._udp.DnsDomainName. Тоже самое, что и _kpassword._tcp. DnsDomainName только через UDP

Так же у SRV записей есть дополнительные поля:

Priority Приоритет сервера. Клиенты пытаются подключиться к серверам с меньшим приоритетом.
Weight Используется в роли Load-balanced для серверов с одинаковым приоритетом. Клиенты рандомно выбирают сервер с вероятностью, пропорциональной весу.
Port Number Порт, на котором сервер «слушает»
Target FQDN сервера

malwselennaiaru.ru

Введение в терминологию, элементы и понятия DNS – База знаний Timeweb Community

Введение

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

В этом руководстве мы обсудим некоторые фундаментальные понятия системы доменных имен, которые помогут вам разобраться с настройкой вашей DNS. После знакомства с этим  руководством вы научитесь настраивать собственное доменное имя или свой собственный DNS-сервер.

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

Терминология доменов

Мы должны начать с определения терминов. Хотя некоторые из этих тем могут быть вам знакомы из других сфер, есть много других терминов, используемых в разговоре о доменных именах и DNS, которые не слишком часто используются в других компьютерных областях. Давайте начнем с простого:

Система доменных имен

Система доменных имен, более известная как "DNS", является сетевой системой, которая позволяет нам преобразовать удобные для человека имена (обычно буквенные) в уникальные адреса.

Доменное имя

Доменное имя это удобная для человека форма имени, которую мы привыкли ассоциировать с интернет-ресурсом. Например, "google.com" является доменным именем. Некоторые скажут, что часть "Google" является доменом, но в целом мы можем считать эту комбинированную форму доменным именем. 

URL-адрес "google.com" соединен с сервером, находящимся в собственности Google Inc. Система доменных имен позволяет нам соединиться с сервером Google при вводе "google.com" в браузере.

IP-адрес

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

IPv4, наиболее распространенная форма адресов, записывается в виде четырех наборов цифр, каждый набор содержит до трех цифр, разделенных точкой. Например, "111.222.111.222" может считаться правильным IPv4 IP-адресом. С помощью DNS мы соединяем имя с этим адресом и избавляем себя от необходимости запоминать сложный набор цифр для каждого места посещения в сети.

Домен верхнего уровня

Домен верхнего уровня, или TLD, это самая общая часть домена. Является последней частью доменного имени справа (отделен точкой). Распространенными доменами верхнего уровня считаются "com", "net", "org", "gov", "edu" и "io".

Домены верхнего уровня находятся на вершине иерархии доменных имен. Некоторым компаниям предоставлен контроль над управлением доменами верхнего уровня структурой ICANN (Корпорация по управлению доменными именами и IP-адресами). Эти компании также могут распространять доменные имена под TLD, как правило, через доменного регистратора, который занимается регистрацией домена.

Узел

В пределах домена его владелец может определять собственные узлы, которые ссылаются на отдельные компьютеры или услуги, доступные через домен. Например, большинство владельцев доменов делают свой веб-сервер доступным через  корневой  домен (example.com), а также через "узел", определенный как "www" (www.example.com).
У вас могут быть другие определения узлов под общим доменом. Вы можете иметь API доступ через "api" узел (api.example.com) или FTP доступ, обозначив узел "FTP" или "files" (ftp.example.com или files.example.com). Имена узлов могут быть произвольными, при условии, что они являются уникальными для данного домена.

Поддомен

Объект, связанный с узлами, называется поддомен.
DNS работает в иерархии. Домены верхнего уровня могут иметь множество доменов под ними. Например, домен верхнего уровня "com" включает в себя "google.com" и "ubuntu.com". Поддомен это домен, который является частью домена более высокого уровня. В этом случае можно сказать, что "ubuntu.com" явлется поддоменом "com". Как правило, он называется просто доменом или часть "Ubuntu" называется SLD, что означает домен второго уровня.

Точно так же каждый домен может контролировать "поддомены", которые находятся под ним. Например, у вас мог бы быть поддомен для отдела истории в вашей школе по адресу "www.history.school.edu". В этом случае часть "history" считается поддоменом.
Разница между именем узла и поддомена в том, что узел указывает на компьютер или ресурс, в то время как поддомен расширяет родительский домен. 

Читая о поддоменах или узлах, вы можете заметить, что самый левые части доменов наиболее конкретные. Это объясняет работу DNS: от наиболее конкретного к наименее конкретному, так как вы читаете слева направо.

Полностью определенное имя домена

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

Это означает, что он указывает на каждый родительский домен, включая TLD. Правильный FQDN заканчивается точкой, указывая на корень иерархии DNS. Примером FQDN является "mail.google.com.". Иногда программное обеспечение, которое запрашивает FQDN, не нуждается в точке на конце, но завершающая точка требуется для соответствия стандартам ICANN.

DNS-сервер

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

DNS-сервера могут быть "авторитетными", что означает, что они предоставляют ответы на запросы о доменах под своим контролем. В противном случае они могут указать на другие серверы или предоставить кэшированные копии данных других DNS-cерверов.

Файл зоны

Файл зоны представляет собой простой текстовый файл, который содержит соединение между доменными именами и IP-адресами. С помощью него DNS выясняет, с каким IP-адресом необходимо связаться, когда пользователь запрашивает определенное доменное имя.

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

Ресурсные записи

Записи хранятся в пределах файла зоны. В своей простейшей форме запись это простое соединение между ресурсом и именем. Эти записи могут соединять имя домена с IP-адресом, определять DNS-серверы и почтовые серверы для домена и т.д.

Как работает DNS

Теперь, когда вы знакомы с некоторой терминологией, связанной с DNS, возникает вопрос, как действительно работает система?

Система очень проста, если смотреть в общем, но очень сложна, если вы углубитесь в детали. В целом, это очень надежная инфраструктура, которая была необходима для адаптации интернета таким, каким мы знаем его сегодня.

Корневые серверы DNS

Как уже говорилось выше, DNS, по сути, является иерархической системой. В верхней части этой системы находится то, что мы называем корневым сервером DNS. Эти серверы находятся под контролем различных организаций, действующих по согласию с ICANN (Корпорация по управлению доменными именами и IP-адресами).

В настоящее время 13 корневых серверов находятся в эксплуатации. Тем не менее, так как каждую минуту появляется немыслимое количество имен для преобразования, каждый из этих серверов имеет зеркало. Интересно, что все зеркала для одного корневого сервера делят один IP-адрес. Когда выполняется запрос к определенному серверу, он будет перенаправлен к ближайшему зеркалу этого корневого сервера.

Что делают эти корневые серверы? Они обрабатывают запросы на информацию о доменах верхнего уровня. Поэтому если приходит запрос о чем-то, что DNS-сервер не может преобразовать, то запрос перенаправляется в корневой DNS-сервер.

Корневые серверы на самом деле не обладают информацией о том, где размещен домен. Они, однако, в состоянии направить запрашивающего к DNS-серверу, который обрабатывает нужный домен верхнего уровня.

Таким образом, если запрос "www.wikipedia.org" производится в корневой сервер, то он ответит, что не может найти результат в своих записях. Он проверит свои файлы зоны на наличие соответствий "www.wikipedia.org". И также не найдет их.
Вместо этого он найдет запись для домена верхнего уровня "org" и предоставит запрашивающему адрес DNS-сервера, отвечающего за адреса "org".

TLD Серверы

После этого запрашивающий отправит новый запрос на IP-адрес (предоставленный ему корневым сервером), который отвечает за необходимый домен верхнего уровня.

Продолжая наш пример, запрос был бы отправлен на DNS-сервер, отвечающий за информацию о домене "org", чтобы проверить, есть ли у него информация о том, где находится "www.wikipedia.org".
Опять же запрашивающий будет искать "www.wikipedia.org” в своих файлах зоны. И не найдет эту запись в своих файлах
Тем не менее он найдет запись с упоминанием IP-адреса DNS-сервера, ответственного за "wikipedia.org". И это приближает нас гораздо ближе к результату.

DNS-сервер на уровне домена

На этом этапе у запрашивающего есть IP-адрес DNS-сервера, который хранит информацию о фактическом IP-адресе ресурса. Он отправляет новый запрос на DNS-сервер с уточнением, может ли он предоставить "www.wikipedia.org".

DNS-сервер проверяет свои файлы зоны и обнаруживает, что у него есть файл зоны, соотносящийся с "wikipedia.org". Внутри этого файла находится запись для "WWW" узла. Эта запись указывает IP-адресу, где находится этот узел. DNS-сервер возвращает окончательный ответ на запрос.

Что такое публичный DNS-сервер?

В приведенном выше сценарии мы ссылались на "запрашивающего”. Что же это может значить?

Почти во всех случаях запрашивающим будет являться то, что мы называем "публичный DNS-сервер". Этот сервер настроен на отправку запросов другим серверам. По сути, это посредник для пользователя, который кэширует предыдущие результаты запроса для повышения скорости и знает адреса корневых серверов, способных преобразовать запросы, сделанные для данных, информацией о которых он уже не владеет. 

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

При вводе URL в адресной строке браузера ваш компьютер прежде всего проверяет, может ли он найти, где находится ресурс, на локальном уровне. Он проверяет "узлы" файлов на компьютере и других местах. Затем он отправляет запрос на публичный DNS-сервер и ожидает получить обратно IP-адрес ресурса.
Затем публичный DNS-сервер проверяет свой кэш на наличие ответа. Если он не найдет то, что необходимо, он проделает шаги, указанные выше.

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

Файлы зоны

Мы уже упоминали в перечисленных выше процессах "файлы зоны" и "записи".

Файлы зоны это способ, с помощью которого DNS-сервер хранит информацию о доменах, которые он знает. Каждый домен, информация о котором есть у DNS-сервера, хранится в файле зоны. Если DNS-сервер настроен для работы c рекурсивные запросами, как публичный DNS-сервер, он найдет ответ и предоставит его. В противном случае он укажет пользователю, где искать дальше. Чем больше у сервера файлов зоны, тем больше ответов на запросы он сможет предоставить.

Файл зоны описывает DNS "зону", которая, по существу, является подмножеством всей системы DNS. Как правило, она используется для настройки только одного домена. Она может содержать некоторое количество записей, которые указывают, где находятся ресурсы для запрашиваемого домена.

Параметр зоны $ORIGIN эквивалентен высшему уровню полномочий в зоне по умолчанию. 
Таким образом, если файл зоны используется для настройки домена "example.com.", то параметр $ORIGIN также будет установлен для этого домена.

Это настраивается на верхнем уровне файла зоны или может быть указано в настройках файла DNS-сервера, который ссылается на файл зоны. В любом случае этот параметр описывает то, за что зона будет ответственна.

Точно так же $TTL настраивает "время жизни" информации, которую он предоставляет. По сути, это таймер. Кэширующий DNS-сервер может использовать ранее запрошенные результаты для ответа на вопросы, пока заданное значение TTL не истечет.

Типы записи

В файле зоны может быть множество различных типов записей. Мы рассмотрим некоторые из наиболее распространенных видов (или обязательных) ниже.

Записи SOA

Начальная запись зоны или SOA (Start of Authority) - обязательная запись для всех файлов зоны. Она должна быть первой записью в файле (хотя $ORIGIN или $TTL могут появиться выше). Она также является одной из самых сложных для понимания.

Начальная запись зоны выглядит примерно так:


domain.com. In SOA ns1.domain.com. admin.domain.com. (
                                        12083   ; serial number
                                            3h     ; refresh interval
                                            30m  ; retry interval
                                            3w     ; exiry period
                                            1h      ; negative TTL
)

Поясним, что означает каждая часть:

  • domain.com.: Это корень зоны. Он указывает, что файл зоны относится к домену  domain.com.domain. Часто вы будете видеть, что он заменен на “@”, что является только заполнителем, который замещает содержимое переменной $ORIGIN, о которой мы узнали выше.
  • In SOA: Часть "In" означает Интернет (и будет присутствовать во многих записях). SOA является показателем того, что это начальная запись зоны.
  • ns1.domain.com.: Эта часть определяет мастер-сервер для этого домена. DNS-сервер может быть либо мастером, то есть первичным, либо слейв, или вторичным. 
  • admin.domain.com.: Это электронный адрес администратора этой зоны. Символ "@" заменяется точкой в ​​адресе электронной почты. Если в части имени email адреса обычно стоит точка, это означает замену символа "\" в этой части ([email protected] становится your\name.domain.com).
  • 12083: Это серийный номер файла зоны. Каждый раз, когда вы редактируете файл зоны, необходимо увеличивать это число. Слейв серверы проверят, если серийный номер мастер сервера для зоны больше, чем тот, который находится у них в системе. Если это так, то сервер запросит новый файл зоны, а если нет, то он продолжит обслуживать исходный файл.
  • 3h: Это интервал обновления для зоны. Это количество времени, которое слейв сервер будет ждать прежде, чем запросит у мастер сервера изменение файла зоны.
  • 30m: Это интервал повтора для этой зоны. Если слейв сервер не может подключиться к мастеру, когда наступает период обновления, он будет ждать данное количество времени, а после повторит запрос мастер серверу.
  • 3w: Это период истечения. Если слейв DNS-сервер не смог связаться с мастер сервером в течение этого периода времени, он больше не будет возвращать запросы к авторитетному источнику этой зоны.
  • 1h: Это количество времени, которое DNS-сервер будет кэшировать ошибку, если не сможет найти запрашиваемое имя в файле.

А и AAAA записи

Обе эти записи соединяют узел с IP-адресом. "А" запись используется для соединения узла с IPv4 IP-адреса, в то время как запись “AAAA" используется для соединения хоста для адреса IPv6.
Общий формат этих записей выглядит следующим образом:
host     IN IPv4_address
host     IN AAAA IPv6_address

Таким образом, если SOA запись обращается к основному мастер серверу в "ns1.domain.com", мы должны соединить этот адрес с IP-адресом, так как "ns1.domain.com" находится в зоне domain.com, которую определяет этот файл.
Запись может выглядеть примерно так:
ns1     IN A     111.222.111.222

Обратите внимание, что нет необходимости указывать полное имя. Мы можем просто указать узел (без FQDN), и DNS-сервер заполнит остальное согласно значению $ORIGIN. Тем не менее мы могли бы так же легко использовать FQDN:
ns1.domain.com.     IN A     111.222.111.222

В большинстве случаев это то место, где вы укажете свой веб-сервер как "WWW":
WWW         IN A    222.222.222.222

Мы должны также сказать, где находится основной домен. Мы можем сделать это следующим образом:
domain.com.     IN A     222.222.222.222

Мы также могли бы использовать символ "@", чтобы обратиться к основному домену:
@     IN A     222.222.222.222

У нас также есть возможность преобразования всего, что находится под этим доменом, но не явно относится к этому серверу. Мы можем сделать это с помощью символа "*":
*     IN A     222.222.222.222

Все выше перечисленное также работает с AAAA записями для IPv6-адресов.

Запись CNAME

CNAME записи указывает псевдоним для канонического имени вашего сервера (который определен А или AAAA записью).

Например, у нас может быть A запись, определяющая узел "server1", а затем мы можем использовать "WWW" в качестве псевдонима для данного узла:
server1    IN A     111.111.111.111
www         IN    CNAME    server1

Знайте, что эти псевдонимы сопровождаются некоторыми потерями производительности, потому что они требуют дополнительного запроса к серверу. В большинстве случае те же результаты могут быть достигнуты с помощью дополнительных A или AAAA записей.

CNAME рекомендуется использовать, когда необходимо предоставить псевдоним ресурсу за пределами текущей зоны.

Запись MX

MX записи указывают серверы обмена почты для домена. Это помогает сообщениям электронной почты приходить в ваш почтовый сервер правильно.
В отличие от многих других типов записей, почтовые записи, как правило, не присоединяют узел к чему-либо, потому что они распространяются на всю зону. Они, как правило, выглядит следующим образом:
       IN     MX 10 mail.domain.com.

Обратите внимание, что в начале нет имени узла.
Также в записи присутствует дополнительный номер. Это предпочтительный номер, который помогает компьютерам определить, какому серверу отправлять почту, если указаны несколько почтовых серверов. Более низкие значения имеют более высокий приоритет.

Запись MX должна, по сути, переправлять на узел, указанный в записи A или AAAA, а не к той, что указана CNAME.
Представим, что у нас есть два почтовых сервера. Там должны быть записи, которые выглядят примерно так:
       IN         MX     10     mail1.domain.com.
        IN     MX     50    mail2.domain.com.
mail1     IN A     111.111.111.111
mail2     IN A     222.222.222.222

В этом примере узел "mail1" является предпочтительным сервером обмена почты.
Мы могли бы также написать это следующим образом:
       IN         MX     10     mail1
        IN     MX     50     mail2
mail1     IN A     111.111.111.111
mail2     IN A     222.222.222.222

NS записи

Этот тип записи указывает на DNS-сервера, используемые для этой зоны.
Вы можете спросить: “Почему файлу зоны, находящемуся на DNS-сервере, необходимо ссылаться на себя самого?” DNS-сервер настолько удобен, потому что имеет несколько уровней кэширования. Одной из причин для указания DNS-серверов в файле зоны служит то, что файл зоны может быть фактически обслужен с кэшированной копии на другом DNS-сервере. Есть и другие причины, объясняющие необходимость DNS-серверов ссылаться на сами DNS-сервера, но мы не будем вдаваться в эти подробности.

Как MX записи, NS записи являются параметрами всей зоны, так что они также не соединяют узлы. Выглядят они так:
       IN NS ns1.domain.com.
        IN NS ns2.domain.com.

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

Как всегда, учитывайте соединение для узлов с записями A или AAAA:
       IN NS     ns1.domain.com.
        IN NS     ns2.domain.com.
ns1     IN A     111.222.111.111
ns2     IN A     123.211.111.233

Есть немало других типов записей, которые можно использовать, но это, вероятно, наиболее распространенные типы, которые вы встретите.

Вывод

Теперь у вас должно сформироваться достаточно хорошее представление о том, как работает DNS. В то время как идея, в общем, довольно проста для понимания, если вы знакомы с основными принципами, некоторые детали все еще могут быть непонятны для неопытных администраторов в процессе практики.

timeweb.com

Как спрятать DNS-запросы от любопытных глаз провайдера / Habr

Настройка 1.1.1.1 от Cloudflare и других DNS-сервисов по-прежнему требует навыков работы в командной строке



Шифрование трафика между вашим устройством и DNS-сервисом помешает посторонним лицам отслеживать трафик или подменить адрес

Смерть сетевого нейтралитета и ослабление правил для интернет-провайдеров по обработке сетевого трафика вызвали немало опасений по поводу конфиденциальности. У провайдеров (и других посторонних лиц, которые наблюдают за проходящим трафиком) уже давно есть инструмент, позволяющий легко отслеживать поведение людей в интернете: это их серверы доменных имен (DNS). Даже если они до сих пор не монетизировали эти данные (или не подменяли трафик), то наверняка скоро начнут.

DNS — это телефонный справочник Сети, выдающий фактический сетевой адрес IP, связанный с хостингом и доменными именами сайтов и других интернет-служб. Например, он превращает arstechnica.com в 50.31.169.131. Ваш интернет-провайдер предлагает DNS в пакете услуг, но он также может журналировать DNS-трафик — по сути, записывать историю ваших действий в интернете.

«Открытые» DNS-сервисы позволяют обходить сервисы провайдеров ради конфиденциальности и безопасности, а кое в каких странах — уклоняться от фильтрации контента, слежки и цензуры. 1 апреля (не шутка) компания Cloudflare запустила свой новый, бесплатный и высокопроизводительный DNS-сервис, предназначенный для повышения конфиденциальности пользователей в интернете. Он также обещает полностью скрыть DNS-трафик от посторонних глаз, используя шифрование.

Названный по своему IP-адресу, сервис 1.1.1.1 — это результат партнёрства с исследовательской группой APNIC, Азиатско-Тихоокеанским сетевым информационным центром, одним из пяти региональных интернет-регистраторов. Хотя он также доступен как «открытый» обычный DNS-резолвер (и очень быстрый), но Cloudflare ещё поддерживает два протокола шифрования DNS.

Хотя и разработанный с некоторыми уникальными «плюшками» от Cloudflare, но 1.1.1.1 — никак не первый DNS-сервис с шифрованием. Успешно работают Quad9, OpenDNS от Cisco, сервис 8.8.8.8 от Google и множество более мелких сервисов с поддержкой различных схем полного шифрования DNS-запросов. Но шифрование не обязательно означает, что ваш трафик невидим: некоторые службы DNS с шифрованием всё равно записывают ваши запросы в лог для различных целей.

Cloudflare пообещал не журналировать DNS-трафик и нанял стороннюю фирму для аудита. Джефф Хастон из APNIC сообщил, что APNIC собирается использовать данные в исследовательских целях: диапазоны 1.0.0.0/24 и 1.1.1.0/24 изначально были сконфигурированы как адреса для «чёрного» трафика. Но APNIC не получит доступ к зашифрованному трафику DNS.

Для пользователей подключить DNS-шифрование не так просто, как изменить адрес в настройках сети. В настоящее время ни одна ОС напрямую не поддерживает шифрование DNS без дополнительного программного обеспечения. И не все сервисы одинаковы с точки зрения софта и производительности.

Но учитывая важность вопроса — в последнее время во всех новостях говорят о превращении пользовательских данных в продукт — я решил посмотреть, как работает DNS-шифрование у Cloudflare. В итоге моя внутренняя лабораторная крыса победила — и я обнаружил, что тестирую и разбираю клиенты для нескольких провайдеров DNS через три протокола DNS-шифрования: DNSCrypt, DNS по TLS и DNS по HTTPS. Все они работоспособны, но предупреждаю: хотя процедура становится проще, но вряд ли вы сможете объяснить шифрование DNS родителям по телефону (если только они не опытные пользователи командной строки Linux).


Как работает DNS


Есть много причин для лучшей защиты DNS-трафика. Хотя веб-трафик и другие коммуникации могут быть защищены криптографическими протоколами, такими как Transport Layer Security (TLS), но почти весь трафик DNS передаётся незашифрованным. Это означает, что ваш провайдер (или кто-то другой между вами и интернетом) может регистрировать посещаемые сайты даже при работе через сторонний DNS — и использовать эти данных в своих интересах, включая фильтрацию контента и сбор данных в рекламных целях.


Как выглядит типичный обмен данными между устройством и DNS-резолвером

«У нас есть проблема “последней мили” в DNS, — говорил Крикет Лю, главный архитектор DNS в компании Infoblox, которая занимается информационной безопасностью. — Большинство наших механизмов безопасности решают вопросы коммуникаций между серверами. Но есть проблема с суррогатами резолверов на различных операционных системах. В реальности мы не можем их защитить». Проблема особенно заметна в странах, где власти более враждебно относятся к интернету.

В некоторой степени помогает использование DNS, который не ведёт логи. Но это всё равно не мешает злоумышленнику фильтровать запросы по контенту или перехватывать адреса методом пакетного перехвата или глубокой инспекции пакетов. Кроме пассивной прослушки есть угроза более активных атак на ваш DNS-трафик — спуфинг DNS-сервера со стороны провайдера или спецслужб с перенаправлением на собственный сервер для отслеживания или блокировки трафика. Что-то подобное (хотя, по-видимому, не злонамеренно), похоже, происходит со случайным перенаправлением трафика на адрес 1.1.1.1 из сети AT&T, судя по сообщениям на форумах DSLReports.

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

Вот где вступают в игру протоколы шифрования DNS: это DNSCrypt (среди прочих, его поддерживает OpenDNS от Cisco), DNS по TLS (поддерживается Сloudflare, Google, Quad9, OpenDNS) и DNS по HTTPS (поддерживается Сloudflare, Google и сервисом блокировки «взрослого» контента CleanBrowsing). Шифрование гарантирует, что трафик не просканируют и не изменят, и что запросы не получит и не обработает поддельный DNS-сервер. Это защищает от атак MiTM и шпионажа. DNS-прокси с одной из этих служб (непосредственно на устройстве или на «сервере» в локальной сети) поможет предотвратить DNS-утечки через VPN, поскольку прокси-сервер всегда будет самым быстрым DNS-сервером среди всех доступных.

Однако эта опция защиты недоступна массовому пользователю. Ни один из этих протоколов нативно не поддерживается ни одним DNS-резолвером, который идёт в комплекте с ОС. Все они требуют установки (и, вероятно, компиляции) клиентского приложения, которое действует как локальный «сервер» DNS, ретранслируя запросы, сделанные браузерами и другими приложениями вверх по течению к безопасному провайдеру DNS по вашему выбору. И хотя две из трёх данных технологий предлагаются на роль стандартов, ни один из проверенных нами вариантов пока не представлен в окончательном виде.

Поэтому если хотите погрузиться в шифрование DNS, то лучше взять для DNS-сервера в домашней сети Raspberry Pi или другое отдельное устройство. Потому что вы наверняка обнаружите, что настройка одного из перечисленных клиентов — это уже достаточно хакерства, чтобы не захотеть повторять процесс заново. Проще запросить настройки DHCP по локальной сети — и указать всем компьютерам на одну успешную установку DNS-сервера. Я много раз повторял себе это во время тестирования, наблюдая падение одного за другим клиентов под Windows и погружение в спячку клиентов под MacOS.


Сообщество DNSCrypt пыталось сделать доступный инструмент для тех, кто не обладает навыками работы в командной строке, выпустив программы DNSCloak (слева) под iOS и Simple DNSCrypt (справа) под Windows


Для полноты картины в исторической перспективе начнём обзор с самой первой технологии шифрования DNS — DNSCrypt. Впервые представленный в 2008 году на BSD Unix, инструмент DNSCrypt изначально предназначался для защиты не от прослушки, а от DNS-спуфинга. Тем не менее, его можно использовать как часть системы обеспечения конфиденциальности — особенно в сочетании с DNS-сервером без логов. Как отметил разработчик DNSCrypt Фрэнк Денис, гораздо больше серверов поддерживают DNSCrypt, чем любой другой вид шифрования DNS.

«DNSCrypt — это немного больше, чем просто протокол, — говорит Фрэнк Денис. — Сейчас сообщество и активные проекты характеризуют его гораздо лучше, чем мой изначальный протокол, разработанный в выходные». Сообщество DNSCrypt создало простые в использовании клиенты, такие как Simple DNSCrypt для Windows и клиент для Apple iOS под названием DNS Cloak, что делает шифрование DNS доступнее для нетехнических людей. Другие активисты подняли независимую сеть приватных DNS-серверов на основе протокола, помогающего пользователям уклониться от использования корпоративных DNS-систем.

«DNSCrypt — это не подключение к серверам конкретной компании, — сказал Денис. — Мы призываем всех поднимать собственные сервера. Сделать это очень дёшево и легко. Теперь, когда у нас есть безопасные резолверы, я пытаюсь решить задачу фильтрации контента с учётом конфиденциальности».

Для тех, кто хочет запустить DNS-сервер с поддержкой DNSCrypt для всей своей сети, лучшим клиентом будет DNSCrypt Proxy 2. Старая версия DNSCrypt Proxy по-прежнему доступна как пакет для большинства основных дистрибутивов Linux, но лучше загрузить бинарник новой версии непосредственно с официального репозитория на GitHub. Есть версии для Windows, MacOS, BSD и Android.

Опыт сообщества DNSCrypt по защите конфиденциальности воплощён в DNSCrypt Proxy. Программа легко настраивается, поддерживает ограничения по времени доступа, шаблоны для доменов и чёрный список IP-адресов, журнал запросов и другие функции довольно мощного локального DNS-сервера. Но для начала работы достаточно самой базовой конфигурации. Есть пример файла конфигурации в формате TOML (Tom's Obvious Minimal Language, созданный соучредителем GitHub Томом Престоном-Вернером). Можете просто переименовать его перед запуском DNSCrypt Proxy — и он станет рабочим файлом конфигурации.

По умолчанию прокси-сервер использует открытый DNS-резолвер Quad9 для поиска и получения с GitHub курируемого списка открытых DNS-сервисов. Затем подключается к серверу с самым быстрым откликом. При необходимости можно изменить конфигурацию и выбрать конкретный сервис. Информация о серверах в списке кодируется как «штамп сервера». Он содержит IP-адрес поставщика, открытый ключ, информацию, поддерживает ли сервер DNSSEC, хранит ли провайдер логи и блокирует ли какие-нибудь домены. (Если не хотите зависеть от удалённого файла при установке, то можно запустить «калькулятор штампов» на JavaScript — и сгенерировать собственный локальный статичный список серверов в этом формате).

Для своего тестирования DNSCrypt я использовал OpenDNS от Cisco в качестве удалённого DNS-сервиса. При первых запросах производительность DNSCrypt оказалась немного хуже, чем у обычного DNS, но затем DNSCrypt Proxy кэширует результаты. Самые медленные запросы обрабатывались в районе 200 мс, в то время как средние — примерно за 30 мс. (У вас результаты могут отличаться в зависимости от провайдера, рекурсии при поиске домена и других факторов). В целом, я не заметил замедления скорости при просмотре веб-страниц.

Основное преимущество DNSCrypt в том, что он похож на «обычный» DNS. Хорошо это или плохо, но он передаёт UDP-трафик по порту 443 — тот же порт используется для безопасных веб-соединений. Это даёт относительно быстрый резолвинг адресов и снижает вероятность блокировки на файрволе провайдера. Чтобы ещё больше снизить вероятность блокировки, можно изменить конфигурацию клиента и передавать запросы по TCP/IP (как показало тестирование, это минимально влияет на время отклика). Так шифрованный DNS-трафик для большинства сетевых фильтров похож на трафик HTTPS — по крайней мере, с виду.


Показан трафик DNSCrypt и локальный трафик DNSCrypt Proxy. Снифер Wireshark говорит, что это трафик HTTPS, потому что я форсировал использование TCP. Если пустить его по UDP, то Wireshark увидит трафик Chrome QUIC

С другой стороны, DNSCrypt для шифрования не полагается на доверенные центры сертификации — клиент должен доверять открытому ключу подписи, выданному провайдером. Этот ключ подписи используется для проверки сертификатов, которые извлекаются с помощью обычных (нешифрованных) DNS-запросов и используются для обмена ключами с использованием алгоритма обмена ключами X25519. В некоторых (более старых) реализациях DNSCrypt есть условие для сертификата на стороне клиента, который может использоваться в качестве схемы управления доступом. Это позволяет им журналировать ваш трафик независимо от того, с какой IP-адреса вы пришли, и связывать его с вашим аккаунтом. Такая схема не используется в DNSCrypt 2.

С точки зрения разработчика немного сложно работать с DNSCrypt. «DNSCrypt не особенно хорошо документирован, и не так много его реализаций», — говорит Крикет Лю из Infoblox. На самом деле мы смогли найти только единственный клиент в активной разработке — это DNSCrypt Proxy, а OpenDNS прекратил поддерживать его разработку.

Интересный выбор криптографии в DNSCrypt может напугать некоторых разработчиков. Протокол использует Curve25519 (RFC 8032), X25519 (RFC 8031) и Chacha20Poly1305 (RFC 7539). Одна реализация алгоритма X24419 в криптографических библиотеках Pyca Python помечена как «криптографически опасная», потому что с ней очень легко ошибиться в настройках. Но основной используемый криптографический алгоритм Curve25519, является «одной из самых простых эллиптических кривых для безопасного использования», — сказал Денис.

Разработчик говорит, что DNSCrypt никогда не считался стандартом IETF, потому что был создан добровольцами без корпоративной «крыши». Представление его в качестве стандарта «потребовало бы времени, а также защиты на заседаниях IETF», — сказал он. «Я не могу себе этого позволить, как и другие разработчики, которые работают над ним в свободное время. Практически все ратифицированные спецификации, связанные с DNS, фактически написаны людьми из одних и тех же нескольких компаний, из года в год. Если ваш бизнес не связан с DNS, то действительно тяжело получить право голоса».

Хотя несколько DNS-сервисов используют DNSCrypt (например, CleanBrowsing для блокировки «взрослого» контента и Cisco OpenDNS для блокировки вредоносных доменов), новые ориентированные на приватность DNS-провайдеры (в том числе Google, Cloudflare и Quad9) отказались от DNSCrypt и выбрали одну из других, одобренных группой IETF технологий: DNS по TLS и DNS по HTTPS. Сейчас DNSCrypt Proxy поддерживает DNS по HTTPS и указывает Cloudflare, Google и Quad9 в настройках по умолчанию.


TLS стал приоритетом для CloudFlare, когда понадобилось усилить шифрование веб-трафика для защиты от слежки


У DNS по TLS (Transport Layer Security) несколько преимуществ перед DNSCrypt. Во-первых, это предлагаемый стандарт IETF. Также он довольно просто работает по своей сути — принимает запросы стандартного формата DNS и инкапсулирует их в зашифрованный TCP-трафик. Кроме шифрования на основе TLS, это по существу то же самое, что и отправка DNS по TCP/IP вместо UDP.

Существует несколько рабочих клиентов для DNS по TLS. Самый лучший вариант, который я нашел, называется Stubby, он разработан в рамках проекта DNS Privacy Project. Stubby распространяется в составе пакета Linux, но есть также версия для MacOS (устанавливается с помощью Homebrew) и версия для Windows, хотя работа над последней ещё не завершена.

Хотя мне удалось стабильно запускать Stubby на Debian после сражения с некоторыми зависимостями, этот клиент регулярно падал в Windows 10 и имеет тенденцию зависать на MacOS. Если вы ищете хорошее руководство по установке Stubby на Linux, то лучшая найденная мной документация — это пост Фрэнка Сантосо на Reddit. Он также написал shell скрипт для установки на Raspberry Pi.

Положительный момент в том, что Stubby допускает конфигурации с использованием нескольких служб на основе DNS по TLS. Файл конфигурации на YAML позволяет настроить несколько служб IPv4 и IPv6 и включает в себя настройки для SURFNet, Quad9 и других сервисов. Однако реализация YAML, используемая Stubby, чувствительна к пробелам, поэтому будьте осторожны при добавлении новой службы (например, Cloudflare). Сначала я использовал табы — и всё поломал.

Клиенты DNS по TLS при подключении к серверу DNS осуществляют аутентификацию с помощью простой инфраструктуры открытых ключей (Simple Public Key Infrastructure, SPKI). SPKI использует локальный криптографический хэш сертификата провайдера, обычно на алгоритме SHA256. В Stubby этот хэш хранится как часть описания сервера в файле конфигурации YAML, как показано ниже:

upstream_recursive_servers:
#IPv4
#Cloudflare DNS over TLS server

- address_data: 1.1.1.1
  tls_auth_name: "cloudflare-dns.com"
  tls_pubkey_pinset:
  - digest: "sha256"
    value: yioEpqeR4WtDwE9YxNVnCEkTxIjx6EEIwFSQW+lJsbc=
- address_data: 1.0.0.1
  tls_auth_name: "cloudflare-dns.com"
  tls_pubkey_pinset:
  - digest: "sha256"
    value: yioEpqeR4WtDwE9YxNVnCEkTxIjx6EEIwFSQW+lJsbc=

После установления TCP-соединения клиента с сервером через порт 853 сервер представляет свой сертификат, а клиент сверяет его с хэшем. Если всё в порядке, то клиент и сервер производят рукопожатие TLS, обмениваются ключами и запускают зашифрованный сеанс связи. С этого момента данные в зашифрованной сессии следуют тем же правилам, что и в DNS по TCP.

После успешного запуска Stubby я изменил сетевые настройки сети DNS, чтобы направлять запросы на 127.0.0.1 (localhost). Сниффер Wireshark хорошо показывает этот момент переключения, когда трафик DNS становится невидимым.


Переключаемся с обычного трафика DNS на шифрование TLS

Хотя DNS по TLS может работать как DNS по TCP, но шифрование TLS немного сказывается на производительности. Запросы dig к Cloudflare через Stubby у меня выполнялись в среднем около 50 миллисекунд (у вас результат может отличаться), в то время как простые DNS-запросы к Cloudflare получают ответ менее чем за 20 мс.

Частично замедление работы происходит на стороне сервера из-за лишнего использования TCP. Обычно DNS работает по быстрому протоколу UDP: отправил и забыл, в то время как сообщение TCP требует согласования соединения и проверки получения пакета. Основанная на UDP версия DNS по TLS под названием DNS over Datagram Transport Layer Security (DTLS) сейчас в экспериментальной разработке — она может увеличить производительность протокола.

Здесь тоже имеется проблема с управлением сертификатами. Если провайдер удалит сертификат и начнёт использовать новый, то в настоящее время нет чистого способа обновления данных SPKI на клиентах, кроме вырезания старого и вставки нового сертификата в файл конфигурации. Прежде чем с этим разберутся, было бы полезно использовать какую-то схему управления ключами. И поскольку сервис работает на редком порту 853, то с высокой вероятностью DNS по TLS могут заблокировать на файрволе.

Но это не проблема для лидера нашего хит-парада — DNS по HTTPS. Он проходит через большинство файрволов, словно тех не существует.


Google и Cloudflare, похоже, одинаково видят будущее зашифрованного DNS


И Google, и Cloudflare, кажется, видят протокол DNS по HTTPS, также известный как DoH, как самый перспективный вариант для шифрования DNS. Опубликованный в виде черновика стандарта IETF, протокол DoH инкапсулирует DNS-запросы в пакеты HTTPS, превращения их в обычный зашифрованный веб-трафик.

Запросы отправляются как HTTP POST или GET с телом в формате сообщения DNS (датаграммы из обычных DNS-запросов) или как запрос HTTP GET в формате JSON (если вы не против небольшого оверхеда). И здесь нет никаких проблем с управлением сертификатами. Как и при обычном веб-трафике HTTPS, для подключения через DoH не требуется аутентификация, а сертификат проверяется центром сертификации.


Фиксация DNS-транзакции через DoH. Видно только HTTPS, TLS и ничего больше

HTTPS — довольно громоздкий протокол для запросов DNS, особенно в формате JSON, поэтому придётся смириться с некоторым снижением производительности. Необходимые ресурсы на стороне сервера почти наверняка заставят прослезиться администратора обычного DNS-сервера. Но простота работы с хорошо понятными веб-протоколами делает разработку как клиентского, так и серверного кода для DoH намного более доступной для разработчиков, собаку съевших на веб-приложениях (всего несколько недель назад инженеры Facebook выпустили концепт сервера и клиента DoH на Python).

В результате, хотя на спецификациях RFC для DoH ещё не просохли чернила, уже готов к работе целый ряд клиентов DNS по HTTPS. Правда, некоторые из них заточены под конкретных провайдеров DNS. Потеря производительности во многом зависит от сервера и от качества конкретного клиента.

Например, возьмём клиент туннелирования Argo от Cloudflare (aka cloudflared). Это многофункциональный инструмент туннелирования, предназначенный в первую очередь для установления безопасного канала для связи веб-серверов с CDN-сетью Cloudflare. DNS по HTTPS — просто ещё одна служба, которую теперь поддерживает CDN.

По умолчанию, если запустить Argo из командной строки (в Linux и MacOS для этого нужны привилегии суперпользователя, а на Windows нужно запускать клиента из PowerShell от имени администратора), то он направляет DNS-запросы на https://cloudflare-dns.com/dns-query. Если не настроен обычный DNS, то возможна небольшая проблемка, потому что данный адрес должен резолвиться в 1.1.1.1, иначе Argo не запустится.

Это можно исправить одним из трёх способов. Первый вариант: установить устройство с локальным хостом (127.0.0.1 для IPv4 и ::1 для IPv6) как основной DNS-сервер в сетевой конфигурации, а затем добавить 1.1.1.1 в качестве дополнительного резолвера. Это рабочий вариант, но он не идеален с точки зрения приватности и производительности. Лучше добавить URL сервера из командной строки при загрузке:

$ sudo cloudflared proxy-dns --upstream https://1.0.0.1/dns-query

Если вы уверены, что хотите перейти на DNS-сервер от Cloudflare, что даёт преимущество автоматического обновления, — то можете настроить его в качестве службы в Linux, используя YAML-файл конфигурации, содержащий адреса IPv4 и IPv6 службы DNS от Cloudflare:
proxy-dns: true
proxy-dns-upstream:
- https://1.1.1.1/dns-query
- https://1.0.0.1/dns-query

При настройке с правильной восходящей адресацией производительность dig-запросов через Argo широко варьируется: от 12 мс для популярных доменов аж до 131 мс. Страницы с большим количеством межсайтового контента загружаются… немного дольше обычного. Опять же, ваш результат может быть другим — вероятно, он зависит от вашего местоположения и связности. Но это примерно то, чего я ожидал от мрачного протокол DoH.


Как Cloudflare, мы считаем, что туннели иллюстрируют операцию «Арго» лучше, чем Бен Аффлек

Дабы убедиться, что проблема именно в протоколе DoH, а не в программистах Cloudflare, я испытал два других инструмента. Во-первых, прокси-сервер от Google под названием Dingo. Его написал Павел Форемски, интернет-исследователь из Института теоретической и прикладной информатики Академии наук Польши. Dingo работает только с реализацией DoH от Google, но его можно настроить на ближайшую службу Google DNS. Это хорошо, потому что без такой оптимизации Dingo сожрал всю производительность DNS. Запросы dig в среднем выполнялись более 100 миллисекунд.

Во время проверки обработки стандартных запросов службой dns.google.com я наткнулся на альтернативу дефолтному адресу 8.8.8.8 от Google (172.217.8.14, если знаете). Я добавил его в Dingo из командной строки:

$ sudo ./dingo-linux-amd64 -port=53 -gdns:server=172.216.8.14

Это сократило время отклика примерно на 20%, то есть примерно до того показателя, как у Argo.

А оптимальную производительность DoH неожиданно показал DNSCrypt Proxy 2. После недавнего добавления DoH Cloudflare в курируемый список публичных DNS-сервисов DNSCrypt Proxy почти всегда по умолчанию подключается к Cloudflare из-за низкой задержки этого сервера. Чтобы убедиться, я даже вручную сконфигурировал его под резолвер Cloudflare для DoH, прежде чем запустить батарею dig-запросов.

Все запросы обрабатывались менее чем за 45 миллисекунд — это быстрее, чем собственный клиент Cloudflare, причём с большим отрывом. С сервисом DoH от Google производительность оказалась похуже: запросы обрабатывались в среднем около 80 миллисекунд. Это показатель без оптимизации на ближайший DNS-сервер от Google.

В целом производительность DNSCrypt Proxy по DoH практически неотличима от резолвера DNS по TLS, который я проверял ранее. На самом деле он даже быстрее. Я не уверен, то ли это из-за какой-то особой реализации DoH — может быть, из-за использования стандартного формата сообщений DNS, инкапсулированных в HTTPS, вместо формата JSON — то ли связано с тем, как Cloudflare обрабатывает два разных протокола.


Я не Бэтмен, но моя модель угроз всё равно немного сложнее, чем у большинства людей


Я профессиональный параноик. Моя модель угроз отличается от вашей, и я предпочел бы сохранить в безопасности как можно больше своих действий в онлайне. Но учитывая количество нынешних угроз приватности и безопасности из-за манипуляций с трафиком DNS, у многих людей есть веские основания использовать какую-либо форму шифрования DNS. Я с удовольствием обнаружил, что некоторые реализации всех трёх протоколов не оказывают сильно негативного влияния на скорость передачи трафика.

Тем не менее, важно отметить, что одно лишь шифрование DNS не скроет ваши действия в интернете. Если на сервере хостятся несколько сайтов, то расширение TLS под названием Server Name Indicator (SNI), используемое в соединениях HTTPS, всё равно может показать открытым текстом название сайта, на который вы зашли. Для полной конфиденциальности всё равно нужно использовать VPN (или Tor) для такой инкапсуляции трафика, чтобы провайдер или какая-либо другая шпионящая сторона не могла вытянуть метаданные из пакетов. Но ни один из перечисленных сервисов не работает с Tor. И если против вас работает правительственное агентство, то ни в чём нельзя быть уверенным.

Другая проблема в том, что, хотя прекрасные ребята из сообщества DNSCrypt проделали большую работу, но такая приватность по-прежнему слишком сложна для обычных людей. Хотя некоторые из этих DNS-клиентов для шифрования оказалось относительно легко настроить, но ни один из них нельзя назвать гарантированно простым для нормальных пользователей. Чтобы эти услуги стали действительно полезными, их следует плотнее интегрировать в железо и софт, который покупают люди — домашние маршрутизаторы, операционные системы для персональных компьютеров и мобильных устройств.

Интернет-провайдеры наверняка постараются активнее монетизировать обычный DNS-трафик, и никуда не исчезнут государственные агентства и преступники, которые стремятся использовать его во вред пользователю. Но маловероятно, что крупные разработчики ОС стремятся надёжно защитить DNS доступным для большинства людей способом, потому что они часто заинтересованы в монетизации, как и интернет-провайдеры. Кроме того, эти разработчики могут столкнуться с сопротивлением изменениям со стороны некоторых правительств, которые хотят сохранить возможности мониторинга DNS.

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

habr.com

Битва за данные пользователей: зачем нужно шифровать DNS-запросы


Специалисты по обеспечению конфиденциальности и безопасности находятся в центре публичной борьбы за будущее шифрования трафика в интернете. В сентябре кабельные компании и другие представители телекоммуникационной отрасли в США направили в Конгресс письмо с протестом против планов Google по шифрованию трафика системы доменных имен (DNS) в браузере. В этом месяце Mozilla отправила в Конгресс собственное письмо, в котором просила законодателей не рассматривать этот протест, поскольку он основан на «фактических неточностях».

Речь идет о том, как следует шифровать DNS-трафик — сетевые запросы, которые преобразуют понятные людям доменные имена (адреса сайтов) в IP-адреса серверов. Когда пользователь вводит доменное имя в браузере, тот запрашивает у ближайшего указанного в настройках DNS-сервера IP-адрес, связанный с этим доменным именем.

По умолчанию эти запросы и ответы сервера отправляются по сети в виде обычного текста, что означает, что кто-то может перехватить их и перенаправить пользователя в другое место назначения. Простые текстовые DNS-запросы также позволяют администраторам сети видеть, на какие сайты заходят пользователи: фактические действия могут быть зашифрованы, но и такие знания могут предоставить ценную информацию, например, для рекламодателей.
Картинки по запросу dns over https doh
Шифрование DNS гарантирует, что «браузер общается с тем, с чем вы хотите взаимодействовать, а не с тем, куда вас зовут вредоносные программы», — говорит Тим Эйприл, главный архитектор сетевой компании Akamai.

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

Существует два варианта: так называемые DNS поверх TLS и DNS поверх HTTPS. Первый подчеркивает безопасность и дает администраторам сетей больше контроля, а второй подчеркивает конфиденциальность пользователей. С точки зрения удобства использования пользователи не заметят различий с любым из этих подходов, чего нельзя сказать о системных администраторах.

Два способа шифрования

Современные сети полагаются на протокол защиты транспортного уровня (TLS) для безопасного обмена данными, например, для просмотра веб-страниц, передачи файлов, VPN-подключений, сеансов удаленного рабочего стола и передачи голоса по IP-телефонии. Одна сторона соединения, обычно сервер, имеет сертификат с цифровой подписью, выданный доверенным центром сертификации. Другая сторона соединения, обычно клиент, использует сертификаты для проверки того, с кем он обменивается данными.
Картинки по запросу dns over https doh
Поскольку протокол TLS уже широко используется для обеспечения конфиденциальности, аутентификации и целостности данных, расширение протокола для работы с DNS является вполне логичным. DNS поверх TLS (IETF RFC 7858) определяет, как DNS-пакеты будут шифроваться с помощью TLS и передаваться по широко используемому протоколу управления передачей (TCP).

По умолчанию DNS проходит через порт 53 по протоколу TCP или UDP. При использовании DNS поверх TLS все зашифрованные пакеты отправляются через порт 853. Большинство общедоступных DNS-серверов, включая Cloudflare, Quad9 и Google, уже поддерживают DNS поверх TLS, и компании, использующие собственную DNS-инфраструктуру, также могут использовать такое шифрование. 

Google включил поддержку DNS поверх TLS в Android Pie (Android 9), чтобы пользователи могли настраивать шифрование DNS как для Wi-Fi, так и для мобильной сети, и многие приложения и устройства уже умеют работать с этой опцией.

«Мы решили проблему, добавив DNS к TLS», — сказал Пол Викси, изобретатель DNS и генеральный директор Farsight Security. Он также признает, что такое решение не является «веб-дружественным» в том смысле, что нет простого пользовательского интерфейса для включения этой функции.

DNS поверх HTTPS (IETF RFC8484) в значительной степени разработан с оглядкой на принципы работы современного интернета, поскольку он вбрасывает все пакеты данных в поток HTTPS вместе с другим зашифрованным веб-трафиком. В отличие от своего конкурента, DNS поверх HTTPS не шифрует отдельные запросы, а вместо этого пропускает их через зашифрованный туннель между клиентом и сервером. 
Картинки по запросу dns over https doh

Поскольку соединение использует HTTPS и HTTP/2, все пакеты выглядят одинаково. Любой, кто отслеживает порт 443 — стандартный порт HTTPS — не сможет идентифицировать DNS-запросы из всего остального веб-трафика.

Плюсы и минусы каждого подхода

Для сторонников конфиденциальности DNS через TLS недостаточно хорош, потому что любой, кто контролирует сеть, будет знать, что любая активность на 853-ем порту связана с этим DNS. Хотя наблюдатель не будет знать фактическое содержание запроса, поскольку и ответ, и запрос зашифрованы, тот факт, что сетевой администратор или провайдер будут знать, что есть такая активность, уже может привести к последствиям для пользователя (в худшем случае этот порт может быть вообще закрыт). Хотя DNS поверх TLS безопасен, он не так удобен с точки зрения конфиденциальности, как DNS поверх HTTPS.

Еще один недостаток DNS поверх TLS заключается в том, что разработчикам программного обеспечения и производителям устройств необходимо внести изменения, чтобы их приложения и оборудование поддерживали этот протокол. И если такой поддержки нет, даже если указанный DNS-сервер может работать с таким шифрованием, оно не будет защищать данные пользователя.

DNS поверх HTTPS более демократичен, поскольку любой пользователь, использующий поддерживаемый веб-браузер, автоматически получает шифрование DNS. DNS поверх HTTPS лишает любые третьи стороны — в том числе поставщиков интернет-услуг и правительственные учреждения — возможности просматривать информацию о том, какие сайты посещает пользователь. Это именно то, что хотят защитники конфиденциальности, но это противоположно тому, что нужно сетевым администраторам.

Конфиденциальность против безопасности

DNS поверх HTTPS возводит конфиденциальность в абсолют, но создатели приложений родительского контроля, антивирусных программ, корпоративных брандмауэров и других сетевых инструментов не разделяют эту идеологию. Включение DNS поверх HTTPS по умолчанию в веб-браузере означает, что все DNS-запросы передаются на указанный DNS-сервер, который может не являться собственным DNS-сервером организации или провайдера.

Картинки по запросу android oreo

Mozilla объявила, что DNS поверх HTTPS будет использоваться по умолчанию для пользователей Firefox в Соединенных Штатах, и это изменение в настоящее время активно внедряется. Firefox автоматически передает весь DNS-трафик популярному серверу Cloudflare 1.1.1.1 и игнорирует существующие настройки DNS пользователя. Это обходит все связанные с DNS сетевые правила фильтрации, в том числе позволяет попасть на сайты, доступ к которым блокируется по DNS.

Google также включил DNS поверх HTTPS для пользователей Chrome, но тут его принцип работы немного отличается, поскольку браузер по умолчанию использует DNS поверх HTTPS только в том случае, если у пользователя есть служба, совместимая с DNS поверх HTTPS.

Microsoft, как обычно, хочет усидеть на двух стульях одновременно: с одной стороны, компания планирует поддерживать DNS поверх HTTPS в Windows, с другой — хочет дать системным администраторам некоторый контроль.

Эйприл считает, что шифрование DNS — это «разумное ограничения доступа» к плохим ресурсам, но с ним нужно быть осторожнее. Провайдеры частенько блокируют имена хостов, используемые Wannacry и другими вредоносными программами, и временами перенаправляют пользователей, пытающихся получить доступ к вредоносным или заблокированным сайтам. Администраторы общедоступных сетей Wi-Fi модифицируют DNS-запросы, чтобы сначала загружалась страница авторизации для новых пользователей. DNS поверх HTTPS ломает все эти настройки.

Отчасти поэтому Mozilla не включает DNS поверх HTTPS для пользователей Firefox в Соединенном Королевстве, так как там закон требует от интернет-провайдеров блокировать доступ к нелегальным веб-сайтам, таким как те, которые связаны с детской порнографией.
Картинки по запросу mozilla dns over https
DNS поверх HTTPS против DNS поверх TLS — это еще одна разновидность борьбы за данные о просмотре веб-страниц пользователем и за то, кто получит доступ к ним. DNS-запросы от Firefox будут отправляться в Cloudflare, что означает, что Cloudflare будет иметь доступ к огромному количеству данных DNS. По словам Викси, технологические компании, которые управляют централизованными DNS-серверами, такие как Cloudflare и Google, в конечном итоге получат выгоду от DNS поверх HTTPS, поскольку именно они будут получать информацию о том, что люди просматривают в интернете.

Сторонники конфиденциальности считают, что не провайдеры, а сами пользователи должны отвечать за то, как они попадают на сайты в интернете. Но решение Mozilla заставляет пользователей Firefox использовать Cloudflare независимо от их собственных предпочтений.

Большинство пользователей не заметят никакой разницы, когда шифрованный DNS станет стандартным, что уже произошло для пользователей Chrome. Для компаний и интернет-провайдеров социально-сознательный, ориентированный на пользователя подход вынуждает идти на компромисс: ценой повышения конфиденциальности является снижение безопасности.

Реальность современного интернета заключается в том, что интернет-провайдеры и компании играют определенную роль в предотвращении угроз для пользователей. В идеале веб-браузеры должны позволять пользователям выбирать, следует ли использовать DNS поверх TLS или DNS поверх HTTPS, а также предоставлять пользователям возможность контролировать, какого поставщика DNS использовать.


iGuides в Telegram — t.me/igmedia
iGuides в Яндекс.Дзен — zen.yandex.ru/iguides.ru
У нас есть подкаст и его видео-версия

www.iguides.ru

Dns: что это и как работает?

DNS (domain name service) — это краеугольный камень удобной работы в сети, эдакая «прослойка» между сложным миром IP-адресов и понятным пользователю «буквенным» именам сайтов.

Ведь выражение «я зашел на 87.240.131.119» при использовании «vk.com» звучит, по меньшей мере, нелепо, хотя, для компьютера эти адреса идентичны: ведите этот ip-шник в адресную строку, и вы попадете на знакомый ресурс. И в данной статье мы разберем, как работает и для чего нужен dns сервер в глобальной и локальной информационной сети.

Что такое DNS и домены в сети?

DNS-сервер обеспечивает преобразование ip-адреса в доменное имя и наоборот, получая данные для преобразования из собственной базы данных — то есть, все DNS-сервера в мире хранят информацию обо всех компьютерах и серверах в информационной сети. Достигается это «разграничением обязанностей» — структура DNS в сети включает себя домены и поддомены, зоны и узлы.

Домен — это то самое «буквенное» имя сайта. К примеру, «wikipedia.org», хотя «wikipedia» уже является поддоменом у «.org». И «ru.wikipedia.org» — также.

Что касается DNS, то каждый поддомен управляется собственным DNS-сервером, условно называемым «зоной», а каждый сетевой компьютер, принтер или сервер — узлом. Зона ответственна только за компьютеры в своей сети, и хранит информацию только об этих ресурсах

dns зоны-min

dns зоны-min

Если из вышестоящей DNS-зоны [DNS-1] понадобится сделать запрос в нижестоящую [DNS-2] — то сервер DNS-1 обратится непосредственно к DNS-2, который уже перешлет запрос на нужный хост [узел].

Назначение DNS сервера в локальной сети

Разобраться что такое dns, и как работает dns-сервер в локальной сети можно на конкретном примере.

Предположим, у вас есть офис с сетью из 20-ти компьютеров для работников, отдельный сервер с базой данных [serv1], и отдельная машина с ролью DHCP-маршрутизатора и DNS-сервера [serv2]

Саму локальную сеть, ещё не подключенную к глобальной сети, мы назовем «neboley.ru». DHCP — сервис на «serv2» автоматически задает IP-адреса каждому устройству в локальной сети, после чего они могут общаться друг с другом и с веб-сервером по ip-адресам.

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

К счастью, всё для настройки клиенсткой части DNS предусмотрено в ОС Windows и большинстве Linux-систем, и вам нужно только прописать авторитетным DNS IP-адрес локального DNS-сервера для каждого сетевого компьютера — обратите внимание, не сервера провайдера или Google, а именно той DNS-машинки, что крутится в локальной сети.

Также, не забудьте разрешить на каждом компьютере автоматическое добавление ресурсных записей о себе в БД DNS-сервера и сделать каждый компьютер частью домена «neboley.ru».

К примеру, в ОС Windows добавить машину в сеть домена можно в «Свойствах Компьютера», где уже прописано Имя компьютера (например,»comp1-andrey» или «annaPC»).

запросы-min

запросы-min

После добавления в сеть, это будет уже annaPC.neboley.ru, а когда запись о данной машине появится в базе данных внашего DNS — Андрей, сидящий за «comp1-adndrey.neboley.ru» сможет связаться с Аней, сидящей за «annaPC.neboley.ru», а не с безымянным «192.168.43.19».

Однако так просто задачи dns сервера решаются только в локальной сети. Если же вы решите подключиться к глобальной сети Интернет, то, во первых, потребуется зарегистрировать «neboley.ru» у доменного регистратора, дабы вышестоящий DNS-сервер знал, что «такой-то IP хочет, чтоб его звали по имени и никому другому этого имени не отдавали», и все в интернете могли обращаться к информации на вашем сервере, или к устройствам сети.

А во вторых — уже для DNS-сервера вашей сети необходимо задать авторитетным провайдерские или DNS-сервера Google, в которых база данных гораздо больше ваших 20-ти ПК. В таком случае, если компьютер сети захочет зайти на vk.com, ваш DNS-сервер локальной сети перешлет запрос с этим именем выше по цепочке, а получив IP-адрес — перенаправит ПК по нему и запишет информациию в собственному кэше.

tvoi-setevichok.ru

Как работают сети: что такое свитч, роутер, DNS, DHCP, NAT, VPN и ещё с десяток необходимых вещей

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

Часто бывает у наших коллег: вроде бы слова IP и DNS используют каждый день, а понимания как это всё работает нет, и как это всё пощупать вживую тоже непонятно. Такое отношение не только некорректно, но и вредно для карьеры любого уважающего себя инженера из IT. Сколько бы JS-фреймворков ты не выучил, без знания основ сетей тебя никто всерьёз воспринимать не будет. Ни одна часть инфраструктуры не должна оставаться чёрной коробкой ни для разработчиков, ни для администраторов, ни уж тем более для тебя, будущего DevOps инженера.

Целью этой статьи не является дать исчерпывающее руководство по сетям. Внутри самой статьи и в её конце я приведу множество ссылок на ресурсы, которые помогут тебе углубить полученные знания. Не ленись и кликай по всем ссылкам и читай их все.

В этом же тексте мы сфокусируемся на структуре сети, основных её компонентах и рассмотрим как они используются на практике при помощи уже освоенных нами в предущей статье виртуальных машин и libvirt/KVM в частности.

Сетевая модель OSI

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

OSI делит коммуникацию на 7 слоёв, на каждом слое есть свои протоколы. Ты часто будешь слышать вещи в духе "это происходит на Layer 3". Вот эти слои:

  1. Физический уровень (physical layer)
  2. Канальный уровень (data link layer)
  3. Сетевой уровень (network layer)
  4. Транспортный уровень (transport layer)
  5. Сеансовый уровень (session layer)
  6. Представительский уровень или уровень представления (presentation layer)
  7. Прикладной уровень (application layer)
Физический уровень (physical layer)

Протоколы этого уровня отвечают за связь между железками на самом низком уровне. Непосредственная передача данных по проводам (и без проводов) описывается как раз на физическом уровне. Примеры протоколов: Wi-Fi, Bluetooth, DSL.

Канальный уровень (data link layer)

Канальный уровень отвечает за передачу данных между устройствами одной сети. Данные передаются в виде кадров (frames), в кадре указан физический адрес получателя и отправителя. Этот адрес называется MAC-адрес.

Кто же выступает в роли отправителя и получателя?

Во-первых, у каждой машины (включая твой ноут) есть NIC — Network Interface Controller. Это железка (или виртуальная железка), которая отвечает за передачу и приём кадров. У NIC есть MAC-адрес — уникальный адрес, который обычно прошит в железке, или же генерируется системой виртуализации.

Само собой, у машины может быть несколько NIC. Посмотрим интерфейсы при помощи команды ip:

[[email protected] ~]$ ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
    link/ether 52:54:00:05:36:e6 brd ff:ff:ff:ff:ff:ff

В данном случае, интерфейс, использующийся для связи с внешним миром по сети, — это eth0, обладающий MAC-адресом 52:54:00:05:36:e6. Но что такое lo?

lo — это loopback device, специальный виртуальный интерфейс, который система использует, чтобы общаться самой с собой. Благодаря lo даже без подключения к сети локальные приложения могут взаимодействовать друг с другом.

Ты уже заметил, что из твоего компьютера не вылазят миллиарды проводов, напрямую подключённые ко всем другим компьютерам мира. Для организации сети нужны дополнительные устройства.

Например, свитч (switch).

Свитч — это такое устройство, которое формирует сеть, и в которое подключаются наши машинки через порты. Задача свитча L2 (есть ещё более продвинутые, относящиеся к L3 и даже к L7) — перенаправлять кадры от MAC отправителя к MAC получателя. Множество машин, подключенных к одному свитчу формируют локальную сеть (LAN).

Конечно, пачка серверов подключенных к одному свитчу — это весьма тривиальный способ создать сеть. А что если мы хотим объединить в одну сеть сервера, находящиеся в разных физических локациях? Или, например, хотим логически разделить сервера подключенные к одному свитчу в одной локации в разные сети?

Для таких случаев создают VLAN (виртуальную локальную сеть), которую можно реализовать, например, при помощи свитча. Работает это достаточно просто: к кадрам добавляется дополнительный заголовок с VLAN-тегом, по которому и определяется к какой сети принадлежит кадр.

Другое устройство — мост (bridge). Мост L2 используют чтобы объединить две сети, сформированные при помощи свитчей, примерно таким образом:

И свитчи и мосты (а ещё хабы (hub), о которых почитай сам) помогают объединить несколько машин в одну сеть. А есть ещё маршрутизаторы (или роутеры, routers), которые соединяют сети между собой и работают уже на L3. Например, твой Wi-Fi роутер соединяет твою локальную сеть (в которой находятся твой ноутбук, телефон и планшет) с Интернетом.

Помимо LAN разделяют ещё несколько типов сетей. Например, WAN. Интернет можно считать за WAN, за тем исключением, что Интернет полностью стирает географические границы сети.

Как я уже упомянул, есть ещё свитчи L3, которые могут не просто перенаправлять кадры от одного устройства к другому, но и обладают более продвинутыми фишками, типа маршрутизации. Чем же отличается роутер от свитча L3, спросишь ты? Тут всё сложно (и скучно), но если тебе интересно, то прочитай статью Layer 3 Switches compared to Routers

Сетевой уровень (network layer)

На третьем, сетевом уровне используются не MAC, а IP адреса. Посмотрим IP адрес нашей машины при помощи той же самой команды ip:

[[email protected] ~]$ ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:05:36:e6 brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.212/24 brd 192.168.122.255 scope global dynamic eth0
       valid_lft 2930sec preferred_lft 2930sec
    inet6 fe80::5054:ff:fe05:36e6/64 scope link
       valid_lft forever preferred_lft forever

Интерфейсу eth0 присвоен адрес 192.168.122.212/24.

Но что такое /24? И почему у loopback интерфейса стоит /8? Ты уже, наверное, слышал, что всего существует 4 294 967 296 IPv4 адресов. Интернет — это не одна большая сеть, а много сетей поменьше. При этом для отдельных типов сетей (например, частных, недоступных извне сетей) выделены отдельные блоки IP адресов.

IPv6 адресов гораздо больше. Но полный переход IPv6 ещё не произошёл 🙂

CIDR — это метод выделения блоков адресов отдельным сетям. А CIDR-нотация — это способ описать этот блок в виде 192.168.122.212/24, где число /24, называемое маской, как раз и позволяет понять, сколько адресов входит в этот блок.

IPv4 — это простое число длинной 32 бита, которое можно представить в двоичном виде. В двоичной форме IP адреса идут от 00000000000000000000000000000000 до 11111111111111111111111111111111. Для удобства разобьём это число на 4 части по 8 цифр: 11111111.11111111.11111111.11111111. В привычной нам десятеричной системе этот адрес выглядит так: 255.255.255.255.

Маска /24 может быть представлена как 255.255.255.0, или, в двоичной системе, 11111111.11111111.11111111.00000000. Чтобы найти первый и последний адреса сети мы можем использовать один из адресов и маску сети, применив логическое побитовое И на их двоичном представлении:

11000000.10101000.01111010.11010100
&
11111111.11111111.11111111.00000000
=
11000000.10101000.01111010.00000000

И переведём результат в человеко-читаемую форму: 192.168.122.0 — начальный адрес нашей сети. Чтобы подсчитать число доступных адресов, нужно посчитать число нулей в маске. В нашем случае нулей, или разрядов, 8. Каждый может принимать значение 1 или 0, поэтому в сумме получаем 2^8 степени, или 256 адресов. Значит, последний адрес сети будет равен 192.168.122.255.

Вручную всё считать необязательно, можно воспользоваться калькулятором.

ARP

Мы уже знаем, что на L2 используются MAC-адреса, а на L3 — IP адреса. Должен существовать какой-то механизм, который ассоциирует MAC-адрес сервера с его IP адресом. Этот механим называется ARP (Address Resolution Protocol).

В Линуксе есть одноимённая команда arp, которая позволит посмотреть табличку известных машине MAC-адресов и соответствующих им IP адресов:

[[email protected]]# arp -n
Address HWtype HWaddress Flags Mask Iface
192.168.178.1 ether 5c:49:79:99:f3:23 C wlp3s0

В данном случае, 192.168.178.1 — это IP адрес моего Wi-Fi роутера, к которому ноутбук подключен через интерфейс wlp3s0.

Команда arp считается deprecated и вместо неё рекомендуется использовать ip neigh.

Один из видов кибер-атак связан с ARP и называется ARP spoofing. Цель такой атаки — подменить MAC-адрес, ассоциированный с определённым IP, на адрес машины хакера. Как страшно жить, да?

DHCP

Но как именно у сетевого интерфейса появляется IP адрес? Один из вариантов — задать его вручную. Недостаток: ручная работа. Если руки кривые, то можно настроить дублирующиеся адреса и получить конфликт 🙂

Другой вариант: Dynamic Host Configuration Protocol (DHCP), протокол, использующийся для автоматического выставления различной конфигурации, в том числе IP-адресов.

За детальным изучением DHCP обратись к документации в RFC: https://www.ietf.org/rfc/rfc2131.txt

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

Чтобы понять как именно работает DHCP, нам нужно отвлечься на понятие "broadcasting". Это процесс, в котором наш сервер отправляет сообщение на все сервера в сети, так как он не знает где именно находится та информация, которая ему нужна. Ближе всего такое broadcast общение к радио вещанию.

Как это происходит в случае с DHCP:

  1. DHCP-клиент отправляет broadcast сообщение с вопросом "Хочу IP адрес"
  2. DHCP-сервер его ловит и в ответ отправляет так же broadcast сообщение "У меня есть адрес x.x.x.x, хочешь его?"
  3. DHCP-клиент получает это сообщение и отправляет ещё одно: "Да, я хочу адрес x.x.x.x"
  4. DHCP-сервер отвечает "Хорошо, тогда x.x.x.x принадлежит тебе"

Вот в этом видео чуть более наглядно показан весь процесс: https://www.youtube.com/watch?v=RUZohsAxPxQ

А где хранятся настройки соединений?

Настройки сетевых подключений хранятся в /etc/sysconfig/network-scripts. Там ты можешь отредактировать такие вещи, как способ получения IP адреса (автоматический или статичный), стартовать ли соединение автоматически при загрузке системы и т.п. Например, вот так выглядит мой конфиг для Wi-Fi-соединения:

[[email protected] network-scripts]# cat ifcfg-FRITZ-Box_7490
HWADDR=4C:34:88:54:C1:2B
ESSID="FRITZ!Box 7490"
MODE=Managed
KEY_MGMT=WPA-PSK
TYPE=Wireless
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
NAME="FRITZ!Box 7490"
UUID=55ba9218-1d2f-407d-af13-51502d542edb
ONBOOT=yes
SECURITYMODE=open
PEERDNS=yes
PEERROUTES=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes

Обрати внимание на BOOTPROTO=dhcp — эта опция означает, что будет использован DHCP-сервер, в том числе для получения IP адреса. Для сравнения, конфиг соединения для loopback устройства:

[[email protected] network-scripts]# cat ifcfg-lo
DEVICE=lo
IPADDR=127.0.0.1
NETMASK=255.0.0.0
NETWORK=127.0.0.0
# If you're having problems with gated making 127.0.0.0/8 a martian,
# you can change this to something else (255.255.255.255, for example)
BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback

Здесь прописан статичный адрес: IPADDR=127.0.0.1. В домашнаних условиях вместо редактирования конфигов вручную можно использовать утилиту nmcli, либо установить пакетик NetworkManager-tui, который предоставит удобный текстовый интерфейс прямо в консоли. В боевых условиях на серверах лучше так не делать, а использовать систему конфигурации (Puppet, Chef, Salt).

Ещё одна важная часть конфигурации: роутинг. Как понять, куда именно побежит трафик? Всё просто: достаточно посмотреть локальную таблицу роутинга при помощи команды ip r. На момент написания этих строк я сижу в кофейне с ноутбука, который использует телефон как роутер. Вот что мне выдаёт ip r:

default via 172.20.10.1 dev wlp3s0 proto static metric 600
172.20.10.0/28 dev wlp3s0 proto kernel scope link src 172.20.10.3 metric 600
192.168.100.0/24 dev virbr2 proto kernel scope link src 192.168.100.1
192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1

Как видишь, весь трафик идёт по-умолчанию на машинку с адресом 172.20.10.1. А если выполнить ip addr show, то можно увидеть, что у сетевого интерфейса в ноутбуке так же есть IP адрес из этой сети:

4: wlp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 4c:34:88:54:c1:2b brd ff:ff:ff:ff:ff:ff
    inet 172.20.10.3/28 brd 172.20.10.15 scope global dynamic wlp3s0
       valid_lft 83892sec preferred_lft 83892sec
    inet6 fe80::4e34:88ff:fe54:c12b/64 scope link
       valid_lft forever preferred_lft forever

Командой ip r add можно добавлять новые пути, а командой ip r del — удалять.

DNS

Про DNS ты наверняка слышишь не в первый раз. Простая идея: обращаться к серверу не по IP адресу (тяжело запомнить для людей), а по нормальному имени.

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

Обязателен к прочтению материал от Cisco DNS Best Practices, Network Protections, and Attack Identification — там узнаешь не только все основы DNS, но и кучу важных рекомендаций по созданию безопасного и устойчивого DNS-сервера.

Есть возможность обновлять записи в DNS-сервере динамически. Для этого почитай про nsupdate. Ниже найдёшь ссылку на отличное руководство по настройке, включая безопасное обновление записей. Одно из интересных применений — service discovery. Поищи в Интернете, о чём это, или дождись соответствующей статьи на mkdev 😉

До появления DNS всё, что у нас было — это файлик /etc/hosts. Он и сейчас часто используется.

Рубрика "Вирусы для чайников"! Открываем /etc/hosts на компьютера друга и добавляем туда строчку 52.28.20.212 vk.com. Хватит другу сидеть вконтакте, пусть учится разработке!

Ещё очень интересен файлик /etc/nsswitch.conf. В нём определяется в каком порядке и где искать разную информацию, в том числе где искать хосты. По-умолчанию, сначала они ищутся в /etc/hosts, а уже потом отправляется запрос в DNS-сервер.

Используемый для разрешения DNS-имён сервер, кстати, указан в /etc/resolv.conf.

Дебажить DNS проблемы удобнее всего командой dig и nslookup. Например, чтобы запросить информацию о mkdev.me у nameserver 8.8.8.8 можно сделать так:

# dig mkdev.me @8.8.8.8

; <<>> DiG 9.10.3-P4-RedHat-9.10.3-12.P4.fc23 <<>> mkdev.me @8.8.8.8
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 3320
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;mkdev.me. IN A

;; ANSWER SECTION:
mkdev.me. 299 IN A 52.28.20.212

;; Query time: 355 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Fri May 27 12:51:04 CEST 2016
;; MSG SIZE rcvd: 53

Виртуалки

До этого момента все примеры выполнялись на локальной машине. Это, конечно, полезно для восприятия, но не так интересно. Поэтому дальше мы укрепим только что прочитанное при помощи виртуальных машин и libvirt, а заодно познакомимся с ещё парой терминов.

В первую очередь, создадим виртуалку при помощи virt-install:

sudo virt-install --name mkdev-networking-basics-1 \
--location ~/Downloads/CentOS-7-x86_64-Minimal-1511.iso \
--initrd-inject /path/to/ks.cfg \
--extra-args ks=file:/ks.cfg \
--memory=1024 --vcpus=1 --disk size=8

По-умолчанию libvirt создаёт одну сеть:

[[email protected]]# virsh net-list
 Name State Autostart Persistent
----------------------------------------------------------
 default active yes yes

Блок 192.168.0.0/16 выделен для частных сетей. libvirt выделил для своей сети блок 192.168.122.212/24, то есть все адреса от 192.168.122.0 до 192.168.122.255.

Чтобы посмотреть подробную информацию о конкретной сети можно использовать либо virsh net-info, либо virsh net-dumpxml. Вторая команда вернёт гораздо больше деталей, поэтому используем её:

[[email protected] ~]# virsh net-dumpxml default
<network connections='1'>
  <name>default</name>
  <uuid>f2ee9249-6bed-451f-a248-9cd223a80702</uuid>
  <forward mode='nat'>
    <nat>
      <port start='1024' end='65535'/>
    </nat>
  </forward>
  <bridge name='virbr0' stp='on' delay='0'/>
  <mac address='52:54:00:83:b4:74'/>
  <ip address='192.168.122.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.122.2' end='192.168.122.254'/>
    </dhcp>
  </ip>
</network>

connections показывает количество машинок, подключённых к этой сети. Подробное описание всех возможных опций этого XML-файла можно прочитать в документации libvirt. Нас же сейчас интересуют два слова: bridge и dhcp.

bridge, или устройство virbr0, или virtual network switch — это специальное устройство, в которое подсоединяются все виртуалки этой сети. Все запросы от одной виртуалки к другой в пределах одной сети идут через этот виртуальный свитч. Для каждой сети libvirt создаёт по одному виртуальному свитчу и каждый свитч распознаётся как отдельное устройство на хост машине:

[[email protected]]# ip link show
8: virbr1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT
    link/ether 52:54:00:a8:02:f2 brd ff:ff:ff:ff:ff:ff

Создание сети в libvirt по умолчанию приравнивается к созданию виртуального свитча, к которому цепляются все виртуалки, тем самым образую локальную сеть, LAN.

Реализован свитч virbr0 при помощи Linux Bridge — технологии, изначально предназначенной как раз для создания виртуальных локальных сетей. Выполнив команду brctl show на хост-машине можно увидеть список всех свитчей.

Linux Bridge "слегка" отличается от типичного железного свитча L2. За годы его существования к нему прилепили множество дополнительных фич, например, фильтрацию трафика и файрвол. Корректнее всего назвать его свитчем L3, но здесь ваш покорный слуга не уверен до конца.

Теперь обратим внимание на следующую секцию:

  <ip address='192.168.122.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.122.2' end='192.168.122.254'/>
    </dhcp>
  </ip>

Здесь указан блок адресов, использующихся для виртуальных машин в этой сети. 192.168.122.1 — IP-адрес хост-машины в пределах этой виртуальной сети.

Выполнив ip r в виртуалке увидим:

[[email protected] ~]$ ip r
default via 192.168.122.1 dev eth0 proto static metric 100
192.168.122.0/24 dev eth0 proto kernel scope link src 192.168.122.209 metric 100

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

Как мы уже знаем, за назначение IP адресов отвечает служба DHCP. Libvirt использует dnsmaq для DHCP и DNS и запускает по экземпляру dnsmasq для каждой сети.

`[[email protected] ~]# ps aux | grep dns
nobody 10600 0.0 0.0 15548 856 ? S Apr01 0:02 /sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper
root 10601 0.0 0.0 15520 312 ? S Apr01 0:00 /sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper

Мы можем посмотреть табличку DHCP, которая покажет нам выданные адреса:

[[email protected]]# virsh net-dhcp-leases default
 Expiry Time MAC address Protocol IP address Hostname Client ID or DUID
-------------------------------------------------------------------------------------------------------------------
 2016-04-29 16:31:19 52:54:00:05:36:e6 ipv4 192.168.122.212/24 - -

Обрати внимание, что 52:54:00:05:36:e6 это MAC-адрес интерфейса eth0 нашей виртуалки.

NAT

Читая ранее про CIDR тебя могло кое-что насторожить: даже если мы разделим сеть на много блоков, то общее количество IP адресов не увеличится. На самом деле, всегда используется комбинация из частных и публичных адресов. Обычно за одним публичным адресом прячется множество машин, у каждой из которых есть свой частный адрес.

Это так же и верно для наших виртуалок. У каждой есть частный IP-адрес из блока 192.168.122.0/24, и все они скрываются за публичным адресом хост-машины.

Хост-машина, если мы продолжаем использовать для неё свой личный ноутбук у себя дома, прячется на Wi-Fi роутером и так же не обладает собственным публичным адресом.

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

Эту проблему решает NAT (Network Address Translation) — механизм преобразования IP адресов в сетевых пакетах. Обычно в пакете указан IP, откуда пакет отправлен и IP, куда пакет идёт. NAT позволяет динамически менять эти адреса и сохранять таблицу подменённых адресов.

Существует SNAT (source NAT), который и используется для наших виртуалок для доступа в Интернет. Когда пакет отправляется, то его исходящий адрес заменяется на адрес хост машины. Когда ответ от сервера назначения идёт назад, то адрес меняется с адреса хост машины на адрес виртуалки. Меняет адрес роутер.

DNAT (destination NAT) занимается примерно тем же самым, но наоборот: это когда ты обращаешься к некоему публичному адресу, за которым скрываются частные, локальные адреса.

NAT — способ по умолчанию для общения виртуалок с внешним миром. Но libvirt штука гибкая. Можно, например, цеплять виртуалки напрямую к физическому интерфейсу хоста, вместо виртуального свитча. Вариантов создания сети, на самом деле, много.

Для NAT libvirt использует iptables. Если кратко, то это инструмент, отвечающий за фильтрацию сетевых пакетов. iptables настраиваются через специальные правила (rules), которые комбинируются в цепочки (chains). Вот путём добавления таких правил libvirt и добавляет нашим виртуалкам доступ в Интернет, используя NAT. Мы вернёмся к iptables когда будем говорить о безопасности в целом.

Ещё для того чтобы на хосте работало перенаправление пакетов в настройках ядра должна быть включена опция ipforward. Включается она просто: `echo 1 > /proc/sys/net/ipv4/ipforward`

tcpdump

Пожалуй, самый незаменимый инструмент для дебаггинга сетевых проблем, а, конкретнее, трафика, который проходит через нашу машину — это tcpdump. Уметь им пользоваться обязательно. Посмотрим, например, что происходит на нашем virbr0 при перезапуске виртуалки.

Открываем консоль на хост-машине и делаем tcpdump -i virbr0.

Открываем отдельное окошко и делаем virsh reboot #{номер_виртуалки}.

Смотрим результат в первом окошке и видимо откуда какие запросы пришли:

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on virbr0, link-type EN10MB (Ethernet), capture size 262144 bytes
12:57:31.339135 IP6 :: > ff02::16: HBH ICMP6, multicast listener report v2, 1 group record(s), length 28
12:57:31.397937 IP 0.0.0.0.bootpc > 255.255.255.255.bootps: BOOTP/DHCP, Request from 52:54:00:e0:06:54 (oui Unknown), length 300
12:57:31.398182 IP linux.fritz.box.bootps > 192.168.122.209.bootpc: BOOTP/DHCP, Reply, length 301
12:57:31.590332 ARP, Request who-has linux.fritz.box tell 192.168.122.209, length 28
12:57:31.590373 ARP, Reply linux.fritz.box is-at 52:54:00:7e:33:23 (oui Unknown), length 28
12:57:31.590409 IP 192.168.122.209.38438 > linux.fritz.box.domain: 61342+ A? 0.centos.pool.ntp.org. (39)
12:57:31.590458 IP 192.168.122.209.38438 > linux.fritz.box.domain: 25671+ AAAA? 0.centos.pool.ntp.org. (39)
12:57:31.590618 IP linux.fritz.box.domain > 192.168.122.209.38438: 25671 0/0/0 (39)
### И так далее

Вот, например, broadcast от виртуалки: 12:57:31.397937 IP 0.0.0.0.bootpc > 255.255.255.255.bootps: BOOTP/DHCP, Request from 52:54:00:e0:06:54 (oui Unknown), length 300.

Ну и заодно глянем ARP табличку:

Address HWtype HWaddress Flags Mask Iface
# ...
192.168.122.209 ether 52:54:00:e0:06:54 C virbr0
# ...
VPN

Иногда (на самом деле, очень часто) необходимо сделать так, как будто и клиент и сервер находятся в одной частной сети. Например, когда все сервисы компании находятся в закрытой сети, доступной только в офисе, и нужно дать сотрудникам удалённый доступ. Или когда у компании несколько офисов или дата центров, которые нужно соединить друг с другом так, чтобы по-прежнему не открывать всю сеть всему интернету.

По сути VPN — это вложение одного tcp/ip пакета в другой и шифрование содержимого. Получается виртуальная сеть работающая внутри реальной сети. Для виртуальных сетей создаются виртуальные сетевые устройства (tun/tap) с виртуальными же IP адресами, видимыми только внутри нашей виртуальной зашифрованной сети.

Я оставлю настройку VPN за пределами этой статьи. На совести читателя останется попробовать это сделать самостоятельно при помощи OpenVPN или strongSwan.

Мы ещё вернёмся к тебе безопасности, но ты уже можешь почитать про IPsec — этот протокол использует strongSwan.

Для самостоятельного изучения

Мы только что пробежались по самым основам сетей, но, конечно же, есть ещё с десяток технологий, которые стоит посмотреть. Погугли самостоятельно VXLAN, изучи TCP и UDP (и разберись когда какой использовать), глянь что такое ICMP. Ты постоянно будешь сталкиваться с новыми терминами, но, как и всегда, главное — усвоить основы.

Мы не поднялись до более высоких уровней модели OSI, не посмотрели различные протоколы, с которыми работают веб-приложения: HTTP(S), FTP, SSH, NTP и многие другие.

Не забывай заглядывать в RFC. Это первая остановка в поиске нужной тебе информации по сетям.

Мы, скорее всего, вернёмся к этим темам в последующих статьях. Для меня лично сложнее всего было раньше понять именно то, как всё работает на уровнях ниже уровня приложения: все эти сети, подсети, непонятные проблемы с доступом от одного сервера к другому и т.п.

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

Что дальше?

Я знаю, что дорогой читатель ждёт-недождётся, когда я начну рассказывать про Chef, Puppet, Ansible и прочие модные штуки. Но рано, пока ещё рано. Нас ждёт ещё как минимум одна статья подобного рода, в которой мы рассмотрим все возможные способы аутенфицировать и авторизовывать пользователей и сервера, тем самым сильно копнув в сторону темы безопасности в целом.

Дополнительное чтение

Как я уже говорил, тема сетей сложная, глубокая и задействует множество различных частей. Ты наверняка чувствуешь лёгкую кашу в голове. Ничего страшного! Ссылки ниже помогут тебе ещё глубже усвоить всё, что тебе нужно знать о сетях.

mkdev.me

Отправить ответ

avatar
  Подписаться  
Уведомление о