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 | 隧道配置相关,进阶网络调试使用 |
查看局域网中的所有IP
arp -a
lxg@lxg:~/code/project$ arp -a
bogon (192.168.1.22) 位于 2c:19:5c:e5:6d:64 [ether] 在 enp6s0
bogon (192.168.1.55) 位于 04:f9:f8:14:1a:23 [ether] 在 enp6s0
bogon (192.168.1.28) 位于 a4:b1:c1:2a:51:0c [ether] 在 enp6s0
bogon (192.168.1.226) 位于 48:e7:da:37:28:5b [ether] 在 enp6s0
bogon (192.168.1.32) 位于 e6:16:a3:57:94:af [ether] 在 enp6s0
bogon (192.168.1.123) 位于 56:57:c3:9a:c6:52 [ether] 在 enp6s0
ubuntu 扫描DNS服务
nmap -p 53
lxg@lxg:~/code/project$ nmap -p 53
Starting Nmap 7.95 ( https://nmap.org ) at 2025-07-29 11:32 CST
WARNING: No targets were specified, so 0 hosts scanned.
Nmap done: 0 IP addresses (0 hosts up) scanned in 0.02 seconds
商丘虞城DNS问题日志分析
07-29 10:17:54.109 601 1200 D DhcpClient: Received packet: 54:2f:12:8e:b3:ec OFFER, ip /192.168.1.105, mask /255.255.255.0, DNS servers: /192.168.1.135 , gateways [/192.168.1.135], lease time 86400, domain USR-DR404_73E8
07-29 10:17:54.109 601 1200 D DhcpClient: Got pending lease: android.net.networkstack.DhcpResults@2792d92 DHCP server /192.168.1.135 Vendor info null lease 86400 seconds Servername
07-29 10:17:54.110 601 1200 D DhcpClient: Broadcasting DHCPREQUEST ciaddr=0.0.0.0 request=192.168.1.105 serverid=192.168.1.135
07-29 10:17:54.125 601 1200 D DhcpClient: Received packet: 54:2f:12:8e:b3:ec OFFER, ip /192.168.1.105, mask /255.255.255.0, DNS servers: /192.168.1.136 , gateways [/192.168.1.136], lease time 10378, domain USR-DR404_99C4
07-29 10:17:54.130 601 1200 D DhcpClient: Received packet: 54:2f:12:8e:b3:ec OFFER, ip /192.168.1.105, mask /255.255.255.0, DNS servers: /192.168.1.137 , gateways [/192.168.1.137], lease time 86400, domain USR-DR404_93F8
字段 | 含义说明 |
---|---|
54:2f:12:8e:b3:ec |
发送 DHCPOFFER 报文的设备 MAC 地址 |
OFFER |
DHCP 报文类型,表示这是 DHCP Server 返回的地址提议 |
ip /192.168.1.105 |
DHCP Server 提议分配给客户端的 IP 地址 |
mask /255.255.255.0 |
子网掩码 |
DNS servers: /192.168.1.135 |
提供的 DNS 服务器地址(注意:这可能是伪 DNS) |
gateways [/192.168.1.135] |
默认网关地址(同样可能是伪造的 DHCP Server 提供的) |
lease time 86400 |
租约时间,单位秒,86400 秒 = 24 小时 |
domain USR-DR404_73E8 |
DHCP Server 设备的标识名称(表示为 USR 的 DR404 型号,工业物联网设备) |
packages/modules/NetworkStack/src/android/net/dhcp/DhcpClient.java
Android 如何处理多个DNS
1. 广播 DHCPDISCOVER
2. 接收多个 DHCPOFFER
3. 选择其中一个 OFFER(通常是最先收到的)
4. 向该 Server 发送 DHCPREQUEST
5. 接收到 DHCPACK 后,配置 IP / DNS / 网关
局域网内活跃主机
cat /proc/net/arp
rk3588_s:/ $ cat /proc/net/arp
192.168.1.1 0x1 0x2 ec:60:73:5e:86:f6 * eth1
192.168.1.31 0x1 0x2 c4:93:bb:98:ec:7e * eth1
192.168.1.71 0x1 0x2 04:f9:f8:14:1a:23 * eth1
192.168.1.137 0x1 0x2 2c:19:5c:e5:6d:64 * eth1
192.168.1.26 0x1 0x2 ae:8a:36:08:6f:c8 * eth1
192.168.1.165 0x1 0x2 30:95:87:72:92:a7 * eth1
192.168.1.42 0x1 0x2 04:f9:f8:11:56:e7 * eth1
192.168.1.40 0x1 0x2 e6:cb:aa:e6:07:1b * eth1
192.168.1.60 0x1 0x2 80:ae:54:d5:f6:f0 * eth1
命令查看某个设备的制造商
lxg@lxg$ curl https://api.macvendors.com/d4:ad:20:9c:73:ea
Jinan USR IOT Technology Limited
Jinan USR IOT Technology Limited(济南有人物联技术有限公司)是中国一家专注于工业物联网通信设备的厂商
商丘DNS冲突问题原因
USR-DR404 的模块儿默认开启了DHCP服务所致,需要通过web页面关闭
为什么“网口转485设备”会支持 DHCP Server?
虽然这些设备(如 USR-DR404)主要功能是串口转网络通信,但它们内部其实集成了一个完整的嵌入式网络协议栈,往往运行在 RTOS 或精简版 Linux 上,具备完整的以太网 TCP/IP 能力。支持 DHCP Server 是这个网络功能的一部分。
这些设备支持 DHCP Server 是为了方便一些特定场景下的临时组网、调试和无路由器环境使用,但在现代网络中,如果未关闭,就可能变成严重的“网络污染源”。