[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: bind9





6 апреля 2010 г. 2:08 пользователь Anton Kovalenko <anton@sw4me.com> написал:
On Mon, Apr 05 2010, Pavel Gaidai wrote:

>     > Подскажите, можно ли сделать так, средствами bind9, что бы
>     > localhost пинговался без строки domain в resolv.conf?
>
>     Ещё раз: man resolv.conf на предмет ndots (или мои сообщения не
>     доходят?  ау, рассылка?)
>
> Спасибо за нифу. Доходят.
>
> Как я понял, без ndots в resolv.conf, только средствами bind9, такое
> сделать нельзя, правильно?

Давайте я ещё раз изложу, что на что влияет, а вы уж решите, правильно
или нет (уж очень ваша формулировка странная).

Когда обычное приложение (например, /bin/ping) хочет узнать адрес машины
по её имени, оно вызывает функцию getaddrinfo или подобную
(например, gethostbyname). Этот вызов «градуирует себя вдоль спина и
там, внутре, превращается в» последовательные вызовы
библиотек-«плагинов» /lib/libnss_*.so.* Какие именно библиотеки libnss_*
будут использованы, зависит от содержимого файла /etc/nsswitch.conf.

В неизвращённом линуксе общего назначения в качестве одного из
перечисленных плагинов для поиска хостов указан `files' (libnss_files),
который ищет хост в /etc/hosts, а одним из плагинов дальше в списке
указан `dns', который формирует серию запросов к DNS и возвращает
в качестве адреса то, что получено в первом хорошем ответе.

libnss_dns использует для запросов к DNS библиотеку libresolv, которая и
настраивается файлом /etc/resolv.conf. Она не является частью _пакета_
bind9; в debian она устанавливается вместе с glibc (пакет libc6).

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

В первую очередь libresolv пытается решить, может ли запрошенное имя
быть абсолютным (fully qualified domain name). Всем было бы обидно, если
бы запрос на разрешение имени debian.org превращался бы в DNS-запрос к
debian.org.some.localdomain; в то же время никому не обидно, что запрос
на разрешение имени moya-kofevarka не отправляется к корневым
DNS-серверам, чтобы они поискали среди имён верхнего уровня A-запись для
"moya-kofevarka.". Учитывая эти два факта, разработчики libresolv,
во-первых, решили использовать количество точек в имени хоста для
определения того, может ли оно быть абсолютным; во-вторых, установили
пороговое значение ndots:1 по умолчанию (тут за подробностями в man
resolv.conf).

Таким образом, для имён вроде "moya-kofevarka" или "localhost" libresolv
по умолчанию считает, что они не являются абсолютными, а должны быть
дополнены каким-либо именем домена, чтобы отправить DNS-запрос о
результирующих именах.

Если в /etc/resolv.conf используется опция search, её аргумент задаёт
список доменов-кандидатов, которые по очереди приписываются к имени
хоста (через точку), и для полученных имён делаются DNS-запросы.
Результат первого успешного запроса возвращается приложению.

Если опция search отсутствует, список доменов-кандидатов считается
состоящим из одного домена, указанного в опции domain - в том же файле
resolv.conf.

Если отсутствует и опция domain, libresolv пытается _вычислить_
«локальный домен хоста, на котором выполняется приложение» и
использовать его, как если бы он был указан в опции domain.  Для этого
сначала системным вызовом gethostname() вытаскивается имя машины, затем
оно преобразуется в IP-адрес стандартным способом (getaddrinfo или
gethostbyname), затем по этому IP-адресу... снова запрашивается имя
(getnameinfo/gethostbyaddr). Полученное имя считается _полным_ именем
хоста, а его часть после первой точки - именем локального домена. Важно,
что оба описанных здесь запроса выполняются не через DNS, по крайней
мере непосредственно, а через список NSS-библиотек; на нормально
настроенном линуксе (например, поставленный с помощью инсталлятора
debian) эти операции могут быть выполнены без использования DNS через
libnss_files.

Предыдущий абзац отвечает, в числе прочих, на такие вопросы, как «зачем
инсталлятор прописал строчку с 127.0.1.1 в /etc/hosts», «откуда
некоторые приложения берут полное имя хоста», «я заполнил /etc/hosts с
нуля руками и теперь всё тормозит», «как сделать, чтобы приложения
правильно определяли полное имя хоста, а то сейчас там ерунда какая-то».

Стадии определения локального домена можно проверить с помощью
утилит. /bin/hostname (без параметров) покажет результат gethostname(),
/bin/hostname --fqdn покажет полное имя хоста после прямого и обратного
разрешения `hostname`, а /bin/dnsdomainname покажет часть полного имени
хоста после первой точки, т.е. имя локального домена с точки зрения
libresolv (в том случае, когда не указана опция domain).

Теперь, вооружившись этой информацией, постарайтесь решить, что же вам
нужно от всего комплекса libc-libnss*-libresolv и bind.
Можете раскомментировать запись localhost в /etc/hosts и вернуться к
тому, с чего начали; можете завести в DNS запись localhost.`dnsdomainname`,
чтобы запрос на имя "localhost" успешно разрешался при его дополнении
локальным доменом; можете поставить options ndots:0, чтобы запрос к
localhost считался абсолютным. Ну и ещё, наверное, много чего можете,
но вам решать, что именно.
 
Огромное спасибо. Вопросов больше нет.

 

--
Regards, Anton Kovalenko
+7(916)345-34-02 | Elektrostal' MO, Russia


Reply to: