avahi: ping не може вирішити ім'я хоста, але nslookup може


41

pingговорить мені, що він не може вирішити якесь ім'я хоста ("ping: невідомий хост 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що має сенс і.

Але тоді він розмовляє з avahi !?

Що призвело мене до цього форуму: 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 в Менеджері мереж. Відредагуйте /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,

Для мене більше сенсу налаштувати його правильно, а не вимикати його для локального.
keiki

@ otakun85: А як би я це зробив?
Аарон Дігулла

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

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

Здається, що локальна адреса не може отримати доступ до ubuntu.

рішення - редагувати /etc/nsswitch.confта змінювати цей рядок:

hosts:          files mdns4_minimal [NOTFOUND=return] dns

цим:

hosts:          files dns

Цей вид працював для мене. У моєму випадку рядок хостів "файли вирішили [! UNAVAIL = повернути] mdns4_minimal [NOTFOUND = return] dns" і змінив його на "файли mdns4_minimal [NOTFOUND = return] dns" працював. Дякуємо за вказівник у правильному напрямку.
Андорбаль

Спробував інші відповіді вище, вимкнено avahi (що є полегшенням), і все ж виникли проблеми. Ця відповідь вирішила це для мене. Спасибі
Адам Плочер

3

Якщо ви не здійснюєте обмін з'єднаннями з іншими пристроями або віртуальними машинами через комп'ютер, ви можете вимкнути dnsmasq в Менеджері мереж.

Відредагуйте /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і редагування файлу працював відмінно).

У будь-якому випадку, проява показувала:

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

І як результат, він намагався запитувати localhost (127.0.0.1) замість IP-сервера імен з файлу resv.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 /*.
Сілекс

0

Ще одна причина - формат /etc/hosts. Переконайтеся, що між IP-адресою та ім'ям хоста немає пробілів, замість цього використовуйте TAB. Після зміни на TAB ім'я хоста можна було вирішити за допомогою ping.

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

це може бути відповіддю, але це відформатовано як коментар ...
Франциско Тапія

-1

Установіть avahi-daemon на Ubuntu для, щоб ви могли дістатися до імені хоста ubuntu.localз ОС хоста

sudo apt-get install avahi-daemon avahi-otkri avahi-utils libnss-mdns mdns-scan


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