droid.rooter
教程高级20 分钟阅读

通过互联网使用 Android ADB:有无 Root 的安全配置

远程 ADB 很容易开启,也很容易配置得极不安全。本指南有无 Root 都适用,会标出哪些步骤仅限 Root,并介绍三种不必向互联网开放端口就能连上手机的方法。

Illustration of a laptop reaching an Android phone through an encrypted tunnel, with a crossed-out open port 5555 warning
目录
  1. 有无 Root 有何区别
  2. 真正保护 ADB 的是什么,不是什么
  3. 为什么无线调试不适合无人值守的远程访问
  4. 第 1 步:开启 TCP ADB
  5. 无 Root
  6. 有 Root(仅限 Root)
  7. 第 2 步:选择通往手机的私有通道
  8. 方法 A:Tailscale
  9. 方法 B:经由自己服务器的 SSH 反向隧道
  10. 方法 C:在自己的服务器上搭建 WireGuard
  11. 要避免的配置:在路由器上转发 5555 端口
  12. 加固清单
  13. 网络较慢时怎么用
  14. 故障排查
  15. 常见问题
  16. 投入使用前的检查
  17. 来源与范围

从另一个国家访问手机的 ADB,并不需要 Root。你需要的是两样东西:一种开启 TCP ADB 的办法,以及电脑与手机之间的一条私有通道。Root 只影响第一部分:有了 Root,手机可以自己开启 ADB,重启后依然保持开启,不需要数据线。本指南的其余内容在未 Root 的手机上完全一样。

无论有没有 Root,大家犯的错都是同样两种:照着教程在家里的路由器上转发 5555 端口,或者信任一条在 Wi-Fi 下能用、在移动数据下却悄悄失败的连接。

本指南针对你自己的手机:用来跑测试的备用机、出门在外想连回家里的手机、一小批测试机。不涉及访问他人的设备。内容包括远程 ADB 的工作原理、有无 Root 时如何开启,以及三种绝不会把 ADB 暴露在公网上的连接方法。需要 Root 的步骤会标注 仅限 Root。

简短总结:在手机上开启 TCP ADB,只让它通过加密的私有通道访问,并在电脑上经由这条通道连接。Tailscale 是最简单的方式;经由自己的小服务器建立 SSH 反向隧道,适用面最广;直接转发 5555 端口则是要避免的配置。

有无 Root 有何区别

任务无 Root有 Root
开启 TCP ADB先用数据线把手机连到电脑,运行 adb tcpip 5555;Android 11 及更新版本也可以用下文的手机端方法在手机上直接运行一条命令
重启后保持开启每次重启后都要重复上面的步骤只需设置一次属性和开机脚本。仅限 Root
从任何地方访问Tailscale、SSH 反向隧道或 WireGuard相同
在手机上把 5555 端口限制为只对 VPN 开放无法做到可以用防火墙规则实现。仅限 Root,且并非处处可靠
远程以 Root 身份运行命令不行,你拿到的是 shell 用户如果 Root 管理器允许,可用 adb shell su。仅限 Root

实际差别在于可靠性,而不是能力。未 Root 的手机远程使用一切正常,直到它重启,之后就连不上了,必须有人拿着手机和电脑去恢复。手机在另一座城市时,这就是要 Root 的理由。手机就在手边,或只是短期测试,就不必 Root。

真正保护 ADB 的是什么,不是什么

关于远程 ADB 的建议大多说,网络上的 ADB“没有加密,也没有认证”。这只说对了一半,而说错的那一半,恰恰影响你该怎么配置。

经典的网络 ADB,也就是 adb tcpip 5555 模式,是未加密的。Android 的 ADB 设计说明指出,旧版传输使用明文数据包,而 Android 11 引入的 Wi-Fi 模式则对会话使用 TLS 加密。来源 2 任何能监听你和手机之间链路的人,都能读到你发送的内容。

