Raspberry Pi(Raspbian)にmDNSを設定する

Raspberry Piにディスプレイもキーボードも繋がずに部屋の隅っこに転がしておいてリモートからアクセスするには、IPアドレスを知らないといけないわけだけど、せっかくのポータブルなRasPiに固定IPアドレスを設定するのも微妙な感じがするので、mDNSを活用してみることにした。
Appleが好きなアレ。コンピュータ名.localでアクセスできるやつ。


とりあえず、今回はRaspberry PiをなんとかしたかったのでRaspbianの内容だけど、CentOSでもUbuntuでもArch Linuxでもパッケージ名が違ったりするぐらいでだいたい同じ。

説明とかどうでもいい人向け

# ホスト名をきちんと設定する
sudo -e /etc/hostname

# avahi-daemonとnss-mdnsをインストール
sudo apt-get install avahi-daemon libnss-mdns

# avahiにsshサービス追加
sudo -e /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>
    ----------------

# 再起動
sudo reboot

ホスト名の設定

アクセスするためのドメインが"ホスト名.local"になるので、なにはともあれホスト名を設定する。

sudo -e /etc/hostname
paseraspi

avahi-daemonとnss-mdnsのインストール

sudo apt-get install avahi-daemon libnss-mdns


ちなみにavahiがmDNS/DNS-SDの実装で主にresponderとして使う感じ*1で、nss-mdnsの方はNSSのhostsでmDNSによる名前解決をサポートするためのプラグイン
ざっくり言うとavahi-daemonがこのマシンをmDNSで発見してもらうためのサーバで、nss-mdnsが別のマシンをmDNSで見つけるためのクライアントみたいな感じ。
なので、今回の用途だとavahi-daemonだけあればよくて、RasPiからどっかへ.localでアクセスする気がないならlibnss-mdnsはなくてもいいかも。

avahiの設定

/etc/avahi/servicesに応答させたいサービスの設定ファイルを作る。
例えばsshならこんな感じ。中身についてはman avahi.serviceで。

sudo -e /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>

で、avahi-daemon再起動。

sudo /etc/init.d/avahi-daemon restart

あとiptablesとかでファイアウォールを設定している場合は、224.0.0.251:5353宛のUDPを通す必要がある。


これで"ホスト名.local"でRaspberry Piにアクセスできるようになったはず。

nss-mdnsの設定

/etc/nsswitch.confのhosts項目を書き換えるんだけど、インストールした時点で自動的に書き換えられてるはず。

sudo -e /etc/nsswitch.conf
hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4

再起動とかは特にない。

avahi-browse

avahi-utilsに入ってるavahi-browseを使うとネットワーク内の利用可能なサービスを一覧表示できる。

sudo apt-get install avahi-utils
avahi-browse -ar

*1:avahi-browseとかもある