手持ちのRaspberryPiをサクッとmDNSに対応させる

# mDNSとは

mDNS(multicast DNS) は、ローカルセグメント内の端末を、 マルチキャストを利用して自動的に探索するための仕組みです。

mDNSは、Appleが策定した仕様で[RFC6762](https://tools.ietf.org/html/rfc6762)で定義されています。


Apple的には当初はRendezvous（ランデブー）と呼ばれていましたが、Mac OS X v10.4からBonjourという名前で呼ばれています。
iTunesやAirDropなどApple製品で幅広く使われています。

IETFでは、[Zero Configuration Networking](http://www.zeroconf.org/)として標準化されています。

DNSではユニキャストで名前解決を図りますが、
mDNSではマルチキャストアドレス 224.0.0.251 の UDP 5353 ポートに DNS クエリを投げることにより、
multicast groupにJOINしている端末が応答します。
mDNSのTLDは.localとなります。

# どういうときに使うと便利なの？

組み込み機器やRaspberryPiなどモニタレスのものは、DHCPなどで動的にIPが配布されるとIPを調べるのが大変です。
ですので、動的に名前解決する仕組みがあることで、一意に端末を指定することができ大変便利です。

# avahi-daemonの導入

mDNSに対応するためにavahi-daemonのインストールが必要です。avahiはアバヒと読むらしいです。

```terminal:command
% pi@raspberrypi:~ $ sudo apt-get install avahi-daemon
```

# ホスト名を設定する

```terminal:command
% sudo vi /etc/hostname
```

今回はraspberrypiにしました。

```terminal:/etc/hostname
raspberrypi
```

# avahiの設定

SSHサービスを登録します。

```terminal:command
% sudo vi /etc/avahi/services/ssh.service
```

```/etc/avahi/services/ssh.service
<?xml version="1.0" standalone='no'?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">

<service-group>
  <name replace-wildcards="yes">%h</name>

  <service>
    <type>_ssh._tcp</type>
    <port>22</port>
  </service>
</service-group>
```

# デーモンの再起動

```terminal:command
% sudo /etc/init.d/avahi-daemon restart
```

# 動作確認

mDNS multicast groupにJOINしていることが確認できます。

```terminal:command
% pi@raspberrypi:~ $ sudo /etc/init.d/avahi-daemon status

● avahi-daemon.service - Avahi mDNS/DNS-SD Stack
   Loaded: loaded (/lib/systemd/system/avahi-daemon.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2018-04-19 10:01:06 JST; 4min 16s ago
 Main PID: 345 (avahi-daemon)
   Status: "avahi-daemon 0.6.32 starting up."
   CGroup: /system.slice/avahi-daemon.service
           ├─345 avahi-daemon: running [raspberrypi.local]
           └─365 avahi-daemon: chroot helper

 4月 19 10:01:06 raspberrypi systemd[1]: Started Avahi mDNS/DNS-SD Stack.
 4月 19 10:01:06 raspberrypi avahi-daemon[345]: Network interface enumeration completed.
 4月 19 10:01:06 raspberrypi avahi-daemon[345]: Server startup complete. Host name is raspberrypi.local. Local service cookie is 4258905342.
 4月 19 10:01:06 raspberrypi avahi-daemon[345]: Service "raspberrypi" (/services/ssh.service) successfully established.
 4月 19 10:01:09 raspberrypi avahi-daemon[345]: Joining mDNS multicast group on interface wlan0.IPv6 with address fe80::741d:fe06:5e95:b3ab.
 4月 19 10:01:09 raspberrypi avahi-daemon[345]: New relevant interface wlan0.IPv6 for mDNS.
 4月 19 10:01:09 raspberrypi avahi-daemon[345]: Registering new address record for fe80::741d:fe06:5e95:b3ab on wlan0.*.
 4月 19 10:01:13 raspberrypi avahi-daemon[345]: Joining mDNS multicast group on interface wlan0.IPv4 with address 10.1.20.30.
 4月 19 10:01:13 raspberrypi avahi-daemon[345]: New relevant interface wlan0.IPv4 for mDNS.
 4月 19 10:01:13 raspberrypi avahi-daemon[345]: Registering new address record for 10.1.20.30 on wlan0.IPv4.
```

# PCから疎通確認

名前で疎通確認をしてみます。
※ ルーターがマルチキャストルータに対応していれば別ですが、サブネットは越せないので同一セグメントじゃないと探索できません

```terminal:mac_terminal
% ping raspberrypi.local

PING raspberrypi.local (10.1.20.30): 56 data bytes
64 bytes from 10.1.20.30: icmp_seq=0 ttl=64 time=227.991 ms
```

# SSHでアクセス

名前でアクセスできることを確認できました。

```terminal:mac_terminal
% ssh raspberrypi.local -l username

pi@raspberrypi.local's password:
Linux raspberrypi 4.14.30-v7+ #1102 SMP Mon Mar 26 16:45:49 BST 2018 armv7l

```