Чому DNS працює так, як це робиться?


40

Це канонічне запитання щодо DNS (сервіс доменних імен).

Якщо моє розуміння системи DNS правильне, реєстр .com містить таблицю, яка відображає домени (www.example.com) на серверах DNS.

  1. Яка перевага? Чому б не вказати безпосередньо на IP-адресу?

  2. Якщо єдиний запис, який потрібно змінити, коли я конфігурую DNS-сервер для вказівки на іншу IP-адресу, знаходиться на сервері DNS, чому процес не є миттєвим?

  3. Якщо єдиною причиною затримки є кеші DNS, чи можливо їх обійти, щоб я міг бачити, що відбувається в режимі реального часу?


18
Для всіх людей, які намагаються перенести / закрити це питання: Будь ласка, залиште його тут. Тут є дім, де його можна любити і ніжно доглядати. І ми можемо навести всі питання "Як працює DNS" тут як канонічну відповідь, оскільки на це дуже добре відповіли.
Марк Хендерсон

You can not able full understand DNS unless you are name Paul Mockapetris, Paul Vixie or Cricket Liu. twitter.com/DEVOPS_BORAT/status/249006925767909376
Ентоні Хацопулос

Відповіді:


87

Насправді, це складніше, ніж це - а не один "центральний реєстр (який) містить таблицю, яка відображає домени (www.mysite.com) на DNS-сервери", є кілька шарів ієрархії

Там в центральний реєстр (кореневі сервери) , які містять тільки невеликий набір записів: при NS (сервера імен) записи для всіх доменів верхнього рівня - .com, .net, .org, .uk, .us, .au, і так далі.

Ці сервери просто містять записи NS для наступного рівня вниз. Для того, щоб вибрати один приклад, сервери імен для .ukдомену тільки має записів для .co.uk, .ac.ukі інші зони другого рівня в використанні в Великобританії.

Ці сервери просто містять записи NS для наступного рівня вниз - щоб продовжити приклад, вони підкажуть вам, де знайти записи NS google.co.uk. Саме на тих серверах ви нарешті знайдете відображення між іменем хоста www.google.co.ukта IP-адресою.

В якості додаткової зморшки кожен шар також буде служити записом "клею". Кожна запис NS відображає домен до імені хоста - наприклад, NS записує .ukсписок nsa.nic.ukяк один із серверів. Щоб перейти до наступного рівня, нам потрібно з’ясувати записи NS, які nic.ukє, і вони, як виявиться, включають nsa.nic.ukтакож. Отже, зараз нам потрібно знати IP nsa.nic.uk, але щоб дізнатися, що нам потрібно зробити запит nsa.nic.uk, але ми не можемо зробити цей запит, поки не будемо знати IP для nsa.nic.uk...

Щоб вирішити цю дилему, сервери для .ukдодавання запису A для nsa.nic.ukInto The ADDITIONAL SECTIONвідповіді (реакції нижче обрізається для стислості):

jamezpolley@li101-70:~$dig nic.uk ns

; <<>> DiG 9.7.0-P1 <<>> nic.uk ns
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 21768
;; flags: qr rd ra; QUERY: 1, ANSWER: 11, AUTHORITY: 0, ADDITIONAL: 14

;; QUESTION SECTION:
;nic.uk.                IN  NS

;; ANSWER SECTION:
nic.uk.         172800  IN  NS  nsb.nic.uk.
nic.uk.         172800  IN  NS  nsa.nic.uk.

;; ADDITIONAL SECTION:
nsa.nic.uk.     172800  IN  A   156.154.100.3
nsb.nic.uk.     172800  IN  A   156.154.101.3

Без цих додаткових записів про клей ми ніколи не зможемо знайти сервери імен, nic.uk.тому ми ніколи не зможемо знайти жодні домени, розміщені там.

Щоб повернутися до своїх питань ...

а) Яка перевага? Чому б не вказати безпосередньо на IP-адресу?

