数据包捕获是用于开发、调试和测试网络的基本工具。
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
)无法使用时访问串行控制台,则必须直接在目标上运行 tcpdump
。tcpdump
提供的功能比 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
。请参阅准备映像。