第 2 部分:探索裝置

如果網路介面設定正確,我們就能開始探查目標裝置是否存在。請注意,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.251fe02::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 目標裝置。

下一步:第 3 部分:SSH 精靈