З одного боку, вона дозволяє редагувати зміни до кожної окремої зони. Якщо ви хочете оновити запис для www.mydomain.co.uk, вам просто потрібно буде відредагувати інформацію на mydomain.co.ukсервері імен вашого . Не потрібно повідомляти центральних .co.ukсерверів, або .ukсерверів, або кореневих серверів імен. Якби був лише єдиний центральний реєстр, який відображав усі рівні аж до ієрархії, яку потрібно було повідомляти про кожну зміну запису DNS аж до ланцюга, він би абсолютно завалений трафіком.

До 1982 року саме таким чином і сталося дозвіл назви. Один центральний реєстр був повідомлений про всі оновлення, і вони поширили файл, hosts.txtякий називався, що містив ім'я хоста та IP-адресу кожної машини в Інтернеті. Нова версія цього файлу публікувалася кожні кілька тижнів, і кожна машина в Інтернеті повинна була б завантажити нову копію. До 1982 року це почало ставати проблематичним, і тому DNS був винайдений для забезпечення більш розподіленої системи.

Інша справа, це була б Єдина точка збою - якби єдиний центральний реєстр знизився, весь Інтернет був би в автономному режимі. Наявність розподіленої системи означає, що збої зачіпають лише невеликі розділи Інтернету, а не всю справу.

(Щоб забезпечити додаткову надмірність, насправді існує 13 окремих кластерів серверів, які обслуговують кореневу зону. Будь-які зміни в записах доменів верхнього рівня повинні бути перенесені на всі 13; уявіть собі, що потрібно координувати оновлення всіх 13 з них для кожної зміни до будь-якого імені хоста в будь-якій точці світу ...)

b) Якщо єдиний запис, який потрібно змінити, коли я конфігурую DNS-сервер для вказівки на іншу IP-адресу, знаходиться на сервері DNS, чому процес не є миттєвим?

Оскільки DNS використовує багато кешування для прискорення роботи та зменшення навантаження на NSes. Без кешування кожен раз, коли ви відвідували google.co.ukкомп’ютер, доведеться виходити в мережу, щоб шукати сервери для .uk, то .co.uk, то .google.co.uk, то www.google.co.uk. Ці відповіді насправді не сильно змінюють, тому щоразу їх шукати - це марна трата часу та мережевого трафіку. Натомість, коли NS повертає записи на ваш комп'ютер, воно буде включати значення TTL, яке повідомляє вашому комп'ютеру кешувати результати протягом декількох секунд.

Наприклад, записи NS .ukмають TTL 172800 секунд - 2 дні. Google ще більш консервативний - записи NS google.co.ukмають TTL 4 дні. Служби, які розраховують на можливість швидкого оновлення, можуть вибирати набагато нижчий TTL - наприклад, telegraph.co.ukTTL складає всього 600 секунд у своїх записах NS.

Якщо ви хочете, щоб оновлення вашої зони були майже миттєвими, ви можете знизити TTL так далеко, як вам подобається. Чим нижче ваш набір, тим більше трафіку будуть бачити ваші сервери, оскільки клієнти частіше оновлюють свої записи. Кожен раз, коли клієнту доводиться звертатися до ваших серверів, щоб зробити запит, це спричинить деяке відставання, оскільки це повільніше, ніж шукати відповідь у своєму локальному кеші, тому ви також хочете розглянути можливість компромісу між швидкими оновленнями та швидким обслуговуванням.

c) Якщо єдиною причиною затримки є кеші DNS, чи можливо їх обійти, щоб я міг бачити, що відбувається в режимі реального часу?

Так, це легко, якщо ви тестуєте вручну за допомогою digабо подібних інструментів - просто скажіть, на якому сервері звернутися.

Ось приклад кешованої відповіді:

jamezpolley@host:~$dig telegraph.co.uk NS

; <<>> DiG 9.7.0-P1 <<>> telegraph.co.uk NS
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 36675
;; flags: qr rd ra; QUERY: 1, ANSWER: 8, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;telegraph.co.uk.       IN  NS