认证则是另一回事。在正常的正式版系统上,ADB 仍会要求手机批准你电脑的 RSA 密钥。第一次连接时,adb devices 会显示 unauthorized,手机上会弹出对话框:“Allow USB debugging?”,并附上密钥指纹。Android 文档明确说明,必须先解锁设备并确认该对话框,adb 命令才能运行。来源 1 你批准过的密钥保存在手机上,勾选“Always allow from this computer”后,以后的连接就不再弹窗。

由此得出两点实际结论。第一,在未改动的正常手机上,暴露的端口不会让陌生人直接闯入,但任何拿到手机已信任密钥的人都能进来;而在关闭了认证的设备上,它则完全敞开。通过 5555 端口传播的恶意软件,找到的大多是这类设备:电视盒子、投影仪、开发者版本,以及有人把安全标志关掉的手机。第二,新电脑的第一次连接需要有人在屏幕上操作。请在你站在手机旁边时授权密钥,用数据线或在家里的 Wi-Fi 下完成,并勾选记住该密钥的选项。

模式加密端口认证方式
adb tcpip 5555 或 service.adb.tcp.port 属性无,流量为明文固定,通常是 5555手机上的 RSA 密钥确认提示
无线调试,Android 11 及更高版本TLS随机,每次开关都会变化配对码或二维码,之后使用已保存的密钥

为什么无线调试不适合无人值守的远程访问

无线调试看起来更安全,在家里 Wi-Fi 下用笔记本连接时确实如此。但用于远程访问,它处处和你作对。连接端口是随机的,每次关闭再开启都会变;设备发现依赖 mDNS,而 mDNS 无法穿过 VPN;较新的 Android 版本还会自行把它关掉。Android 17 搭配 ADB 37 新增了“ADB Wi-Fi 2.0”,会在未标记为受信任的网络上关闭无线调试,在已标记的网络上自动重连。来源 4 对开发者的书桌来说,这样的行为再好不过,但对一部你要从另一个国家访问的手机来说,恰恰适得其反。

想了解该功能的细节,可以看我们的 Android 17 无线 ADB 指南,里面讲了配对、受信任网络,以及“已配对但离线”的问题。用于远程访问时,更合适的基础是固定的 TCP 端口:有没有 Root 都能开启,再用比端口本身更强的手段加以保护。

第 1 步:开启 TCP ADB

请选择与你手机相符的部分。两种方式最终状态相同:手机的 ADB 守护进程监听 5555 端口,由第 2 步来保护它。

无 Root

在任意 Android 手机上,开启开发者选项和 USB 调试,用数据线把手机连到电脑,在手机提示时批准密钥,然后运行:

adb tcpip 5555

拔掉数据线。此后手机会在 5555 端口接受网络 ADB 连接,直到重启为止。部分系统在你切换 USB 调试时也会重置该设置,所以如果端口不再响应,请重新运行命令。由于该设置在重启后会丢失,未 Root 的手机每次重启后都需要有人拿着数据线操作。对你随手能碰到的手机来说没问题,对够不着的手机就不合适了。

在 Android 11 及更高版本上,有一种完全不需要电脑就能完成同一步骤的办法,社区里用得很多,不过我们没有在所有设备上测试过。做法是:开启无线调试,安装 Termux 及其 Android 工具包,用配对码让 Termux 与手机本身配对,连接手机自己的地址,然后在 Termux 中运行 adb tcpip 5555。这需要手机此时已连上 Wi-Fi。把它当作忘带数据线时的备用方案,具体命令请查阅最新的 Termux 教程,因为它们会随软件包和 Android 版本变化。

有 Root(仅限 Root)

在已 Root 的手机上,打开 Termux 等终端应用并获取 Root shell。控制端口的属性由 ADB 守护进程自己读取,守护进程源码依次检查 service.adb.listen_addrs、service.adb.tcp.port、persist.adb.tcp.port。来源 3

su
setprop service.adb.tcp.port 5555
stop adbd
start adbd

