排查网络连接问题:设备发现

正确配置网络接口后,您就可以开始探测 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.251fe02::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 目标设备。