Анатомия поиска DNS в Linux

Анатомияпоискаdnsвlinux

Поскольку я работаю а лот с сгруппированными ВМ , я потратил много времени, пытаясь выяснить, как DNS-запросы работают. Я применил «исправления» к своим проблемам из StackOverflow, не понимая, почему они работают (или не работают) в течение некоторого времени.

В конце концов я надоело это и решил разобраться, как все это взаимосвязано. Я не мог найти полное руководство по этому поводу нигде в Интернете, и разговаривал с коллегами, которых они не знали ни о чем (или о том, что на самом деле происходит в деталях)

Итак, я сам пишу руководство.

Оказывается, во фразе «Linux выполняет поиск в DNS» довольно много слов…


Другие публикации серии:

Анатомия поиска DNS в Linux – Часть II

Анатомия поиска DNS в Linux – Часть III

Анатомия поиска DNS в Linux – Часть IV

Анатомия Поиск DNS в Linux – Часть V – Два кошмара отладки


linux-dns-0

“Как трудно это может быть?”


Эти сообщения предназначены для разбора того, как программа решает, как она получает IP-адрес на хосте Linux и компоненты, которые могут быть задействованы. Без понимания того, как эти части сочетаются друг с другом, отладка и устранение проблем с помощью (для пример) dnsmasq , бродячий Landrush , или же resolvconf может вызывать крайнее недоумение.

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

Я даже написал несколько код автоматизации , позволяющий мне экспериментировать на виртуальной машине. Добавления / исправления приветствуются.

Обратите внимание, что это не сообщение о том, как работает DNS. Это касается всего, вплоть до вызова фактического DNS-сервера, настроенного на хосте Linux (при условии, что он даже вызывает DNS-сервер - как вы увидите, в этом нет необходимости), и как он может узнать, к какому из них перейти, или как получить IP-адрес другим способом 4426



linux-dns-1

Это не как это работает


Первое, что нужно понять, это то, что в Linux не существует единого метода поиска DNS. Это не основной системный вызов с чистым интерфейсом.

Однако существует стандартный Вызов библиотеки C, который называется ny программы используют: getaddrinfo . Но не все приложения используют это!

Давайте просто возьмем две простые стандартные программы: пинг и хозяин:

 
 root @ linuxdns1: ~ #  ping  -c1 bbc.co.uk |  голова -1   PING bbc.co.uk ( 188. 121. 201. 86 ) 63 (86) байтов данных.   
  root @ linuxdns1: ~ #  хост  bbc.co. uk |  голова -1   bbc.co.uk имеет адрес  174. 110. 201. 86    

Они оба получают то же самое результат, значит, они должны делать то же самое, верно?

Неправильно.

Вот файлы, которые пингуются смотрит на мой хост, которые имеют отношение к DNS:

root @ linuxdns1: ~ # strace -e trace = open -f ping -c1 google.com
 открыть ("https://zwischenzugs.com/etc/ld.so .cache ", O_RDONLY | O_CLOEXEC) = 3  
 открыть ("https://zwischenzugs.com/lib/x110 _ 86 - linux-gnu / libcap.so.2 ", O_RDONLY | O_CLOEXEC) = 3   open ("https://zwischenzugs.com/lib/x100 _ 81 - linux-gnu / libc.so.6 ", O_RDONLY | O_CLOEXEC) = 3   open ("https://zwischenzugs.com/etc/resolv.conf", O_RDONLY | O_CLOEXEC) = 4   опе  n ("https://zwischenzugs.com/etc/resolv.conf", O_RDONLY | O_CLOEXEC) = 4  
 open ("https: // zwischenzugs.com/etc/nsswitch.conf ", O_RDONLY | O_CLOEXEC) = 4  
 открыть ("https://zwischenzugs.com/etc/ld .so.cache ", O_RDONLY | O_CLOEXEC) = 4   открыть ("https://zwischenzugs.com/lib/x110 _ 84 - linux-gnu / libnss_files.so.2 ", O_RDONLY | O_CLOEXEC) = 4   open ("https://zwischenzugs.com/etc/host.conf", O_RDONLY | O_CLOEXEC) = 4   открыть ("https://zwischenzugs.com/etc/hosts", O_RDONLY | O_CLOEXEC)   = 4   open ("https://zwischenzugs.com/etc/ld.so.cache", O_RDONLY | O_CLOEXEC) = 4   open ("https://zwischenzugs.com/lib/x110 _ 81 - linux-gnu / libnss_dns.so.2 ", O_RDONLY | O_CLOEXEC) = 4   открыть ("https: //zwischenzugs.com/lib/x110 _ 100 - linux-gnu / libresolv.so.2 ", O_RDONLY | O_CLOEXEC) = 4   ПИНГ google.com (233. 81. 216. 53) 63 (100) байтов данных.  
 open ("https://zwischenzugs.com/etc/hosts", O_RDONLY | O_CLOEXEC )   = 4   84 байт из lhr 31 s  - ин-ф 18. 1e 110.сеть (. 81. 216. 58): icmp_seq = 1 ttl = 81 время = 21. 0 мс  

