网络问题排查

安卓屏幕

Posted by LXG on May 27, 2025

traceroute

显示数据包从本机到目标主机之间经过的每一跳(路由节点)的路径,用于排查网络连接中间是否有阻塞、延迟或丢包的问题。

此命令需要root权限


ceres-c3:/ $ busybox traceroute -m 10 -n 223.5.5.5
traceroute to 223.5.5.5 (223.5.5.5), 10 hops max, 38 byte packets
 1  192.168.1.1  0.988 ms  0.633 ms  0.507 ms
 2  219.157.248.1  2.348 ms  1.910 ms  8.306 ms
 3  125.40.82.245  7.065 ms  115.60.219.237  1.847 ms  219.156.107.93  1.897 ms
 4  *  61.168.30.141  25.306 ms  *
 5  219.158.11.101  14.068 ms  219.158.126.129  13.337 ms  219.158.127.117  13.222 ms
 6  125.33.186.154  12.987 ms  124.64.212.114  12.851 ms  125.33.186.58  29.265 ms
 7  123.126.8.234  16.684 ms  61.148.146.122  12.873 ms  125.33.184.126  13.077 ms
 8  61.49.143.90  14.330 ms  15.313 ms  61.49.143.86  15.817 ms
 9  *  *  *
10  *  *  *

ceres-c3:/ $ busybox traceroute -m 10 -q 1 -w 2 -n 223.5.5.5
traceroute to 223.5.5.5 (223.5.5.5), 10 hops max, 38 byte packets
 1  192.168.1.1  0.739 ms
 2  219.157.248.1  16.610 ms
 3  125.40.82.245  12.633 ms
 4  *
 5  219.158.108.205  14.375 ms
 6  *
 7  61.148.154.114  16.578 ms
 8  61.49.143.86  14.549 ms
 9  *
10  *

参数 含义说明
-m 10 设置最大 TTL(跳数)为 10,防止追踪路径太长
-q 1 每个 TTL 只发送 1 个探测包(默认是 3 个),更快
-w 2 每个探测包等待响应的时间为 2 秒(默认是 3 秒)
-n 只显示数字 IP,不进行 DNS 反向解析,加快速度
223.5.5.5 目标 IP,阿里云公共 DNS,常用于测试连通性

参数解释


ceres-c3:/ $ busybox traceroute
BusyBox v1.18.3 (2012-12-03 15:06:10 CST) multi-call binary.

Usage: traceroute [-FIldnrv] [-f 1ST_TTL] [-m MAXTTL] [-p PORT] [-q PROBES]
	[-s SRC_IP] [-t TOS] [-w WAIT_SEC] [-g GATEWAY] [-i IFACE]
	[-z PAUSE_MSEC] HOST [BYTES]

Trace the route to HOST

Options:
	-F	// 设置“不要分片”标志(Don't Fragment bit),测试路径MTU限制
	-I	// 使用 ICMP ECHO 请求包代替默认的 UDP 探测包
	-l	// 显示返回数据包的 TTL(生存时间)值
	-d	// 为 socket 设置调试选项(SO_DEBUG)
	-n	// 直接输出数字 IP 地址,不做 DNS 反解析
	-r	// 绕过路由表,直接发送数据包到目标主机
	-v	// 显示详细模式输出
	-m	// 最大 TTL(跳数),探测包最多经过的路由跳数,防止无限循环
	-p	// UDP 探测包起始端口号,默认 33434
	-q	// 每个 TTL 发送探测包数量,默认 3 个
	-s	// 指定源 IP 地址(用于多网卡等情况)
	-t	// 探测包的服务类型字段(Type of Service),默认为 0
	-w	// 每个探测包等待响应的时间(秒),默认为 3 秒
	-g	// 松散源路由网关,指定最多 8 个中转网关
	-i	// 指定发送探测包使用的网络接口
	-z	// 发送探测包的间隔时间(毫秒)

android user 版本支持 traceroute


