39

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] .

Как это исправить?

8 ответов8

32

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

[server]
domain-name=.alocal

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

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

sudo service avahi-daemon restart

Примечание из сообщения в блоге:

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

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

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

11

Изменить /etc/nsswitch.conf и заменить:

hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4

от:

hosts:          files dns

работал на меня.

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
7

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

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

hosts:          files mdns4_minimal [NOTFOUND=return] dns

этим :

hosts:          files dns
3

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

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

dns=dnsmasq

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

sudo restart network-manager

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

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

1

У меня был интересный случай с такими же симптомами (ping, mount и т.д. Не работают, но host, dig работают). Проверьте разрешения для файла /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 и создайте его заново.

1

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

Как это исправить?

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

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

0

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .