web-dev-qa-db-ja.com

avahi:pingはホスト名を解決できませんが、nslookupは解決できます

pingはURLの中のいくつかのホスト名( "ping:unknown Host domain.company.local")を解決できないと言っていますが、コマンドラインで同じコンピュータ上でHostまたはnslookupを使用すると解決はうまくいきます速くて信頼性が高い。

これは何の原因と考えられますか?

さらなるテスト:Firefox、wget、およびpingは同じ問題を抱えています。 IPアドレスのpingは機能します。

OS:Linux(Ubuntu 13.04)

EDIT私の/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はDNSサーバーとして127.0.1.1を使用していることも報告します)。

/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

すべての設定ファイルとフォルダは空です。 nslookup127.0.1.1#53を使っていると言っているので、dnsmasqは設定がなくてもうまくいくと思います。しかし、どの親DNSに問い合わせるのか、どうやって知るのでしょうか。

EDIT2harrymcの推奨に従って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も意味があります。

しかし、それからそれはavahiと話します!

これは私をこのフォーラム投稿に導いた: pingはDNS要求をしない

私の/etc/nsswitch.confにもこの行が含まれています:

hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4

私が作業用アドレスをpingにした場合、プロセスは/lib/libnss_mdns4_minimal.so.2もロードしますが、それから、ポート53経由でDNSクエリを実行します。

/lib/libnss_mdns4_minimal.so.2は、IPアドレスが.localではなく.comで終わり、その後[NOTFOUND=return]がトリガーされることに気付いていると思います。

これをどのように修正しますか?

40
Aaron Digulla

このブログ記事 で詳細に説明されているように、/etc/avahi/avahi-daemon.confを編集する必要があります。

[server]
domain-name=.alocal

これにより、デーモンはデフォルトの.alocalではなくドメイン.localにバインドされます。

そしてデーモンを再起動します。

Sudo service avahi-daemon restart

ブログ投稿からのメモ:

あなたはそれらの内部キャッシュをクリアするためにあなたのウェブブラウザを再起動するのと同様にDNS、mDNSとリゾルバキャッシュをフラッシュする必要があるかもしれません。

その後、pingnslookupは一致し始めました。

harrymc に感謝します。

33
Aaron Digulla

/etc/nsswitch.confを修正して、次のように置き換えます。

hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4

によって:

hosts:          files dns

私のために働いた。

11
doep

やさしいこと:/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
8
MikeDawg

ローカルアドレスはubuntuではアクセスできないようです。

解決策は/etc/nsswitch.confを編集して次の行を変更することです。

hosts:          files mdns4_minimal [NOTFOUND=return] dns

これで :

hosts:          files dns
7
Dragouf

コンピュータを介して他のデバイスや仮想マシンと接続を共有していない場合は、Network Managerでdnsmasqを無効にすることができます。

/etc/NetworkManager/NetworkManager.confを編集して、その行にコメントを付けます(その前に#を入れます)。

dns=dnsmasq

それから:

Sudo restart network-manager

それはローカルリゾルバをオフにします。

出典: Ubuntu 12.04のDNS

3
harrymc

私は同じ症状(ping、mountなどは動作していないが、Host、Digは動作している)で興味深いケースを経験しました。 / etc/resolv.confファイルの権限を確認してください。私の場合、誰かがそれを変更しました、そして私はそれを読む権限を持っていませんでした(cat /etc/resolv.confとファイルの編集はうまくいきました)。

とにかく、straceは示していました:

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

そしてその結果、resolv.confファイルからIPアドレスの代わりにlocalhost(127.0.0.1)を問い合わせようとしていました。

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}])

Pingを実行しても、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
Pik Master

そのため、/ lib/libnss_mdns4_minimal.so.2は、IPアドレスが.localで終わり、.comで終わっていないことに気付いた後、[NOTFOUND = return]がトリガーされたと考えられます。

これをどのように修正しますか?

かなりいいと思いますが、他の答えはやり過ぎです。単純な解決策は、実際にトリガーされたビットを削除することです。つまり、removejust[NOTFOUND=return]を削除します。

これを削除すると、mdns4_minimalNOTFOUNDを返す場合、リゾルバリストの次のエントリが使用されます。これは通常の動作です。 [NOTFOUND=return]は未知の名前をより早く失敗させるための最適化ですが、すべての.local名がmDNSにあると仮定します。

1
MSalters

もう一つの理由は/etc/hostsのフォーマットです。 IPとホスト名の間にスペースがないことを確認してください。代わりにTABを使用してください。 TABに変更した後、ホスト名はpingによって解決できます。

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