网络问题排查

安卓屏幕

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

查看局域网中的所有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(济南有人物联技术有限公司)是中国一家专注于工业物联网通信设备的厂商

济南有人物联技术有限公司

USR-DR404_73E8

user_DR404

商丘DNS冲突问题原因

USR-DR404 的模块儿默认开启了DHCP服务所致,需要通过web页面关闭

为什么“网口转485设备”会支持 DHCP Server?

虽然这些设备(如 USR-DR404)主要功能是串口转网络通信,但它们内部其实集成了一个完整的嵌入式网络协议栈,往往运行在 RTOS 或精简版 Linux 上,具备完整的以太网 TCP/IP 能力。支持 DHCP Server 是这个网络功能的一部分。

这些设备支持 DHCP Server 是为了方便一些特定场景下的临时组网、调试和无路由器环境使用,但在现代网络中,如果未关闭,就可能变成严重的“网络污染源”。