重启守护进程会断开所有已打开的 USB 调试会话,所以请在手机上运行,不要在通过数据线连接的电脑上运行。验证它是否在监听:

getprop service.adb.tcp.port
ss -ltn | grep 5555

部分 Android 系统没有 ss,另一些系统则可以用 netstat -ltn。如果两个都没有,以第 2 步中从电脑发起的连接测试为准。

手机重启后,service. 属性会丢失。断电后连不上的手机,算不上远程手机,所以要让设置持久化。有两种办法,搭配使用效果很好。第一种是持久属性:

setprop persist.adb.tcp.port 5555

第二种是开机脚本。使用 Magisk 时,把 shell 脚本保存到 /data/adb/service.d/ 并设为可执行,它会在开机后期运行;KernelSU 和 APatch 则改用带 service.sh 文件的小模块。具体位置请查阅你的 Root 管理器自己的文档,因为不同工具和版本之间会有变化。

#!/system/bin/sh
until [ "$(getprop sys.boot_completed)" = "1" ]; do sleep 5; done
setprop service.adb.tcp.port 5555
stop adbd
start adbd

重启一次再测试。各厂商对这些属性的处理不同,少数 ROM 会忽略或重置它们。在 Android 11 及更高版本上,曾有一条 SELinux 规则在部分系统上阻止 ADB 设置端口属性,后来被放宽。来源 5 如果它在你的手机上重启后失效,开机脚本就是解决办法;如果守护进程根本不监听,可能是你的 ROM 屏蔽了该属性。这种情况下,退路是每次开机后用 adb tcpip 5555 通过 USB 连接一次,也就是上面的无 Root 方法。

要重新关闭,在有 Root 的情况下:

setprop service.adb.tcp.port -1
setprop persist.adb.tcp.port ""
stop adbd
start adbd

没有 Root 时,在开发者选项里关闭 USB 调试,或重启手机,效果相同。

此时手机会在它的所有网络接口上监听。只要能访问这些接口的只有你和你信任的网络,就没有问题,这正是下一步要做的事。

第 2 步:选择通往手机的私有通道

下面每种方法有无 Root 都适用,目标相同:为你的电脑提供一条加密、经过认证的路径,通向手机的 5555 端口,并且不接受来自开放互联网的入站连接。第二点比看上去更重要。大多数使用移动数据的手机都处在运营商级 NAT 之后,所以即使你想在路由器上做转发,也到不了它们。

方法所需条件CGNAT 后可用难度最适合
Tailscale免费账号,两端都装应用是最低大多数人
SSH 反向隧道一台你可控的小服务器是中等不想依赖第三方服务的人
自己服务器上的 WireGuard一台有公网 IP 的服务器是中等固定、常开的长期配置
在路由器上转发 5555公网 IP移动数据下不行低没人适合,别这么做

方法 A:Tailscale

Tailscale 在你的设备之间搭建一个私有网络,并自动处理 NAT 穿透,所以手机使用移动数据时也能用。在手机和电脑上都安装它,并登录同一个账号。每台设备会得到一个以 100. 开头的固定地址,手机的地址可以在应用和管理控制台中看到。

在电脑上:

adb connect 100.x.y.z:5555
adb devices

第一次连接时手机会要求你批准密钥,所以这一步最好在手机在手边时做一次。Tailscale 应用不需要 Root。之后,adb shell、adb push、adb logcat 和 scrcpy 都像手机就放在你桌上一样可用。

有三项设置能让这套方案从方便变成可靠。第一,Tailscale 默认允许网络内每台设备访问其他所有设备,需要用策略文件来收窄。下面这条访问策略规则,只允许你自己的账号通过 5555 端口访问带标签的手机:来源 6

{ "action": "accept", "src": ["you@example.com"], "dst": ["tag:phone:5555"] }

