avahi: ping не может определить имя хоста, но nslookup может
ping
говорит мне, что он не может разрешить имя хоста ("ping: unknown host domain.company.local") в URL, но когда я использую host
или же nslookup
на том же компьютере в командной строке разрешение работает нормально (то есть быстро и надежно).
Что может быть причиной этого?
Больше тестирования: Firefox, wget
а также ping
есть такая же проблема. Пинг IP-адреса работает.
ОС: Linux (Ubuntu 13.04)
РЕДАКТИРОВАТЬ My /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
как предположил Гаррим, это не помогло. Итак, я побежал 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]
срабатывает.
Как это исправить?
9 ответов
Как подробно описано в этом блоге, вам необходимо отредактировать /etc/avahi/avahi-daemon.conf
:
[server]
domain-name=.alocal
Это связывает демона с доменом .alocal
вместо по умолчанию .local
,
и перезапустите демон с помощью:
sudo service avahi-daemon restart
Примечание от поста в блоге:
Вам может потребоваться очистить кэш DNS,mDNS и распознавателя, а также перезапустить веб-браузеры, чтобы очистить их внутренний кэш.
После этого, ping
а также nslookup
начал соглашаться.
Изменить /etc/nsswitch.conf и заменить:
hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4
от:
hosts: files dns
работал на меня.
Легко сделать: Изменить /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
Кажется ,.local адрес не может быть доступ в Ubuntu.
решение - отредактировать /etc/nsswitch.conf
и измените эту строку:
hosts: files mdns4_minimal [NOTFOUND=return] dns
этим:
hosts: files dns
Если вы не делите соединение с другими устройствами или виртуальными машинами через ваш компьютер, вы можете отключить dnsmasq в Network Manager.
редактировать /etc/NetworkManager/NetworkManager.conf
и прокомментируйте строку (поставьте перед ней #):
dns=dnsmasq
Затем сделайте:
sudo restart network-manager
Это отключит локальный распознаватель.
Источник: DNS в Ubuntu 12.04.
У меня был интересный случай с такими же симптомами (пинг, монтирование и т. Д. Не работает, но хост, копать работает). Проверьте права доступа к файлу /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 и создайте его заново.
Итак, теперь я предполагаю, что /lib/libnss_mdns4_minimal.so.2 каким-то образом замечает, что IP-адрес заканчивается на.local, а не на.com, и затем запускается [NOTFOUND=return].
Как это исправить?
Довольно хорошее предположение, но другие ответы излишни. Простое решение состоит в том, чтобы удалить бит, который действительно сработал, то есть просто удалить[NOTFOUND=return]
,
Удаление означает, что если mdns4_minimal
возвращается NOTFOUND
используется следующая запись в списке распознавателей. Это нормальное поведение; [NOTFOUND=return]
оптимизация для быстрого сбоя на неизвестных именах, но она предполагает все .local
имена в mDNS.
Другой причиной является формат /etc/hosts
, Убедитесь, что между IP и именем хоста нет пробелов, вместо этого используйте TAB. После изменения на TAB имя хоста может быть разрешено с помощью ping.
127.0.0.1 test.local
^^^^^^^^ → Should be a TAB not multiple spaces.
Настройте avahi-daemon в Ubuntu для получения доступа к имени хоста ubuntu.local
с хоста ОС
sudo apt-get установить avahi-демон avahi-обнаружить avahi-utils libnss-mdns mdns-scan