6 апреля 2010 г. 2:08 пользователь Anton Kovalenko <an...@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
>

Ответить