第二,在管理控制台中关闭这台手机的密钥过期,否则它会按期掉出你的网络,而你身在远方,无法把它重新加回来。第三,在 Android 设置中给 Tailscale 应用开启“不受限制”的电池使用。有用户反映,在激进的省电管理下,应用每隔几分钟就会被停止或断开,传输到一半掉线是通常出现的症状。来源 8

有两点限制值得了解。Tailscale 内置的 SSH 服务器在 Android 上无法运行,因为该功能在这个平台上只支持客户端,所以如果你需要不经 ADB 的 shell,请直接使用 ADB 端口,或者用下面的 SSH 隧道。来源 7 另外,不要为此使用 Tailscale Funnel。它的用途是把 Web 服务发布到公网,和你想做的事恰恰相反。

方法 B:经由自己服务器的 SSH 反向隧道

这种方法不需要任何第三方。你租一台最小规格的虚拟服务器,手机主动连出去并保持连接。你的电脑连到同一台服务器,经由它访问手机。因为是手机向外拨出连接,所以在 CGNAT 后和酒店 Wi-Fi 下都能用。

在手机上,在不需要 Root 的 Termux 中,安装 SSH 客户端并创建密钥:

pkg install openssh autossh
ssh-keygen -t ed25519

在服务器上创建一个专用用户,把手机的公钥加入它的 authorized_keys 文件,并加以限制,使这把密钥除了在回环接口上打开那一个监听端口之外,什么都做不了:

restrict,port-forwarding,permitlisten="127.0.0.1:15555" ssh-ed25519 AAAA... phone

然后在手机上保持隧道常开。下面的选项会在端口无法绑定时让连接明确报错,并避免它在网络断开后悄悄卡死:

ssh -N -R 127.0.0.1:15555:127.0.0.1:5555 \
  -o ServerAliveInterval=30 -o ServerAliveCountMax=3 \
  -o ExitOnForwardFailure=yes tunnel@your-server.example

autossh 可以监督并重启该命令,Termux:Boot 插件可以在重启后启动它,再用 termux-wake-lock 让 CPU 在隧道运行期间保持唤醒。也请把 Termux 的电池选项设为“不受限制”。这些环节取决于你的 Android 版本,以及厂商杀后台应用的激进程度,所以在依赖它之前,请在息屏状态下测试一个小时。

在你的电脑上,把本地端口转发到隧道,再通过它连接:

ssh -N -L 5556:127.0.0.1:15555 you@your-server.example
adb connect 127.0.0.1:5556

注意本地端口是 5556。你自己的 ADB 服务器往往已经占用了 5555,在这里冲突会产生让人摸不着头脑的报错。远程转发绑定在服务器的回环地址上,所以互联网上的任何设备都无法直接访问它;而且除非你改过 GatewayPorts,OpenSSH 对远程转发的默认设置本来就拒绝绑定公网接口。

服务器上请只用密钥登录,并保持该用户的密码登录处于禁用状态。把反向隧道放在允许密码登录、面向公网的 SSH 服务器上,并不比它所取代的端口转发安全多少。

方法 C:在自己的服务器上搭建 WireGuard

WireGuard 的效果和 Tailscale 相同,但每个环节都由你自己掌控。在有公网地址的服务器上运行 WireGuard 端点,把手机和电脑添加为对等节点,并在手机一侧设置 PersistentKeepalive = 25,让移动网络一直保持 NAT 映射。Android 版 WireGuard 应用不需要 Root,能在 Wi-Fi 和 LTE 之间漫游,还可以作为始终开启的 VPN 运行。之后,你从电脑连接手机的 WireGuard 地址的 5555 端口,和用 Tailscale 完全一样。如果你想要固定、长期的配置,而且不介意自己维护服务器,这是合适的选择。

关于一个常见的替代方案:Cloudflare Tunnel 有 SSH 方面的文档,但我们没有验证过它能否干净地承载原始 ADB 流量,所以这里不推荐。

要避免的配置:在路由器上转发 5555 端口

