vol37. mDNSとは

Linux 上で、avahi を使って、名前解決をする仕組みを知りたかったので調べてみた。 UDPの上位レイヤーで動作するmDNSというプロトコルを使用している。

mDNS とは何か

  • multicast DNSの略
  • 通常のDNSは、DNS server に問い合わせ名前解決を行う。
  • mDNSは、マルチキャスト転送で、ネットワーク内のデバイスに問い合わせる事により、
    名前解決を行う
    • DNSサーバーがいらない。
  • RFC6762で規定

名前解決の流れ

  • client は、mDNS query メッセージをマルチキャストで投げる
  • 対応する機器はmDNS response メッセージをマルチキャストで応答
  • mDNSは、マルチキャストアドレス 224.0.0.251、UDP 5353ポートを使用
  • IPv4, IPv6のIP address の問い合わせは、query のType field で指定
    • Type field: 0x01 (ipv4)
    • Type field: 0x1c (ipv6)

      mDNS query メッセージ

      f:id:john-rama01:20180614071616p:plain

      mDNS answer メッセージ

      f:id:john-rama01:20180614072209p:plain

zeroconf との関係

  • 名前解決は、zeroconf 3つの技術のうちの1要素
    1. ip address の割り当て
    2. 名前解決
    3. device の位置の特定
  • avahi はzeroconf を実現するためのLinux上での実装。applebonjourという実装。

nsswitchとは

  • Linux における名前解決の為のclient system(avahi はmDNSの為の、server systemの
    位置づけ)
  • local file, mdns, dns 等複数ある名前解決手法のうち、どの手法を用いて、どの順序
    で名前解決をするかを決める。
  • 設定ファイル

      /etc/nsswitch.conf  
      hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns  
    

    優先順位は、files(/etc/hosts), mdn4_minimal, dns, mdns の順序。
    miinimal はホスト名に.localが含まれていないと名前解決を行わない
    mdns4 はIPv4のみ
    mdnsはIPv4, IPv6双方で名前解決を行う。

  • ping hogehote.local とうつと、上記の設定では、まず/etc/hostsの中身を確認し、次に
    mdns ipv4 プロトコルで、名前解決を試みる。失敗したら、dns server に問い合わせを行い、  最後に、mdns (v4, v6) で解決を試みるというながれ。