如果網路介面設定正確,我們就能開始探查目標裝置是否存在。請注意,Fuchsia 模擬器 (aemu 和 qemu) 使用的探索機制與本文所述不同,因此不在討論範圍內。
本範例使用 avahi 檢查 mDNS 記錄。avahi 工具鍊會與本機精靈通訊,但精靈可能正在執行,也可能未執行。如果未執行,avahi 指令通常會失敗,並顯示 Daemon not running
訊息。
如有需要,只要以前景程序啟動精靈即可。在終端機中執行:
sudo avahi-daemon
精靈會在遇到 mDNS 查詢時快取這些查詢,並在完成時安全終止。
多點傳送 DNS 解析
裝置探索功能會使用多點播送 DNS (mDNS) 判斷紫紅色目標的 IP 位址。
Fuchsia 目標會將 IP 資訊以 _fuchsia._udp
服務類型廣播至 mDNS。
您可以使用 avahi 透過下列指令查詢這項資訊:
avahi-browse --resolve _fuchsia._udp
這項指令會顯示為停止運作。這個指令會先傾印 avahi 快取中的所有記錄,然後等待並監聽 mDNS 廣播。有了 --resolve
標記,avahi 隨後會嘗試解析遇到的任何記錄。解析結果會產生 Fuchsia 目標裝置的 IPv6 位址。
bash$ avahi-browse --resolve _fuchsia._udp
+ zx-c863147051da IPv6 fuchsia-c863-1470-51da _fuchsia._udp local
= zx-c863147051da IPv6 fuchsia-c863-1470-51da _fuchsia._udp local
hostname = [fuchsia-c863-1470-51da.local]
address = [fe80::ca63:14ff:fe70:51db]
port = [5353]
txt = []
在這裡,您可以看到系統找到包含主機名稱 fuchsia-c863-1470-51da
的主機記錄,並隨後解析為 fe80::ca63:14ff:fe70:51db
,也就是已連線 Fuchsia 目標的位址。
mDNS 封包檢查
如果找不到任何記錄,請檢查目標是否回覆 mDNS 查詢。mDNS 在 5353 連接埠運作,可使用 tcpdump
檢查。將指令限制為必要介面,並依據 IPv6 通訊協定和 mDNS 連接埠進行篩選:
sudo tcpdump -n -i zx-c863147051da "ip6 && port 5353"
您應該會看到類似下列內容的輸出,其中顯示 mDNS 查詢/回應週期。
bash$ sudo tcpdump -n -i zx-c863147051da "ip6 && port 5353"
13:32:41.725007 IP 169.254.31.167.58994 > 224.0.0.251.5353:
0 PTR (QU)? _fuchsia._udp.local. (37)
13:32:41.725057 IP 169.254.31.167.58994 > 224.0.0.251.5353:
0 PTR (QU)? _fastboot._tcp.local. (38)
13:32:43.724131 IP6 fe80::ca63:14ff:fe70:51da.34810 > ff02::fb.5353:
0 PTR (QU)? _fuchsia._udp.local. (37)
13:32:43.724183 IP6 fe80::ca63:14ff:fe70:51da.34810 > ff02::fb.5353:
0 PTR (QU)? _fastboot._tcp.local. (38)
13:32:43.725635 IP6 fe80::ca63:14ff:fe70:51db.5353 > fe80::ca63:14ff:fe70:51da.34810:
0*- [0q] 1/0/3 PTR fuchsia-c863-1470-51da._fuchsia._udp.local. (152)
mDNS 防火牆/netfilter 規則
在某些情況下,可能需要檢查核心的 netfilter 規則,才能透過 mDNS 探索裝置。如果執行 nft list tables
時看到類似下列內容,可能需要調整規則。
bash$ sudo nft list tables
table ip filter
table ip nat
table inet firewalld
大多數設定應該只需要前兩項規則。如要移除 firewalld
規則,可以執行下列指令:
sudo systemctl stop firewalld
sudo systemctl disable firewalld
sudo nft delete table inet firewalld
mDNS 流量會透過 224.0.0.251
和 fe02::fb
多點播送位址 (分別為 IPv4 和 IPv6) 在通訊埠 5353 上產生。建議您檢查 filter
表格,看看是否有任何政策套用至 5353 連接埠或這些地址。
bash$ sudo nft list table ip filter
table ip filter {
...
}
多點傳播 ping
如要找出目標的 IPv6 位址,也可以 Ping 本地多點傳播 ff02::1
裝置位址。這是 IANA 指定的預先決定地址。詳情請參閱 RFC-4291 的 2.7.1 節。
ping6 ff02::1%zx-c863147051da
請注意,本機網路介面是使用 IPv6 位址的範圍 ID 元件指定,這是 Ping 多點播送位址的必要條件。-I
旗標可能也有類似效果。
Ping 回應來自 Fuchsia 裝置,並包含 IP 位址資訊。
bash$ ping6 ff02::1%zx-c863147051da
PING ff02::1%zx-c863147051da (ff02::1%zx-c863147051da) 56 data bytes
64 bytes from fe80::ca63:14ff:fe70:51da%zx-c863147051da: icmp_seq=1 ttl=64 time=0.088 ms
64 bytes from fe80::ca63:14ff:fe70:51db%zx-c863147051da: icmp_seq=1 ttl=64 time=0.958 ms
請注意,本機主機本身可能會回覆多點傳播連線偵測 (ping)。其中,fe80::ca63:14ff:fe70:51da
是主機端介面的位址 (如上所述),fe80::ca63:14ff:fe70:51db
則是 Fuchsia 目標裝置的位址。
簡單的經驗法則是,如果裝置的回應時間遠小於一毫秒,通常是本機回應;如果回應時間接近或超過一毫秒,則可能是 Fuchsia 目標裝置。