diff --git a/android/system/core/libcutils/fs_config.cpp b/android/system/core/libcutils/fs_config.cpp
index f733c18cc0..f37ed18c72 100644
--- a/android/system/core/libcutils/fs_config.cpp
+++ b/android/system/core/libcutils/fs_config.cpp
@@ -223,6 +223,7 @@ static const struct fs_path_config android_files[] = {
     { 00755, AID_ROOT,      AID_SHELL,     0, "system/bin/*" },
     { 00755, AID_ROOT,      AID_SHELL,     0, "system/xbin/*" },
     { 00755, AID_ROOT,      AID_SHELL,     0, "system/apex/*/bin/*" },
+    { 00755, AID_ROOT,      AID_SHELL,     CAP_MASK_LONG(CAP_NET_RAW), "vendor/bin/busybox" },
     { 00755, AID_ROOT,      AID_SHELL,     0, "vendor/bin/*" },
     { 00755, AID_ROOT,      AID_SHELL,     0, "vendor/xbin/*" },
     { 00644, AID_ROOT,      AID_ROOT,      0, 0 },

验证方式


ceres-c3:/ $ getcap vendor/bin/busybox
vendor/bin/busybox = cap_net_raw+ep

上述修改后会导致adb shell 无法执行 busybox 命令


ceres-c3:/ $ busybox
/system/bin/sh: /vendor/bin/busybox: Operation not permitted

问题原因

  • Linux 的 Capability(能力)机制允许程序拥有细粒度权限,如 CAP_NET_RAW
  • Android 内核启用了 secure exec 安全模型,执行带 Capability 的程序需要权限检查。

执行带 Capability 的二进制需要满足:

  • 执行者是 root 用户(UID 0);
  • 或二进制文件是 setuid/setgid,允许提权执行;
  • 或文件在系统允许的 capability 白名单里。

adb shell 用户是 shell,非 root,权限有限,

执行带 Capability 的程序时会被内核拒绝,导致 “Operation not permitted”。

解决方案


diff --git a/android/system/core/libcutils/fs_config.cpp b/android/system/core/libcutils/fs_config.cpp
index f37ed18c72..6abba867f2 100644
--- a/android/system/core/libcutils/fs_config.cpp
+++ b/android/system/core/libcutils/fs_config.cpp
@@ -223,7 +223,7 @@ static const struct fs_path_config android_files[] = {
     { 00755, AID_ROOT,      AID_SHELL,     0, "system/bin/*" },
     { 00755, AID_ROOT,      AID_SHELL,     0, "system/xbin/*" },
     { 00755, AID_ROOT,      AID_SHELL,     0, "system/apex/*/bin/*" },
-    { 00755, AID_ROOT,      AID_SHELL,     CAP_MASK_LONG(CAP_NET_RAW), "vendor/bin/busybox" },
+    { 00755, AID_ROOT,      AID_SHELL,     CAP_MASK_LONG(CAP_NET_RAW), "vendor/bin/busybox_sys" },
     { 00755, AID_ROOT,      AID_SHELL,     0, "vendor/bin/*" },
     { 00755, AID_ROOT,      AID_SHELL,     0, "vendor/xbin/*" },
     { 00644, AID_ROOT,      AID_ROOT,      0, 0 },

BusyBox 支持的以太网网络测试相关命令(A133)

命令 功能说明
ping 测试网络主机连通性
traceroute 路由追踪,追踪数据包到目标的路径
nslookup 域名解析,测试 DNS 配置是否正确
netstat 显示网络连接、监听端口、路由表等
ifconfig 配置和查看网络接口状态(旧版常用)
ip 更现代的网络配置工具,支持子命令(如 ip link
telnet 测试 TCP 端口连通性(适合测试服务器端口)
route 查看和配置路由表
wget 测试 HTTP/HTTPS 下载,验证网络出口访问情况
arp 显示 ARP 表(可用于本地局域网排错)
ether-wake 发送 Wake-on-LAN 魔术包
udhcpc DHCP 客户端,测试是否能获取到 IP 地址
hostname 显示/设置当前设备主机名
ipaddr 查看/配置 IP 地址(ip 命令的一部分)
iplink 查看/配置接口状态(如 UP/DOWN)
iproute 查看/配置路由(ip route
iprule 高级路由规则配置(不常用)
iptunnel 隧道配置相关,进阶网络调试使用