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
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とかもある