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