;; ANSWER SECTION:
telegraph.co.uk.    319 IN  NS  ns1-63.akam.net.
telegraph.co.uk.    319 IN  NS  eur3.akam.net.
telegraph.co.uk.    319 IN  NS  use2.akam.net.
telegraph.co.uk.    319 IN  NS  usw2.akam.net.
telegraph.co.uk.    319 IN  NS  use4.akam.net.
telegraph.co.uk.    319 IN  NS  use1.akam.net.
telegraph.co.uk.    319 IN  NS  usc4.akam.net.
telegraph.co.uk.    319 IN  NS  ns1-224.akam.net.

;; Query time: 0 msec
;; SERVER: 97.107.133.4#53(97.107.133.4)
;; WHEN: Thu Feb  2 05:46:02 2012
;; MSG SIZE  rcvd: 198

Розділ прапорів тут не містить aaпрапор, тому ми можемо бачити, що цей результат вийшов із кеша, а не безпосередньо з авторитетного джерела. Насправді ми можемо бачити, що воно походить від 97.107.133.4одного з локальних DNS-розв’язувачів Linode. Той факт, що відповідь було подано з кеш-пам'яті дуже близько до мене, означає, що для отримання відповіді мені знадобилося 0 мс; але, як ми побачимо за мить, ціна, яку я плачу за цю швидкість, полягає в тому, що відповідь застаріла майже за 5 хвилин.

Щоб обійти резолюцію Linode та перейти до джерела, просто виберіть одну з цих NSes і скажіть dig, щоб безпосередньо зв’язатися з нею:

jamezpolley@li101-70:~$dig @ns1-224.akam.net telegraph.co.uk NS

; <<>> DiG 9.7.0-P1 <<>> @ns1-224.akam.net telegraph.co.uk NS
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 23013
;; flags: qr aa rd; QUERY: 1, ANSWER: 8, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;telegraph.co.uk.       IN  NS

;; ANSWER SECTION:
telegraph.co.uk.    600 IN  NS  use2.akam.net.
telegraph.co.uk.    600 IN  NS  eur3.akam.net.
telegraph.co.uk.    600 IN  NS  use1.akam.net.
telegraph.co.uk.    600 IN  NS  ns1-63.akam.net.
telegraph.co.uk.    600 IN  NS  usc4.akam.net.
telegraph.co.uk.    600 IN  NS  ns1-224.akam.net.
telegraph.co.uk.    600 IN  NS  usw2.akam.net.
telegraph.co.uk.    600 IN  NS  use4.akam.net.

;; Query time: 9 msec
;; SERVER: 193.108.91.224#53(193.108.91.224)
;; WHEN: Thu Feb  2 05:48:47 2012
;; MSG SIZE  rcvd: 198

Видно, що цього разу результати подавались безпосередньо з джерела - зверніть увагу на aaпрапор, який вказує на те, що результати надійшли від авторитетного джерела. У моєму попередньому прикладі результати отримані з мого локального кешу, тому їм не вистачає aaпрапора. Я бачу, що авторитетне джерело для цього домену встановлює TTL 600 секунд. Результати, які я отримав раніше з локального кешу, мали TTL всього 319 секунд, що говорить мені, що вони сиділи в кеші протягом 600-319 секунд - майже 5 хвилин - перш ніж я їх побачив.

Хоча TTL тут складає всього 600 секунд, деякі провайдери намагаються ще більше зменшити свій трафік, змушуючи свої DNS-рішення для кешування результатів довше - в деяких випадках протягом 24 годин і більше. Традиційно (таким чином, як ми не знаємо, якщо це є насправді необхідним, але будемо безпечним) вважати, що будь-яка зміна DNS, яку ви внесите, не буде видно скрізь на Інтернет на 24-48 годин.


3
+1 Це одне дивовижне пояснення. Однозначно це стане закладкою!
Trollhorn

3
Справжня відповідь на те, відповідь DNS надходила з кешу чи ні, є в розділі "прапори" відповіді. Немає технічних причин, чому не можна було б встановити TTL, скажімо, 319 секунд. Натомість шукайте aa(авторитетну відповідь) flagу відповіді. Якщо aaвін присутній, відповідь надійшла безпосередньо з авторитетного сервера імен. (Якщо його немає, відповідь може бути свіжою; деякі рекурсивні сервери імен очищають aaпрапор перед тим, як передавати відповідь клієнтові.)
CVn

