avahi: ping не может определить имя хоста, но nslookup может


41

pingговорит мне, что он не может разрешить какое-то имя хоста ("ping: unknown host domain.company.local") в URL, но когда я использую hostили nslookupна том же компьютере в командной строке, разрешение работает нормально (т.е. это быстро и надежно ).

Что может быть причиной этого?

Еще тестирование: у Firefox wgetи pingта же проблема. Пинг IP-адреса работает.

ОС: Linux (Ubuntu 13.04)

РЕДАКТИРОВАТЬ Мой /etc/resolv.confчитает:

nameserver 127.0.1.1
search domain.company.local

netstat доклады:

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.1.1:53            0.0.0.0:*               LISTEN      -               

поэтому что-то работает на этом порту ( nslookupтакже сообщает, что он использует в 127.0.1.1качестве DNS-сервера).

Нет /etc/*inetd.conf, поэтому я не уверен, какое приложение обслуживает этот порт.

Похоже, что dnsmasqиспользуется:

/usr/sbin/dnsmasq --no-resolv --keep-in-foreground --no-hosts --bind-interfaces
   --pid-file=/var/run/NetworkManager/dnsmasq.pid --listen-address=127.0.1.1
   --conf-file=/var/run/NetworkManager/dnsmasq.conf --cache-size=0 --proxy-dnssec
   --enable-dbus=org.freedesktop.NetworkManager.dnsmasq
   --conf-dir=/etc/NetworkManager/dnsmasq.d

Все файлы конфигурации и папки пусты. Так как nslookupговорит, что использует, 127.0.1.1#53я думаю, что dnsmasqработает даже без конфигурации. Но как узнать, какой родительский DNS запрашивать?

EDIT2 Отключение, dnsmasqкак было предложено harrymc, не помогло. Итак, я побежал, strace pingкоторый дал мне этот странный вывод (только интересные части):

open("/etc/host.conf", O_RDONLY|O_CLOEXEC) = 4
read(4, "127.0.0.1\tlocalhost\n#127.0.1.1\ta"..., 4096) = 613
...
open("/lib/libnss_mdns4_minimal.so.2", O_RDONLY|O_CLOEXEC) = 4
read(4, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\f\0\0\0\0\0\0"..., 832) = 832
...
mmap(NULL, 2105560, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 4, 0) = 0x7f7829b00000
...
socket(PF_FILE, SOCK_STREAM, 0)         = 4
fcntl(4, F_GETFD)                       = 0
fcntl(4, F_SETFD, FD_CLOEXEC)           = 0
connect(4, {sa_family=AF_FILE, path="/var/run/avahi-daemon/socket"}, 110) = 0
fcntl(4, F_GETFL)                       = 0x2 (flags O_RDWR)
fstat(4, {st_mode=S_IFSOCK|0777, st_size=0, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f782a4f8000
lseek(4, 0, SEEK_CUR)                   = -1 ESPIPE (Illegal seek)
write(4, "RESOLVE-HOSTNAME-IPV4 domain.com"..., 44) = 44
read(4, "-15 Timeout reached\n", 4096)  = 20

Так pingвыглядит в /etc/hostsчем смысл. Затем он загружает и mmap()s , /lib/libnss_mdns4_minimal.so.2который имеет смысл , а также.

Но тогда это говорит с авахи !?

Который привел меня к этому сообщению на форуме: ping не делает запрос DNS .

Мой /etc/nsswitch.confтакже содержит эту строку:

hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4

Если у меня pingрабочий адрес, я вижу, что процесс также загружается, /lib/libnss_mdns4_minimal.so.2но затем он выполняет DNS-запрос через порт 53.

Таким образом, я предполагаю, что теперь /lib/libnss_mdns4_minimal.so.2как-то замечает, что IP-адрес заканчивается, .localа не с, .comи затем [NOTFOUND=return]срабатывает.

Как я могу это исправить?


Что у тебя /etc/resolv.conf?
Джозеф Р.

Что правильно, а что нет? Должно ли разрешаться имя хоста или нет? Вы не сказали нам, какая из двух совершенно разных проблем у вас есть. (И если это должно разрешиться, объясните как можно более подробно, как и почему оно должно разрешиться, поскольку это, вероятно, приведет к объяснению того, почему это не так.)
Дэвид Шварц

... а также настройки HTTP-прокси для Chrome, Firefox и wget.
JdeBP

@DavidSchwartz: я ожидаю, что разрешение будет работать. То, что я не понимаю, как nslookupили как hostможно разрешить имя и все остальное в системе, не может.
Аарон Дигулла

1
Если вы не делите соединение с другими устройствами или виртуальными машинами через ваш компьютер, вы можете отключить dnsmasq в Network Manager. Отредактируйте /etc/NetworkManager/NetworkManager.confи прокомментируйте dns=dnsmasqстроку (поставьте перед ней #), затем выполните a sudo restart network-manager. Это отключит локальный распознаватель. ( источник )
harrymc

Ответы:


33

Как подробно описано в этом блоге , вам нужно отредактировать /etc/avahi/avahi-daemon.conf:

[server]
domain-name=.alocal

Это привязывает демон к домену .alocalвместо значения по умолчанию .local.

и перезапустите демон с помощью:

sudo service avahi-daemon restart

Примечание от поста в блоге:

Вам может потребоваться очистить кэш DNS, mDNS и распознавателя, а также перезапустить веб-браузеры, чтобы очистить их внутренний кэш.

После этого pingи nslookupначали договариваться.

Спасибо harrymc за то, что я выбрал правильный путь.


1
Также обратите внимание, pingбудет использовать NSS, nslookupнет. (он использует lwres и, ну, в общем, связывается, чтобы напрямую общаться с распознавателем)
Ricky Beam

Для меня имеет смысл настроить его правильно, а не отключать для локального.
Кейки

@ otakun85: И как бы я это сделал?
Аарон Дигулла

@AaronDigulla Вы настроили его, и текущий ответ с наибольшим количеством голосов отключил его для локального.
Кейки

2
Это потрясающе. Спасибо. Бороться с этим часами, прежде чем найти этот пост.
fpghost


8

Легко сделать: Изменить /etc/default/avahi-daemon

Измените строку:

AVAHI_DAEMON_DETECT_LOCAL=1

в

AVAHI_DAEMON_DETECT_LOCAL=0

Перезапустите avahi-daemonили убейте его.

Я не люблю Avahi, и я не использую какие-либо его функции. Если вы хотите действительно отключить avahi, измените /etc/init/avahi-daemon.conf, как показано ниже:

start on (never 
          and filesystem
      and started dbus)
stop on stopping dbus

2
Мне все равно, если вы не должны помещать здесь «спасибо» комментарии, я просто хотел выразить свою благодарность и сколько времени и энергии вы спасли меня. Спасибо большое! Я использую корпоративную VPN для выполнения срочной работы в торговом центре и не могу заставить работать некоторые из наших сайтов, несмотря на все попытки. Я не смог бы понять это самостоятельно, это точно ...
eresonance

7

кажется, .local адрес не может быть доступ в Ubuntu.

решение состоит в том, чтобы отредактировать /etc/nsswitch.confи изменить эту строку:

hosts:          files mdns4_minimal [NOTFOUND=return] dns

этим :

hosts:          files dns

Такого рода работа для меня. В моем случае в строке hosts было указано, что «файлы разрешают [! UNAVAIL = return] mdns4_minimal [NOTFOUND = return] dns» и меняют его на «files mdns4_minimal [NOTFOUND = return] dns». Спасибо за указатель в правильном направлении.
Андорбаль

Пробовал другие ответы выше, отключил авахи (что облегчение) и все еще имел проблему. Этот ответ решил это для меня. Спасибо
Адам Плохер

3

Если вы не делите соединение с другими устройствами или виртуальными машинами через ваш компьютер, вы можете отключить dnsmasq в Network Manager.

Отредактируйте /etc/NetworkManager/NetworkManager.confи прокомментируйте строку (поставьте перед ней #):

dns=dnsmasq

Затем сделайте:

sudo restart network-manager

Это отключит локальный распознаватель.

Источник: DNS в Ubuntu 12.04 .


2

Итак, теперь я предполагаю, что /lib/libnss_mdns4_minimal.so.2 как-то замечает, что IP-адрес заканчивается на .local, а не на .com, и затем запускается [NOTFOUND = return].

Как я могу это исправить?

Довольно хорошее предположение, но другие ответы излишни. Простое решение состоит в том, чтобы удалить бит, который действительно сработал, то есть удалить просто [NOTFOUND=return] .

Удаление означает, что если mdns4_minimalвозвращается NOTFOUND, используется следующая запись в списке распознавателя. Это нормальное поведение; [NOTFOUND=return]Оптимизация для быстрого сбоя при неизвестных именах, но предполагает, что все .localимена находятся в mDNS.


1

У меня был интересный случай с такими же симптомами (пинг, монтирование и т. Д. Не работает, но хост, копать работает). Проверьте права доступа к файлу /etc/resolv.conf . В моем случае кто-то изменил его, и у меня не было прав на его чтение (хотя cat /etc/resolv.confи редактирование файла работало нормально).

Во всяком случае, strace показывал:

open("/etc/resolv.conf", O_RDONLY|O_CLOEXEC) = -1 EACCES (Permission denied)

И в результате он пытался запросить localhost (127.0.0.1) вместо IP-адреса сервера имен из файла resolv.conf:

socket(PF_INET, SOCK_DGRAM|SOCK_NONBLOCK, IPPROTO_IP) = 4
connect(4, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("127.0.0.1")}, 16) = 0
poll([{fd=4, events=POLLOUT}], 1, 0)    = 1 ([{fd=4, revents=POLLOUT}])

И tcpdump не показывал трафик DNS при пинге. Все работает после разрешения разрешения:

# chmod 644 /etc/resolv.conf
# ls -l /etc/resolv.conf
-rw-r--r-- 1 root root 111 Oct  3 09:54 /etc/resolv.conf

Другая проблема может быть расширенными атрибутами файла или любой другой проблемой доступа. В этом случае просто удалите файл /etc/resolv.conf и создайте его заново.


Еще одна проблема, с которой у меня был один сервер, заключалась в том, что все корневые папки потеряли свой xфлаг, и поэтому многие двоичные файлы не работали должным образом. Исправление было chmod +x /*.
Silex

0

Другой причиной является формат /etc/hosts. Убедитесь, что между IP и именем хоста нет пробелов, вместо этого используйте TAB. После изменения на TAB имя хоста может быть разрешено с помощью ping.

127.0.0.1        test.local
         ^^^^^^^^ → Should be a TAB not multiple spaces.

это может быть ответ, но он отформатирован как комментарий ...
Francisco Tapia

-1

Настройте avahi-daemon в Ubuntu, чтобы вы могли получить доступ к имени хоста ubuntu.localиз операционной системы хоста

sudo apt-get установить avahi-демон avahi-обнаружить avahi-utils libnss-mdns mdns-scan


Извините, этот ответ не имеет отношения к вопросу. Мы не спрашиваем, как установить Avahi. Вопрос в том, как Avahi может прервать поиск DNS после его установки.
Аарон Дигулла
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.