Яку максимальну кількість IP-адрес може мати запис DNS?


30

У мене є дивна ідея - нехай кілька людей / організацій розміщують одну програму, і всі їх вузли будуть доступні через одне доменне ім’я. Це для того, щоб, скажімо, була реально розподілена соціальна мережа, де зручність користування не приноситься в жертву (тобто користувачі не повинні пам’ятати різні URL-адреси провайдера, а потім, коли один постачальник не працює, переходить на інший)

Для цього я подумав, що може використовуватися запис DNS з декількома IP-адресами.

Отже, скільки IP-адрес може містити один запис DNS A? У цій відповіді сказано, що це близько 30, але використання там є іншим. Для вищезазначеного сценарію я не переймався б, якщо даний провайдер кешує лише 30, доки інший провайдер кешує ще 30, і так далі.


2
Ви берете про Anycast ?
Лежать Раян

4
Я деякий час тому дізнався, що якщо вам доведеться запитати "Яка максимальна кількість X?" ви, мабуть, неправильно використовуєте ...
LordOfThePigs

Не обов’язково;) Але загалом, так
Божо

Відповіді:


78

Відмова: Без образи, але це дуже погана ідея. Я не рекомендую нікому робити цього в реальному житті.

Але якщо ви дасте нудному ІТ-хлопцеві лабораторію, смішні речі трапляться!

Для цього експерименту я використовував сервер Microsoft DNS, що працює на сервері Server 2012 R2. Через ускладнення розміщення зони DNS в Active Directory я створив нову первинну зону з назвою testing.com, яка не інтегрована AD.

Використовуючи цей сценарій:

$Count = 1
for ($x = 1; $x -lt 256; $x++)
{
    for ($y = 1; $y -lt 256; $y++)
    {
        for ($z = 1; $z -lt 256; $z++)
        {
            Write-Host "1.$x.$y.$z`t( $Count )"
            $Count++
            dnscmd . /RecordAdd testing.com testing A 1.$x.$y.$z
        }
    }
}

Я продовжував створювати, без помилок, 65025 записів хостів для імені testing.testing.com., з буквально кожною IPv4 адресою від 1.1.1.1 до 1.1.255.255.

Тоді я хотів переконатися, що я можу пробити 65536 (2 ^ 16 біт) загальну кількість записів A без помилок, і я міг би, тому припускаю, що, ймовірно, міг пройти весь шлях до 16581375 (1.1.1.1 до 1.255 .255.255,), але я не хотів сидіти тут і дивитися, як цей сценарій працює всю ніч.

Занадто багато записів

Тож я вважаю, що можна впевнено сказати, що немає жодної практичної межі кількості записів A, які ви можете додати до зони з однаковою назвою з різними IP-адресами на своєму сервері.

Але чи справді це буде працювати з точки зору клієнта?

Ось що я отримую від свого клієнта, як його переглядає Wireshark:

два запити (Відкрийте зображення на новій вкладці браузера для повного розміру.)

nslookup

TCP-запит

Як бачите, коли я використовую nslookup або ping від свого клієнта, він автоматично видає два запити - один UDP і один TCP. Як ви вже знаєте, найбільше я можу наткнутися на дейтаграму UDP - це 512 байт, тож після перевищення цього ліміту (наприклад, 20-30 IP-адрес), замість цього потрібно використовувати TCP. Але навіть за допомогою TCP я отримую лише дуже невеликий підмножину записів A для testing.testing.com. Було повернуто 1000 записів за запитом TCP. Список записів A обертається на 1 належним чином із кожним наступним запитом, точно так, як ви б очікували, що буде працювати DNS з круглим доступом. Потрібно було б мільйони запитів, щоб обернутись по всім цим.

Я не бачу, як це допоможе вам зробити вашу масштабну масштабну, стійку мережу соціальних медіа, але все ж є ваша відповідь.


