DNS-SD(DNS Service Discovery) 跟 mDNS (multicast DNS) 是不同的 protocol,但可以互相相容。DNS-SD 能透過標準的 DNS 技術,尋找區域網路中,提供某些服務的協定。而 mDNS 是能夠在區域網路中,在不需要 DNS Server 的情況下,就能透過機器名稱,直接查出 IP。
apple 的 Bonjour protocol 就是合併了 mDNS 與 DNS-SD 實作的。
mDNS
可用在沒有 DNS server 的區域網路中,用來作機器 domain name 的 IP 查詢。設備會透過對 224.0.0.251 這個 multicast address,Port 為 5353,進行廣播,mDNS 使用跟 DNS 一樣的封包格式。mDNS 只接受 .local 的網域名稱,可同時運作在一個設備中,跟原本的 DNS 並存。
mDNS 也有為自己命名的功能,在自選了一個 domain name 後,會用記錄類型為 any 的 mDNS 封包查詢是否有同樣的 domain name 的另一台機器,如果沒有,就會設定為自己的 domain name。
DNS-SD
基於 DNS,主要用到三種記錄類型:PTR、SRV、TXT
Service Discovery
設備會先發送一個 PTR 記錄的 multicast 查詢封包,查詢的格式為
<service>.<transport>.<domain>
service 是查詢的服務,transport 為傳輸協定: TCP 或 UDP,domain 為查詢網域,在 mDNS 為 .local。查詢後,具有該服務的設備就會回應
<instance>.<service>.<transport>.<domain>
ex: 查詢
_easylink._tcp.local
,EMW3031 Module#500A3F._easylink._tcp.local
回應就表示
EMW3031 Module#500A3F
是符合該 service 的 instance取得 instance 的 domain name 與 port
當有多個 instance 回應後,選擇某一個 instance,然後需要查詢該 instance 的 domain name 與 port,也就是查詢 SRV 記錄
_service._proto.name. TTL class SRV priority weight port target.
priority 和 weight 沒有作用,通常設定為 0
port 與 target 就分別是 port 與 domain name
ex:
EMW3031 Module#500A3F._easylink._tcp.local. 3 IN SRV 0 0 8002 EMW3031 Module#500A3F.local.
更詳細的資訊
除了 domain name 與 port 以外,還能夠提供更多資訊,就是記錄在 TXT record 中,以
key=value
格式記錄的資訊ex:
MAC=D0:BA:E4:50:0A:3F
CentOS7 avahi
Avahi is a system which facilitates service discovery on a local network via the mDNS/DNS-SD protocol suite.
安裝 avahi
yum install nss-mdns avahi avahi-tools
啟動
systemctl start avahi-daemon
出現錯誤訊息
dbus_bus_request_name(): Connection ":1.44573" is not allowed to own the service "org.freedesktop.Avahi" due to security policies in the configuration file
要重新啟動 dbus, NetworkManager
systemctl restart dbus.service
# /var/log/messages 會出現錯誤訊息
# (NetworkManager:624): GLib-GIO-CRITICAL **: Error while sending AddMatch () message: 這個連線已關閉
systemctl restart NetworkManager
# 避免 ssh 登入問題
# Failed to activate service 'org.freedesktop.login1': timed out
systemctl restart systemd-logind
再啟動 avahi-demon
systemctl start avahi-daemon
然後就能查詢 LAN 的機器
# avahi-browse -a
+ enp3s0 IPv4 lzstg [6c:62:6d:ce:71:c7] Workstation local
+ enp3s0 IPv4 macmini2 Microsoft Windows Network local
+ enp3s0 IPv4 macmini2 Apple File Sharing local
+ enp3s0 IPv4 macmini2 Apple Net Assistant local
+ enp3s0 IPv4 Michael's MacBook Pro Microsoft Windows Network local
+ enp3s0 IPv4 Michael's MacBook Pro _companion-link._tcp local
也可以直接 ping *.local 的機器
# ping macmini2.local
PING macmini2.local (192.168.1.159) 56(84) bytes of data.
64 bytes from 192.168.1.159 (192.168.1.159): icmp_seq=1 ttl=64 time=0.675 ms
64 bytes from 192.168.1.159 (192.168.1.159): icmp_seq=2 ttl=64 time=0.374 ms
發布 service
avahi-publish-service SERVICE-NAME _APPLICATIONPROTOCOL._TRANPOSRT-PROTOCOL PORT "DESCRIPTION" --sub SUBPROTOCOL
ex:
avahi-publish-service light _coap._udp 5683 “/mylight” --sub
_floor1._sub._coap._udp
發布 service name: light,使用 CoAP protocol,在 UDP 5683 提供服務
該 service 可透過 _coap._udp.local
及 _floor1._sub._coap._udp.local
被發現
沒有留言:
張貼留言