3
Слід зазначити, що деякі провайдери кешуватимуть записи DNS набагато довше, ніж TTL говорить, що вони повинні, тому навіть при дуже коротких TTL-файлах ви не можете гарантувати, що всі відвідувачі сайтів отримають правильну IP-адресу на день-два після переїзду. сайт.
Дан Нілі

2
@JamesPolley є (незначна) помилка у вашому поясненні при використанні .ukсерверів. В даний час домени другого рівня, якими керує Nominet, знаходяться на тих же серверах uk., що і запит example.co.ukдо ukсерверів отримає делегацію негайно, не спершу проходячи делегування на co.ukсервери.
Альнітак

1
Зауважте, що +traceпараметр dig запитає ваш налаштований сервер імен для кореневих серверів імен, щоб він міг розпочати пошук. Якщо ваш локальний сервер імен dnsmasq(як на Ubuntu), він не підтримує це, тому ви отримаєте помилку. Використовуйте dig +trace @8.8.8.8 www.example.com. 8.8.8.8 - це загальнодоступна служба DNS Google. Використовуйте 1.1.1.1 для еквівалента Cloudflare.
Роджер Ліпскомб

9

а) Кількість відображень IP -> імен хостів у світі дійсно велика. Ця система розподіляє відповідальність за розміщення всіх піддоменних та MX-записів та всіх інших записів DNS перед власником доменного імені. Це в значній мірі суть доменного імені. .comпроводиться одним реєстром, де він .ukможе мати інший. Точно так же example.comі otherexample.comможуть бути розміщені окремо , так що ресурси можуть бути розподілені.

b) Це кешування, що зменшує кількість звернень на вашому хості DNS до незначної частки того, що було б інакше. За замовчуванням записи зберігаються 2 дні в кеші перед тим, як їх відкинути. Це можна змінити, змінивши TTL (час проживання) запису.

c) Ви можете ефективно зупинити кешування записів, встановивши дійсно короткий TTL. Це НЕ рекомендується, якщо ви не використовуєте його для динамічного DNS. Кешування значно знижує звернення до сервера DNS. Щоб вибрати здогаданий номер з ефіру, ми говоримо про зняття 95% запитів.


Щодо 'C', будьте обережні. Встановіть, що TTL досить низький, і ваш DNS-сервер може забитись. Не величезна проблема, якщо хтось, крім вас, обробляє DNS.
Publiccert

Тож якби не субдомени, переваги не було б
сабоф

4
Перхапс, але пам'ять навіть yourdomain.comє субдоменом .com. Якщо це був лише один великий "файл хостів" (як це було до того, як DNS і ельфи все ще ходили по середній землі), то так. Ви просто матимете один великий файл, і всі будуть кешувати це.
Філіп Кулінг

3
Простір імен DNS тривалий час був рівним, без делегацій; і він був реалізований як єдиний перелік, який проводився в одному місці. Це стало нездійсненним і його замінив DNS в 1982 році ...
Джеймс Поллі

1
@mfinni. Ну, це "система доменних імен", а не "розподілена система імен" чи щось подібне. Звичайно, він розроблений так, щоб бути розповсюджуваним, але нічого не говорить про те, що ви абсолютно повинні керувати цим шляхом. Для деяких невеликих офісних мереж, що не мають глобального зв’язку, наявність у кореневій зоні (або одного типу TLD типу local), ймовірно, має певний обмежений сенс.
CVn

3

Якщо ви перебуваєте в системі * nix, скачайте копію djbdns Дана Бернштейна з http://cr.yp.to/djbdns.html та запустіть його програму dnstrace, щоб побачити, як працює рекурсивна система запитів. Це дуже інформативно.


Чи дозволить мені побачити ефект зміни конфігурації миттєво?
сабоф