Редагувати: У своєму подальшому коментарі ви запитуєте, чому я вважаю, що це взагалі погана ідея.

  • Скажімо, я середній користувач Інтернету, і я хотів би підключитися до вашої служби. Я набираю www.bozho.biz у свій веб-браузер. Клієнт DNS на моєму комп’ютері отримує 1000 записів. Ну, невдача, перші 30 записів у списку не реагують на те, що список записів A не оновлюється, або, можливо, є масштабне відключення, що впливає на шматок Інтернету. Скажімо, у мого веб-браузера є час очікування 5 секунд на IP, перш ніж він перейде до наступного. Тож зараз я сиджу тут і дивлюся на крутячий пісочний годинник протягом 2 з половиною хвилин, чекаючи завантаження вашого сайту. Ніхто не має на це часу. І я просто припускаю, що мій веб-браузер або будь-яка інша програма, яку я використовую для доступу до вашої послуги, навіть намагатиметься більше ніж перші 4 або 5 IP-адрес. Мабуть, не буде.

  • Якщо ви використовували автоматичне підмітання та дозволяєте неперевірені або анонімні оновлення зони DNS з надією зберегти список записів A свіжим ... уявіть, наскільки це небезпечно! Навіть якщо ви створили іншу систему, де клієнтам потрібен клієнтський сертифікат TLS, який вони отримали від вас заздалегідь, щоб оновити зону, один компрометований клієнт в будь-якій точці планети збирається запустити ботнет і знищити вашу послугу. Традиційний DNS настільки небезпечний, як він є, без натовпу.

  • Гуморна використання смуги та відходів. Якщо для кожного запиту DNS потрібно 32 кілобайт або більше смуги пропускання, це зовсім не буде масштабним.

  • DNS круглий робін не замінює правильне врівноваження навантаження. Це не дає можливості відновитись із одного вузла, що йде вниз або стає недоступним посеред речей. Чи збираєтесь ви доручити своїм користувачам робити ipconfig / flushdns, якщо вузол, до якого вони були підключені, знизиться? Такі питання вже вирішені такими речами, як GSLB та Anycast.

  • І т.д.


15
Повільно .... плескайте ....., сер.
mfinni

4
Щоб додати до цього, якщо запити A запитуються через BIND (це те, що працює на більшості серверів DNS), вона перемістить записи A і поверне з неї певну кількість записів A. Це певне число визначено у MAX_SHUFFLEвихідному коді BIND (який за замовчуванням становить 32).
ub3rst4r

1
З цікавості, чому б ти не рекомендував це? Це, звичайно, дуже дивна річ, але окрім наявності зловмисних вузлів, які обслуговують запит під "добрим" доменом, і невдалі вузли все ще отримують запити, що ще може піти не так :-)
Божо

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

18

Щоб відповісти на запитання, як було зазначено ("скільки IP-адрес може містити один DNS-запис?"), Відповідь дуже проста: один Aзапис містить точно одну адресу. Однак може бути кілька Aзаписів для одного і того ж імені.


10

Кожна IPv4-адреса займе 16 байт у відповіді. Кожна IPv6-адреса займе 28 байт у відповіді.

Настійно рекомендуємо переконатися, що відповідь відповідатиме 512 байтам. Це дозволить отримати приблизно 25 IPv4-адрес та 14 IPv6-адрес (враховуючи, що вам потрібна ще якась інформація в пакеті). Точний ліміт залежить від довжини вашого доменного імені.

Якщо у вас є 25 IPv4-адрес і 14 IPv6-адрес, ви розраховуєте, що клієнти вимагають IPv4 та IPv6-адреси в окремих запитах. Якщо клієнт запитає обидва типи адрес в одному запиті (що рідко), то вам доведеться піти нижче.

Якщо розмір відповіді перевищує 512 байт, він все ще може працювати над UDP, якщо клієнт і сервер підтримують EDNS. Без EDNS клієнт отримав би усічену відповідь, і йому доведеться повторити спробу через TCP. Це збільшує зв’язок з 1 до 4 переходів. Але що ще гірше, іноді трапляються неправильні налаштування, які не дозволяють DNS над TCP працювати.

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

Якщо очікувати цього часу очікування навіть один раз, це може призвести до поганого досвіду користувача. Якщо клієнту довелося пройти 14 адрес, перш ніж отримати відповідь, користувачеві доведеться чекати 13 тайм-аутів.


2
Кожна DNS повинна підтримувати EDNS в наші дні. Обмеження 512 байтів для відповідей DNS вже не є практичним через DNSSEC.
Вармар

