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 >