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 | 隧道配置相关,进阶网络调试使用 |