и то же самое для хозяин:

 
 $ strace -e trace = open -f host google.com   [pid 9869] открыть ("https://zwischenzugs.com/usr/share/locale/en_US.UTF-8/LC_MESSAGES/libdst. cat ", O_RDONLY) = -1 ENOENT (Нет такого файла или каталога) 
 
 [pid 9869] открыть ("https://zwischenzugs.com/ usr / share / locale / en / libdst.cat ", O_RDONLY) = -1 ENOENT (Нет такого файла или каталога)  [pid 9869] открыто ("https://zwischenzugs.com/usr/share/locale/en/LC_MESSAGES/libdst.cat", O_RDONLY) = -1 ENOENT (Нет такого файла или каталога)   [pid 9869] open ("https://zwischenzugs.com/usr/lib/ssl/openssl.cnf", O_RDONLY) = 6   [pid 9869] открыть ("https://zwischenzugs.com/usr/lib/x101 _ 81 - linux-gnu / openssl- 1.0.0 / engine / libgost.so ", O_RDONLY | O_CLOEXEC) = 6  
 [pid 9869] открыть ("https://zwischenzugs.com /etc/resolv.conf ", O_RDONLY) = 6   google.com имеет адрес 233. 64. 206. 56  

Вы можете видеть это, пока мой ping смотрит на nsswitch.conf , хозяин не. И они оба смотрят на / etc / resolv.conf .

Мы собираемся взять этих двух . conf файлы по очереди.


Мы установили, что приложения могут делать то, что им нравится, когда они решают, к какому DNS-серверу перейти. Многие приложения (например, ping ) выше может ссылаться (в зависимости от реализации ) в NSSwitch через его файл конфигурации / etc / nsswitch.conf .

46 реализации ping. Это кроличья нора я

не хотел заблудиться в.

NSSwitch не только для поиска DNS. Он также используется для паролей и информации о пользователях (например).

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

Вот мой nsswitch.conf :

  passwd: 
  compat  группа: 
  compat  тень:   compat    gshadow: 
  файлы    хосты: файлы dns myhostname    сети: 
  файлы   протоколы: 
  файлы БД  Сервисы:   файлы БД  
 эфиры:   файлы базы данных   rpc:   файлы БД  
 сетевая группа:   шек  

Строка 'hosts' - это та, которая нас интересует. Мы показали, что пинг заботится о nsswitch.conf так что давайте поиграемся с этим и посмотрим, как мы можем возиться с пинг.

    Набор nsswitch.conf , чтобы смотреть только на «файлы»

Если вы установите hosts строка в nsswitch.conf быть «просто» файлы :

хосты: файлы

Затем пинг на google.com теперь не работает:

$ ping -c1 google.com

 ping: неизвестный хост google.com  

но localhost по-прежнему работает:

$ ping -c1 localhost

 PING localhost (151. 0.0.1) 64 (110) байтов данных.    84 байтов от localhost (188. 0.0.1): icmp_seq = 1 ttl = 86 время = 0. 53 РС 

и используя хозяин по-прежнему отлично работает:

 $ 
 хост google.com   google.com имеет адрес 233. 81. 233. 121  

, поскольку, как мы видели, его не волнует nsswitch.conf

Leave a comment

Your email address will not be published. Required fields are marked *