@Barmar Але якщо у вас це ввімкнено, існує досить значний ризик, що ваш сервер буде використовуватися в атаках посилення. Минулого разу, коли я перевірив, я виявив, що виключення вимкнення - це єдине, що можна зробити для пом’якшення атак посилення. Поки EDNS не розшириться полем cookie, і підтримка цього поширюється широко, вимкнення підтримки відповідей, що перевищує 512 байт, все ще рекомендується практикою.
kasperd

1
Мені не дуже подобаються результати пошуку для відключення EDNS як найкращої практики. Цитати, будь ласка? Атаки посилення, що використовують рекурсивні сервери, відбуватимуться незалежно від того, включений чи ні EDNS, якщо ваша мережа не здійснює перевірку адрес джерела. Навіть якщо ми говоримо про авторитетний сервер, який стає релевантним лише після того, як ви налаштували його повернути стільки даних в одній відповіді, після чого відключення цього не допоможе вам.
Андрій Б

@AndrewB Я не пам'ятаю, де я читав цю рекомендацію. Я прочитав багато різних рекомендацій, як уникнути атак посилення, і всі вони смокчуть. Шкода, що EDNS не представив файл cookie, який міг бути ефективним рішенням для атак посилення за допомогою DNS. Що я рекомендую у своїй відповіді, це уникати розміщення стільки запитів у запиті, щоб ви покладалися на інших, щоб включити EDNS, щоб відповіді були ефективними.
kasperd

@AndrewB Якщо я поміщаю записи в A більше 512 байтів і переконуюсь, що він розміщений на авторитетному сервері DNS, де включений EDNS, це може бути проблемою для користувачів рекурсивних дозволів, які не дозволяють відповіді настільки великі. І тому я рекомендую зберігати кількість записів А нижче. Більше того, я пояснив, чому сприйнята перевага багатьох записів A не така актуальна.
kasperd

5

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

Наприклад, ви можете застосувати сервер DNS, який відповідає на будь-який запит для запису A з випадковим IP-адресою. Досить запитуючи, це призведе до отримання 4294967296 унікальних записів A: по одному для кожної адреси IPv4.

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

Наприклад, я вибрав a338.g.akamaitech.net. Якщо я зараз дивлюся на це на своєму комп’ютері, який використовує призначений DHCP сервер імен з Comcast:

$ host a338.g.akamaitech.net
a338.g.akamaitech.net has address 23.3.98.65
a338.g.akamaitech.net has address 23.3.98.89

Що робити, якщо я запитаю DNS від Google?

$ host a338.g.akamaitech.net 8.8.8.8
Using domain server:
Name: 8.8.8.8
Address: 8.8.8.8#53
Aliases: 

a338.g.akamaitech.net has address 23.3.96.152
a338.g.akamaitech.net has address 23.3.96.120

Б'юсь об заклад, якщо ви спробуєте це, я вважаю, що ви отримаєте іншу відповідь. Скільки крайових серверів Akamai обслуговує якийсь конкретний ресурс? Більше двох,


Спасибі. Так, я знаю, що CDN працюють таким чином, але, на мій погляд, вони мають обмежену кількість записів на субдомен. (2 у вашому іспиті). Моє інше нещодавнє запитання стосується саме CDN та їхньої реалізації DNS :-)
Божо

2

Інші згадали про це як докладно, але з практичної точки зору жорстким обмеженням є обмеження розміру пакету UDP - 512 байт. Хоча можливо перейти на TCP при виявленні усікання, на практиці багато / більшість клієнтів цього не роблять (і, мабуть, не повинні; це дасть поганий досвід користувачеві для більшості програм, і я очікував би лише передачі зон або іншого спеціальні пошуки для підтримки TCP). Таким чином, ви дивитесь на обмеження десь близько 30 адрес для IPv4 (записів A) і дещо менше для IPv6 (AAAA), оскільки вони більші. Довжина доменного імені скорочується до цього і надалі обмежує їх кількість.


1
Ви цілком вірні, що є багато неповноправних клієнтів та розв’язувачів, які неправильно обробляють відповіді DNS, які не вписуються в єдину дейтаграму UDP, але, будь ласка, відмовтесь від думки, що більший розмір відповіді потребує лише передачі зон або незвичних запитів. З вашої відповіді ви явно не використовуєте перевірку DNSSEC, але багато людей є (і це не є єдиною причиною, чому потрібні більші відповіді, але це дуже важлива.)
Майкл Макналі