把外部 5555 端口,或者一个“巧妙的”自定义端口转发给手机,然后就算完事,这很诱人。别这么做。这会把未加密的 ADB 暴露在公网上,安全完全依赖一次密钥确认提示,而且会向专门扫描这种端口的扫描器宣告自己的存在。

这并非纸上谈兵。2020 年,Keysight 的研究人员分析 Trinity 僵尸网络时报告,Shodan 上能看到约 4 万台暴露的 ADB 设备,其中约四分之一是手机,恶意软件正是用 adb connect 本身连接它们。来源 9 另一个僵尸网络 Fbot 曾把 Trinity 从被感染的设备上清除,而 Trinity 数小时内就卷土重来。2021 年 2 月,基于 Mirai 代码的 Matryosh 僵尸网络也通过同一个端口传播。来源 10 更改外部端口号毫无意义,因为扫描器会探测每一个端口。

有些指南折中一下,改为转发 Termux 服务器的 SSH 端口。这比转发 ADB 好,但仍然会在你家的 IP 上发布一个 SSH 服务,而且把带密码登录的 Termux 留在互联网上很不明智。反向隧道或覆盖网络能达到同样的效果,而且完全不需要任何入站端口。

加固清单

只授权你实际使用的电脑,并撤销旧的授权。在开发者选项中,“Revoke USB debugging authorizations”会清除所有已保存的密钥,把手机交给别人之前这样做是个好习惯。不需要 ADB 调试的手机请保持关闭,并把你在第 1 步中打开的端口视为同一个决定的一部分。不要在共用或公共电脑上勾选“Always allow”。

已授权的 ADB 会话能看到 shell 用户能看到的一切,这已经很多了:已安装的应用、你有权读取的文件、屏幕和输入。仅限 Root:在已 Root 的手机上,如果 Root 管理器把权限授予 shell,adb shell su 能访问的范围要大得多,所以请把管理器设为对 shell 弹出确认,而不是静默放行。

仅限 Root:有些人会在手机上加一条防火墙规则,让 5555 端口只在 VPN 接口上响应。思路没有问题,但我们无法确认它在 Android 上是否可靠。系统的网络守护进程可能在网络变化时重新排列或清空规则,而且原版 Tailscale 应用不会为你创建可供匹配的 tailscale0 接口。如果你要尝试,请在开机脚本里重新应用该规则,并在没有接入 VPN 的设备上测试。

隧道后面的手机用起来比放在桌上的慢,解决办法通常是少要一点数据。用 scrcpy 做屏幕镜像时,降低分辨率和码率,例如 scrcpy -s 100.x.y.z:5555 -m 1280 -b 4M;不同版本的参数名略有差异,请查看 scrcpy --help。scrcpy 还可以用 --tcpip 替你开启 TCP 模式,其文档建议用完后断开连接。来源 11 Tailscale 直连比经过厂商服务器中转更快,应用里的连接状态会告诉你当前是哪一种。

连接了多台设备时,用 adb -s 100.x.y.z:5555 ... 告诉 ADB 你指的是哪一台,或者用 -d 指 USB 设备,用 -e 指模拟器。文件传输和 adb logcat 是最能容忍延迟的任务。

故障排查

现象通常意味着什么可以怎么试
unauthorized手机尚未批准这台电脑的密钥解锁手机并接受对话框,或者撤销授权后重试
offline连接已失效adb disconnect、adb kill-server,然后重新连接
failed to connect 或 connection refused没有监听、地址错误、VPN 已断开,或手机处于休眠先检查手机上的属性和监听端口,再检查 VPN 状态
more than one device/emulator多个目标使用 -s、-d 或 -e,或设置 ANDROID_SERIAL
能用十分钟,然后掉线Android 电源管理给 Tailscale 或 Termux 设置不受限制的电池使用,开启唤醒锁和保活选项
昨天还好好的,重启后就不行了端口设置丢失了没有 Root 时,再次通过 USB 运行 adb tcpip 5555。有 Root 时,设置 persist.adb.tcp.port 或使用开机脚本