dnstrace (як правило, через dnstracesort) дає велику кількість детальних відомостей про конфігурацію DNS для будь-якого домену та запиту, який ви робите. Якщо сервер вніс зміни, вони покажуть зміну та спосіб її поширення. Вони також чудові для відстеження помилок поширення.
mikebabcock

3

a) Кількість можливих імен домену занадто велика, щоб обробляти один сервер. І є не просто .com; є .net, .org, .se, .info та будь-яка кількість інших. Додайте до цього, ви можете делегувати відповідальність за субдомен (що фактично comі є). Якщо DNS менш централізований, це полегшує управління.

b) Машини на шляху від користувача до вас мають кеші DNS, щоб мінімізувати кількість необхідних запитів. Наприклад, це запобігає, наприклад, спамуванню мережі із запитами на адресу "serverfault.com" щоразу, коли ви отримуєте сторінку від SF. Ці сервери можуть навіть кешувати результати "домену не існує", тому може пройти деякий час, щоб з'явився навіть зовсім новий домен.

c) Хоча ви можете відключити кеш-пам'ять, між вашим комп'ютером і DNS-сервером yourdomain.com часто є інші DNS-сервери. Наприклад, DNS-сервер вашого провайдера, спробує кешувати, наскільки це можливо. Єдині записи, які відносно швидко оновлюються по мережі, - це записи з коротким TTL (який, як правило, говорить, "я дійсний лише кілька секунд; після цього знову запитайте мене про поточну інформацію"). Причина TTL настільки висока, що сервер, відповідальний за домен, може перевантажувати частину роботи на інші сервери. Якби у вас вся мережа зверталася до вашого одного або двох серверів DNS-мережкових DNS для кожного звернення до вашого веб-сайту, вони були б майже непридатними, коли хтось побачив ваш сайт на /., Digg тощо.


Ваше (с) невірно. Це поширене непорозуміння DNS. Немає ланцюга серверів - локальної машини для маршрутизації до ISP до… - кожен звертається до наступного рядка. Запити переходять від клієнта DNS (бібліотеки), через єдиний проксі-сервер DNS-сервера, до нульового або більше DNS-серверів вмісту. Заборона існування проксі-серверів DNS для переадресації, це все .
JdeBP

2
@JdeBP: Це "повсюдне непорозуміння", оскільки, наскільки я бачив у реальному світі, це багато в чому правда . Якщо ви отримуєте свою адресу через DHCP, як це роблять усі, тоді вам майже напевно була надана адреса сервера DNS, який ви повинні використовувати. Що в домашніх мережах майже завжди є маршрутизатором, який, в основному, пересилається до DNS вашого провайдера. А в мережах малого бізнесу, як правило, є контролер домену - який, знову ж таки, зазвичай пересилається до DNS провайдера. Як правило, в цей момент ітеративний матеріал бере на себе.
cHao

Вам потрібно побачити більше реального світу, якщо ви думаєте, що "багато в чому правда" підходить взагалі. Я фактично згадав про проксі-проксі, як один додатковий предмет. Однак ви завищуєте їх використання в ділових мережах; і справді завищують, скільки змінюють контролери домену за замовчуванням, що є (після того, як вилучили будь-яку кореневу зону) для вирішення сервера DNS, використовуючи підказки root. Ваша основна помилка в (с) залишається не виправленою. Вимкнення кеша не магічно розкриває кеш "позаду". DNS просто не працює таким чином. Якщо ви не розумієте це, то ви неправильно його представляєте.
JdeBP

Справа в тому, що якщо ви вимкнете кеш на локальній машині, ви все одно побачите результати, кешовані DNS-сервером вашої локальної мережі. І якщо ви відключите це, ви все одно будете мати кеш свого провайдера, щоб турбуватися. Чи приймаєте ви це як звичайний випадок чи ні, це випадок, який я бачив майже кожного разу - що робить його досить загальним, щоб його варто було б згадати.
cHao

@cHao більшість DNS-серверів CPE лише "вперед" і не кешують.
Альнітак
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.