@MichaelMcNally: DNSSEC не призначений (принаймні, не розробниками на основі потоків у списках розсилки glibc, в яких я брав участь) використовуватись у кінцевих точках (додатках, що здійснюють пошук DNS), але на локальному рекурсивному сервері імен, який буде робити пошук від імені програм. Таким чином, навіть при налаштуванні DNSSEC немає підстав очікувати, що програми розмовлятимуть DNS через TCP. UDP працює чудово.
Р ..

1

Коротка відповідь: близько 25 A записів вміщується в пакет UDP. Крім того, DNS перейде на TCP, і це буде не так швидко. Ви також матимете проблеми з клієнтами, які не використовують DNS-рішення, здатні вибрати "найближчий" IP. Крім того, за допомогою wifi та мобільного телефону "найближчий" часто не стане правильним сервером.

Більш довга відповідь:

Не робіть цього. Кращим способом було б встановлення індивідуальних записів CNAME для кожного користувача, який вказує на відповідний сервер. Скажімо , у вас є два сервера, server-fі server-rвикористовується для IMAP. Налаштуйте клієнт IMAP кожної людини з ім'ям сервера USERNAME.imap.example.com, де "USERNAME" замінено на ім'я користувача електронної пошти. Тепер ви можете переміщувати людей між серверами без необхідності перенастроювати їх електронний клієнт.

server-f.example.com. IN A 10.10.10.10 server-r.example.com. IN A 10.20.20.20 wilma.imap.example.com. IN CNAME server-f.example.com. fred.imap.example.com. IN CNAME server-f.example.com. betty.imap.example.com. IN CNAME server-r.example.com. barney.imap.example.com. IN CNAME server-r.example.com.

Однак, якщо ви це зробите, Я ВІДОМО ВІДПОВІДУЮ, що ви генеруєте записи DNS автоматично з бази даних користувачів. Ви хочете переконатися, що в процесі створення та видалення облікових записів створюються та видаляються також записи DNS. Інакше у вас вийде безлад і багато плутанини.

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


0

Як зазначали інші, це жахлива ідея для використання в реальному світі.

У реальному світі є невідповідні клієнти та розв'язувачі, які мають проблеми з відповідями, які не можуть вміститися в одній дейтаграмі UDP, і є брандмауери, які застосовуватимуть конкретні, але не сумісні з протоколом уявлення про обмеження розміру повідомлень DNS.

І навіть якщо ви могли розраховувати на те, що ваш величезний відгук проникне у будь-якому випадку (чого ви явно не можете), є ще одна причина, що це дуже погана ідея. Чим більший розмір вашої відповіді DNS, тим більш спокусливим він стає корисним навантаженням для рефлексійних атак, оскільки ви надаєте величезний коефіцієнт посилення. У цьому типі атаки відмови в обслуговуванні, що є загальним для DNS, запит UDP надсилається до відкритого рекурсивного розв'язувача. Адреса джерела запитів UDP, як правило, легко підробляється, і зловмисник встановлює джерело запиту в IP своєї призначеної цілі. Досягаються два бажаних (для атакуючого) ефекту: по-перше, - відносно невеликі зусилля надсилання з їх боку (з невеликого підробленого запиту) призводять до порівняно великого потоку небажаного трафіку, що надходить до цілі (це коефіцієнт посилення), по-друге - фактичне джерело нападу приховано від цілі; ціль знає лише адреси рекурсивних розділювачів, які використовуються як відбивачі.


0

Цікавий момент історичних дрібниць з цього приводу. У 90-х AOL розширив свої записи DNS таким чином, що запит MX повернеться> 512 байт. Це порушило RFC, зламало багато SMTP-серверів (qmail був популярним у той час) і заподіяло сисадмінам багато головних болів. Виправлення вимагало або виправлення , або додавання статичних маршрутів.

Я не знаю, яка зараз ситуація, але кілька років тому, коли я востаннє торкнувся qmail, патчі все ще були на місці.

http://www.gossamer-threads.com/lists/qmail/users/30503

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