有 Root 时,你可以在 Root shell 中运行 getprop service.adb.tcp.port 和 getprop persist.adb.tcp.port,查看手机实际在用什么。没有 Root 时,以从电脑运行 adb connect 的结果为准。如果手机同时在用无线调试,请记住它的随机 TLS 端口是单独保存的,所以无线连接能用,并不能说明固定端口正常。

常见问题

需要 Root 吗?不需要。没有 Root 时,只需通过 USB 开启一次 TCP ADB,然后完全按本文所述使用 Tailscale、反向隧道或 WireGuard。代价是该设置每次重启都会丢失,所以需要有人去重新接上数据线。Root 能省去这一步,并增加防火墙和 su 选项,本指南的其他内容都不依赖它。

能在移动数据下使用吗?可以,因为 Tailscale、WireGuard 和反向隧道都是从手机向外发起连接。路由器端口转发才是在这种情况下失效的方法。

可以一直开着吗?它的安全程度取决于保护它的那条通道。放在带访问策略的覆盖网络后面,暴露面很小。只在真正会用到时才开着,不用时就关掉。

没有密钥确认提示,别人能滥用吗?在正常的系统版本上,新电脑必须在手机上获得批准。在任何禁用了调试认证的系统版本上,对方无需批准就能连接,所以无论系统版本如何,都绝不要把该端口暴露到互联网上。

为什么不直接用远程桌面应用?如果只是操作屏幕,那样完全可以,而且屏幕共享应用根本不需要 Root。需要从远处执行 shell 命令、安装应用、传输文件或查看日志时,ADB 才是合适的工具。

投入使用前的检查

请在手机使用移动数据、电脑位于另一个网络的条件下测试所有功能。重启手机,看看哪些会自动恢复:已 Root 的手机应该会,未 Root 的手机你应当清楚地知道要重新做什么。再试一次息屏一段时间后的情况。如果这些测试中任何一项让你连不上手机,你就是在修复成本还很低的时候发现了问题。

如果你还在为这类项目挑选手机,想要一部可以 Root 的,我们的可 Root 手机目录会告诉你哪些机型能顺利解锁,Magisk 模块指南则介绍了仅限 Root 的开机脚本所涉及的模块部分。想要一个不依赖 Root 的 Linux shell,请看Android Linux Terminal 与 Termux 对比。

来源与范围

本指南于 2026 年 10 月进行资料研究,资料来自 Android 官方文档和源码,以及厂商和安全研究机构的公开资料。我们没有测试每个 Android 版本和 ROM。属性行为、开机脚本、手机端开启技巧、防火墙方法和 Termux 的电池行为会因设备而异,所以请先在自己的手机上逐项验证,再依赖它们。

  • 来源 1:Android Developers,Android Debug Bridge (adb) 查看来源
  • 来源 2:Android Open Source Project,ADB Wi-Fi 设计说明:旧版 TCP 未加密,Wi-Fi 模式使用 TLS 查看来源
  • 来源 3:Android Open Source Project,adbd main.cpp,根据属性选择端口 查看来源
  • 来源 4:Android Developers Blog,无线调试与 ADB Wi-Fi 2.0 查看来源
  • 来源 5:OmniROM,针对 adbd 属性的 SELinux 策略变更 查看来源
  • 来源 6:Tailscale,访问控制列表 查看来源
  • 来源 7:Tailscale,Tailscale SSH 平台支持 查看来源
  • 来源 8:Tailscale 社区论坛,Android 断连与电池使用 查看来源
  • 来源 9:Keysight,通过 ADB 传播的 TrinityP2P 恶意软件 查看来源
  • 来源 10:The Hacker News,Matryosh DDoS 僵尸网络,2021 年 2 月 查看来源
  • 来源 11:scrcpy 文档,Connection 查看来源