Closed17

macOSでない他のホストを.localで解決することはできるのか

astkastk

Raspberry Pi を買ったもののホスト名解決の管理をどうしようか迷い、そういえばmacOSには .local ドメイン解決の仕組みがあったのでその仕組みに乗っかれないかなと思った次第です。

astkastk

普段デスクトップ1台で生活しており、かつRaspberry Piの存在は普段忘れる、ので以下の面倒ごとがある。

  • DNSを立てる → 普段別のホストに入ることないし面倒
  • アドレスを.ssh/configに登録する →過去のエントリが残り続けるのはなんかな
    • どうせ鍵を登録するのでエントリは書く必要があるけれどIPがここに残るのはなんかな
      • あとあとこのIP今も使われてるんだっけとなる

両者とも

  • アドレスを固定する必要がある
    • 現在使用中のTime Cupsuleの再起動が必要でちょっと精神的面倒さのハードルが上がる

という面倒ごともある。なのでネットワークへの参加をトリガーに名前解決可能になってくれると楽なんじゃないかという気持ち。

astkastk

結論をまとめると現在の Raspberry Pi OS には初めから avahi-daemon がインストールされており enable にもなっているので、セットアップでホスト名を決めた後であれば macOS からであれば .local で名前解決ができると思われる。名前解決が行えているかの確認をCLIから行うには以下のコマンドを使う。

dscacheutil -q host -a name HOSTNAME.local

次のRaspberry Piをセットアップする時に確認したい。

astkastk

まずそもそも .local ドメインの解決ってどうやっているのか調べてみる。

https://discussions.apple.com/thread/7707202

As Bonjour's Multicast Domain Name Service (mDNS) uses the ".local" suffix to identify Bonjour-accessible devices, are these two daemons running on your system:

Bonjour's Multicast Domain Name Service (mDNS) というもので解決されているらしい。

astkastk

Multicast Domain Name Service (mDNS) って Bonjour に限らず一般的な技術なのかと気になり、こちらも調べてみる。

https://qiita.com/maccadoo/items/48ace84f8aca030a12f1

ローカルネットワーク内のホスト名でのアクセスはNetBIOS時代から試みてきたものの(後略)

一般的な技術っぽい雰囲気を感じる。

astkastk

Wikipedia をみてみる。

https://en.wikipedia.org/wiki/Multicast_DNS

The mDNS protocol is published as RFC 6762, uses IP multicast User Datagram Protocol (UDP) packets, and is implemented by the Apple Bonjour and open source Avahi software packages, included in most Linux distributions. mDNS has also been implemented in Windows 10, initially limited to discovering networked printers,[2] later becoming capable of resolving hostnames as well.

win 10 が存在する現在ではwin/mac/linuxで実装されていてRFC 6762で定義されていると言うことは恐らく相互で仕組みに乗っかれるんだろうと感じる。

で、LinuxでmDNSの仕組みに乗っかるにはAvahiを使えば良さそう。

astkastk

mDNSで使っているUDP Multicastってどう言う仕組みだったか。ブロードキャストとはまた別に複数対象に限定して通信する仕組みだったと思うけれど、その対象はどうやって選んでるんだろう。

astkastk

AvahiをRaspberry OSにインストールしてみる。

astkastk

あ、いや avahi-daemon は初めから入っていた。いいね Raspberry OS (Debian がそうなのかも)。
普通に macから HOSTNAME.local で ssh できた。

まぁ dig はできないんですけどね。それについてもこちらに書かれている。

https://qiita.com/maccadoo/items/48ace84f8aca030a12f1

astkastk

ついでに .ssh/config で .local を省略できるようにしてみる。

astkastk

ホスト名は pi2a のようにハードウェアバージョンと abc… という命名にしている。

これで pi2api2a.local の両方で ssh できるようにしたい。

http://blog.djm.net.au/2014/01/hostname-canonicalisation-in-openssh.html

を参考にしてCanonicalize(正規化)の設定をする。今回は pi* 始まりのホストに限定した。

Host pi*
        CanonicalizeHostname    yes
        CanonicalDomains        local
        CanonicalizeMaxDots     0
        CanonicalizeFallbackLocal       no

すると ssh のログに以下のように出て無事 .local が付け足される。

asa-taka@tailmoon .ssh % ssh pi2a -v
OpenSSH_8.1p1, LibreSSL 2.7.3
:
debug1: Canonicalized hostname "pi2a" => "pi2a.local"

おそらく付け足す前に一度試行しているのでその分の無駄はあるが気にしないことにする。

astkastk

ホスト名を変える方法がわからない@Raspberry Pi OS

hostname pi2a だと再起動時に元に戻る。

astkastk

hostname は何をしているのか。

   SET NAME
       When  called  with  one argument or with the --file option, the commands
       set the host name or the NIS/YP domain name.  hostname uses the sethost‐
       name(2)  function,  while  all of the three domainname, ypdomainname and
       nisdomainname use setdomainname(2).  Note, that this is  effective  only
       until the next reboot.  Edit /etc/hostname for permanent change.

       Note, that only the super-user can change the names.

       It  is not possible to set the FQDN or the DNS domain name with the dns‐
       domainname command (see THE FQDN below).

       The host name is usually set once at system startup in /etc/init.d/host‐
       name.sh  (normally  by reading the contents of a file which contains the
       host name, e.g.  /etc/hostname).

Note, that this is effective only until the next reboot. Edit /etc/hostname for permanent change.

なるほど。reboot までの設定という。

このスクラップは2021/05/05にクローズされました