正确配置网络接口后,您就可以开始探测 Fuchsia 目标设备是否存在了。
本页中的示例使用 avahi
来检查 mDNS 记录。avahi
工具链与可能正在运行或可能未在运行的本地守护程序进行通信。如果守护程序未运行,avahi
命令通常会失败,并显示一条消息,指出 Daemon not running
。
您可以在需要时将守护程序作为前台进程启动。在终端中,运行以下命令:
sudo avahi-daemon
守护程序会在遇到 mDNS 查询时将其缓存,并在完成后安全终止。
多播 DNS 解析
设备发现功能使用多播 DNS (mDNS) 来确定 Fuchsia 目标设备的 IP 地址。Fuchsia 目标设备会通过 mDNS 以 _fuchsia._udp
的服务类型广播其 IP 信息。
如需使用 avahi
查询此信息,请运行以下命令:
avahi-browse --resolve _fuchsia._udp
此命令似乎会挂起。它首先会转储 avahi
缓存中的所有记录,然后等待并监听 mDNS 广播。如果您使用 --resolve
标志,avahi
随后会尝试解析遇到的任何记录。解析会生成 Fuchsia 目标设备的 IPv6 地址。例如:
$ 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 查询和响应周期:
$ 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 发现设备。
ufw 规则
ufw
是一种用于管理内核的 netfilter 规则的实用程序。如果您已在计算机上安装此工具,可以运行以下命令来检查防火墙是否已正确设置:
sudo ufw status
此操作应该会返回如下所示的内容:
Status: active
To Action From
-- ------ ----
Anywhere (v6) ALLOW fe80::/10 5353/udp # Fuchsia MDNS
33331:33340/udp ALLOW fe80::/10 # Fuchsia Netboot Protocol
8083/tcp ALLOW fe80::/10 # Fuchsia Package Server
Anywhere (v6) ALLOW fe80::/10 33340/udp # Fuchsia Netboot TFTP Source Port
33331:33340/udp ALLOW fc00::/7 # Fuchsia Netboot Prot
ocol
8083/tcp ALLOW fc00::/7 # Fuchsia Package Server
Anywhere (v6) ALLOW fc00::/7 33340/udp # Fuchsia Netboot TFTP Source Port
Anywhere (v6) ALLOW fc00::/7 5353/udp # Fuchsia MDNS
如果不是这种情况(即输出为空),请运行以下命令:
fx setup-ufw
运行此命令会为 netfilter 设置多条 UFW 规则。
netfilter 规则
可能还存在其他 netfilter 限制。
firewalld
如需查看计算机上正在运行的规则,请运行以下命令:
sudo nft list tables
如果输出结果如下所示,您可能需要调整规则:
$ sudo nft list tables
table ip filter
table ip nat
table inet firewalld
大多数设置可能都包含前两条规则:
table ip filter
table ip nat
如需移除 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 或这些地址。例如:
$ sudo nft list table ip filter
table ip filter {
...
}
其他 netfilter 检查
如果您已尝试上述操作,但仍存在以下情况:
- 您的机器上未安装
ufw
。请参阅 ufw 规则。 - 您的机器上未运行
firewalld
。请参阅 firewalld。 - 您无法使用
ffx target list
解析设备的地址。 - 您可以使用
avahi
解析设备的地址。请参阅多播 DNS 解析。
您可能仍然有某些防火墙规则会阻止单播 mDNS 消息。您可能需要手动添加例外情况 iptables
,以允许链路本地 IPv6 消息的 mDNS:
sudo ip6tables -A INPUT -s fe80::/10 -d ::/0 -p udp --sport 5353 -j ACCEPT
sudo ip6tables -A INPUT -s fc00::/10 -d ::/0 -p udp --sport 5353 -j ACCEPT
如果此方法无效,您可能需要观察哪些类型的防火墙规则可能会影响 IPv6 流量,并相应地解决这些问题:
sudo iptables -L -n
多播 ping
发现目标 IPv6 地址的另一种方法是 ping 本地多播 ff02::1
设备地址。例如:
ping6 ff02::1%zx-c863147051da
这是 IANA 指定的预定地址。如需了解详情,请参阅 RFC-4291 的第 2.7.1 章第 2.7.1 节。
请注意,本地网络接口是使用 IPv6 地址的 scope-id
组件指定的,这是 ping 多播地址的要求。使用 -I
标志也能达到类似的效果。Ping 响应来自 Fuchsia 设备,包含其 IP 地址信息。例如:
$ 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 目标设备的地址。
一个不错的经验法则是,响应时间远低于 1 毫秒的设备通常是响应的本地主机,而响应时间接近或超过 1 毫秒的设备很可能是 Fuchsia 目标设备。