avahi-daemonがうまく動かない

なんかうまく動かないんですよね。

おうちのネット環境は TimeCapsule をルータに iMac, MacBookAirMac Express x2 と、すっかりマカーになってしまいました。AirMac Express の先にいる AtomDebian sid も、やっぱ smb より afp だよね、ってことで。

どう動かないかというと、でびあんマシンの count.local で

ichii386@count% sudo avahi-daemon --debug
Found user 'avahi' (UID 110) and group 'avahi' (GID 117).
Successfully dropped root privileges.
chroot.c: chroot() helper started
avahi-daemon 0.6.23 starting up.
Successfully called chroot().
Successfully dropped remaining capabilities.
chroot.c: chroot() helper got command 02
Loading service file /services/afpd.service.
(snip)

と avahi-daemon を動かした状態で、たとえば count (自分自身、 debian) と elmo (iMac) に ping を打つと

ichii386@count% ping -c1 count.local
PING count.local (192.168.1.3) 56(84) bytes of data.
64 bytes from count.local (192.168.1.3): icmp_seq=1 ttl=64 time=0.047 ms

--- count.local ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.047/0.047/0.047/0.000 ms

ichii386@count% ping -c1 elmo.local
ping: unknown host elmo.local

てなかんじ。avahi-daemonの出力は

simple-protocol.c: Got RESOLVE-HOSTNAME-IPV4 request for 'count.local'.
simple-protocol.c: Got RESOLVE-ADDRESS request for '192.168.1.3'.
simple-protocol.c: Got RESOLVE-HOSTNAME-IPV4 request for 'elmo.local'.

だけでした。

ナゾ

で、すっごいナゾで「うまく動かない」なんて微妙な言い方をした理由が、tcpdumpするととたんに動き出すんです。

ichii386@count% sudo tcpdump -v 'not (src port 22 or dst port 22)'
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
10:26:42.624870 IP6 (hlim 255, next-header UDP (17) payload length: 36) fe80::21c:c0ff:fe8e:13b5.mdns > ff02::fb.mdns: [udp sum ok] 0 A (QM)? elmo.local. (28)
10:26:42.635510 IP (tos 0x0, ttl 255, id 0, offset 0, flags [DF], proto UDP (17), length 56) count.local.mdns > 224.0.0.251.mdns: 0 A (QM)? elmo.local. (28)

avahiは

simple-protocol.c: Got RESOLVE-HOSTNAME-IPV4 request for 'elmo.local'.
simple-protocol.c: Got RESOLVE-ADDRESS request for '192.168.1.11'.

と期待してる出力をするし、もちろん ping もうまく通りました。


ネットワーク詳しいかた、「あーこれね」って感じだったりしませんか??

どうでもいい話

むかし google code search ができた頃に id:moriyoshi がなんか書いてた気がしますが、 simple-protocol.c から一部引用。

    if (strcmp(cmd, "HELP") == 0) {
        client_output_printf(c,
                             "+ Available commands are:\n"
                             "+      RESOLVE-HOSTNAME <hostname>\n"
                             "+      RESOLVE-HOSTNAME-IPV6 <hostname>\n"
                             "+      RESOLVE-HOSTNAME-IPV4 <hostname>\n"
                             "+      RESOLVE-ADDRESS <address>\n"
                             "+      BROWSE-DNS-SERVERS\n"
                             "+      BROWSE-DNS-SERVERS-IPV4\n"
                             "+      BROWSE-DNS-SERVERS-IPV6\n");
        c->state = CLIENT_DEAD; }
    else if (strcmp(cmd, "FUCK") == 0 && n_args == 1) {
        client_output_printf(c, "+ FUCK: Go fuck yourself!\n");
        c->state = CLIENT_DEAD;
    } else if (strcmp(cmd, "RESOLVE-HOSTNAME-IPV4") == 0 && n_args == 2) {

んーと、うーん。