Fuchsia 上的数据包捕获

数据包捕获是用于开发、调试和测试网络的基本工具。

fx sniff 是一个开发主机命令,用于执行以下操作:

  • 在 Fuchsia 目标设备上运行数据包捕获。
  • 将 PCAPNG 格式的数据包存储在 Fuchsia 开发主机上。
  • 流式传输到图形界面,例如 Wireshark

tcpdump 是支持丰富的捕获过滤器的数据包捕获器。fx sniff 在内部调用 tcpdump,其中包含 Fuchsia 开发者工作流所需的预定义拍摄滤镜。对于无法使用 fx sniff 的用例(例如,当您具有串行控制台访问权限,但未连接开发主机时),请直接使用 tcpdump

准备映像

确保将 tcpdump 捆绑到一组基础软件包中。

$ fx set core.x64 --with-base //third_party/tcpdump
$ fx build

操作方法(主持人)

通过 WLAN 接口捕获数据包

[host] $ fx sniff wlan

默认情况下,此命令会捕获 30 秒的数据包。如需配置时长,请添加 --time {sec}-t {sec} 选项。

如果您不知道网络接口名称,请运行 fx sniff(不含任何选项)。错误消息会显示哪些接口可用。或者,您可以运行以下命令:

[host] $ fx shell net if list

显示以太网接口的数据包的十六进制转储

[host] $ fx sniff --view hex eth

捕获 WLAN 数据包并将其存储在文件中

[host] $ fx sniff --file my_packets wlan

捕获的数据包首先存储在目标的 /tmp/ 目录中。拍摄完成后,文件会自动移动到 //out/my_packets.pcapng

实时流式传输到 Wireshark

注意:仅限 Linux。

[host] $ fx sniff --view wireshark wlan

强行停止

数据包捕获会运行指定时长(--time-t 选项)。如果用户想提前停止,请按以下任一键:

c, q, C, Q

此操作会同时停止目标端进程和主机端进程。

HowTo(在目标设备上)

使用 tcpdump 进行调试

fx sniff”要求从主机到目标的 ssh 连接必须有效,这意味着网络必须在一定程度上能够正常工作。在某些情况下,可能根本没有网络连接。如果您可以在网络(包括 ssh)无法使用时访问串行控制台,则必须直接在目标上运行 tcpdumptcpdump 提供的功能比 fx sniff 更丰富。

通过 WLAN 接口捕获数据包

[target] $ tcpdump -i wlan --no-promiscuous-mode

以 PCAPNG 格式流式传输二进制文件转储

[target] $ tcpdump -i wlan --no-promiscuous-mode -w -

捕获数据包并将其存储在文件中

[target] $ tcpdump -i wlan --no-promiscuous-mode -w /tmp/my_packets.pcapng

将转储文件复制到主机

[host] $ cd ${FUCHSIA_OUT_DIR} && fx scp "[$(fx get-device-addr)]:/tmp/my_packets.pcapng"

tcpdump 帮助

[target] $ tcpdump --help

仅手表 ARP、DHCP 和 DNS 数据包

[target] $ tcpdump -i  wlan --no-promiscuous-mode "arp or port dns,dhcp" "$iface_filepath"

过滤条件语法

tcpdump 在后台使用 libpcap。请参阅 pcap-filter

参考文档:fx 工作流数据包签名

Fuchsia 之间提供了许多不同类型的服务, 开发主机和目标。这些容器通常由 fx 命令调用。 大多数情况下,您对 fx 生成的那些数据包不感兴趣 工作流。下表列出了一些值得注意的签名。

使用 签名 参考文档
日志记录器 端口 33337 NETBOOT_DEBUGLOG_PORT_SERVER
日志记录器 端口 33338 NETBOOT_DEBUGLOG_PORT_ACK
启动磁盘 端口 33330 NETBOOT_PORT_SERVER
启动磁盘 端口 33331 NETBOOT_PORT_ADVERT
启动磁盘 端口 33332 NETBOOT_PORT_CMD_START
启动磁盘 端口 33339 NETBOOT_PORT_CMD_END
启动磁盘 端口 33340 NETBOOT_PORT_TFTP_OUTGOING
启动磁盘 端口 33341 NETBOOT_PORT_TFTP_INCOMING
包裹服务器 端口 8083 docs/packages.md
fx shell 端口 22 devshell/shell
目标 netsvc 地址 fe80::xxxx:xxff:fexx:xxxx%XX fx 设备查找器列表 --netboot
主机链路本地地址 fe80::xxxx:xxxx:xxxx:xxxx%XX fx 设备查找器列表 --ipv4=false --local
目标 netstack 地址 fe80::xxxx:xxxx:xxxx:xxxx%XX fx get-device-addr
zxdb 端口 2345 devshell/contrib/debug
- 端口 65026
- 端口 65268
- 1900

问题排查

我遇到了错误 /boot/bin/sh: tcpdump not found

A tcpdump 软件包未准备好。确保在映像中捆绑 tcpdump。请参阅准备映像