HarmonyOS鸿蒙Next中APP集成VPN的sdk后访问没进VPN
HarmonyOS鸿蒙Next中APP集成VPN的sdk后访问没进VPN 我们 APP 集成了天融信 VPN SDK,启动 APP 后会自动连接 VPN,再访问内网接口。 目前遇到个问题:APP 本身网络并未走 VPN,但手机系统浏览器却能正常访问内网。
查询相关资料得知系统机制差异:
1.鸿蒙系统:发起 VPN 的应用默认会被系统绕过,需手动授权自身走 VPN 网络;
2.安卓系统:发起 VPN 的应用默认走 VPN,但必须调用 protect() 保护隧道 Socket,若加入白名单排除才会绕过。
检查后发现,当前使用的天融信 VPN SDK 并未实现 addAllowedApplication 相关接口,没法添加应用白名单。想请教下各位大佬,问题是不是出在这里?
这是让ai帮我进行排查的:

更多关于HarmonyOS鸿蒙Next中APP集成VPN的sdk后访问没进VPN的实战教程也可以访问 https://www.itying.com/category-93-b0.html
从你贴出来的信息看,问题大概率就是 VPN SDK 没有把当前 App 加入 VPN 路由范围,或者 SDK 主动把自身流量绕开了 VPN。
而且从截图里的关键日志,其实已经很明显了:
VPN 已连接:是
getDefaultNet netId: 100 (非VPN)
检测到 VPN netId: 135
已绑定 VPN:否
getAppNet netId: 0
默认网络是否 VPN:否
这里最关键的是:
默认网络 netId = 100
VPN netId = 135
当前 App 没绑定到 135
说明:
你的 App 请求时
实际走的是默认网络
不是 VPN 网络
所以最终:
Operation timeout
完全符合现象。
先说一个容易混淆的点
你提到:
浏览器能访问内网
APP 不行
这个其实已经说明:
VPN隧道本身是正常的
否则浏览器也访问不了。
所以:
VPN连接成功
VPN路由成功
VPN服务端正常
基本都成立。
问题集中在:
APP流量没进VPN
是否是 addAllowedApplication 导致?
不一定。
这里很多人会把 Android 机制套进 HarmonyOS。
Android:
builder.addAllowedApplication()
builder.addDisallowedApplication()
控制:
哪些APP走VPN
哪些APP不走VPN
但 HarmonyOS NEXT 的 VPN Extension 机制并不完全一样。
目前公开 API 里:
vpnExtension.createVpnConnection()
有:
- addAddress
- addRoute
- setUp
等能力。
但没有公开版:
addAllowedApplication()
接口。
所以:
天融信SDK没实现 addAllowedApplication
未必是根因。
因为鸿蒙公开 API 本身就没有 Android 那套完整能力。
我反而更怀疑这个
从截图看:
TopSec 未将本包加入 VPN trustedApplications
以及:
SDK中 addAllowedApplication
authorizationVPNToForwardingData
均为 Method not implemented
这里已经暴露问题了。
说明:
SDK内部本来预留了
“允许应用走VPN”
能力
但:
鸿蒙版本没实现
导致:
VPN建立成功
浏览器正常
SDK发起方APP反而没进VPN
HarmonyOS 的特殊点
HarmonyOS VPN Extension 有个行为:
很多 VPN 产品都会主动保护自己的隧道连接。
类似 Android 的:
VpnService.protect(socket)
作用:
VPN隧道自身流量
不要再次进入VPN
否则:
死循环
问题来了:
如果 SDK 实现有问题:
可能变成:
整个 APP 的流量
都被 protect
而不是:
只有 VPN 隧道 socket
被 protect
这样结果就是:
浏览器能访问内网
APP访问不了
与你现象完全一致。
从日志还能看出一个关键问题
截图里:
ENABLE_SET_APP_NET = 关闭
USE_PAGE_SCOPED_VPN_BIND = 关闭
说明:
App没有显式绑定VPN网络
很多鸿蒙 VPN SDK 实际上需要:
connection.setAppNet()
或者:
bindSocket()
或者:
setNetHandle()
类似能力。
否则:
VPN存在
≠
APP自动走VPN
你现在最应该验证的东西
让开发同学打印:
netConn.getDefaultNet()
以及:
httpRequest.request()
前:
getConnectionProperties()
查看:
当前请求到底走哪个 netId
如果看到:
100
而 VPN:
135
那就坐实:
请求没进VPN
怎么快速验证是不是 SDK 问题
最简单:
VPN连接后:
浏览器访问内网
成功
然后:
同一个域名
curl请求
或者:
@ohos.net.http
最简单Demo
请求。
如果:
Demo正常
而:
业务APP不正常
说明:
天融信SDK
处理路由时有问题
结合你截图里的 AI 排查结果
我基本认同最后那句:
请联系天融信提供支持鸿蒙
trustedApplications
的SDK
因为日志已经显示:
addAllowedApplication
Method not implemented
这说明:
Android版有实现
HarmonyOS版没实现
或者:
只是空实现
我的判断:
VPN本身是通的,问题不在 VPN 服务端。当前更像是天融信 HarmonyOS SDK 没有完成“自身应用走 VPN”的绑定逻辑,导致浏览器能走 VPN,但发起 VPN 的 APP 仍走默认网络(netId=100)。重点排查 SDK 是否实现了 AppNet 绑定、trustedApplications、VPN Forwarding 相关逻辑,而不是权限问题。
更多关于HarmonyOS鸿蒙Next中APP集成VPN的sdk后访问没进VPN的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
你这个现象通常不是“VPN 没连上”,而是当前 App 的网络没有被绑定到 VPN 网络,或者 VPN SDK 按规则把发起 VPN 的应用自身流量排除了。
建议从三点查:
-
VPN 建立后拿到 VPN 对应的 netId,再确认 App 发请求前是否 bind 到该网络;不要只看 getDefaultNet。
-
检查 SDK 是否有 include/exclude 应用、allowBypass、protect socket 之类配置。Android 和 HarmonyOS 在发起方是否默认走 VPN 上可能有差异,不能照搬旧逻辑。
-
在发内网请求前打印当前请求使用的 network/netId,并和浏览器能访问时的 netId 对比。
-
如果 SDK 支持“将自身也纳入 VPN 路由”,需要显式开启;否则浏览器走 VPN、当前 App 不走 VPN 是可能出现的。
不要把内网地址、账号或完整抓包贴到公开帖,贴脱敏后的 netId、路由策略和 SDK 配置项即可。
您好,这需要三方SDK将宿主App纳入VPN的接口,只能让SDK厂商补齐能力或者让内网可以在独立进程或独立应用方案进行验证
尊敬的开发者,您好,建议您直接联系三方SDK,通过其官方渠道进行沟通。
补充一个排查角度:宿主 App 的请求是否进入 VPN,关键看 SDK 建隧道时把哪些应用和路由纳入代理。不要只在业务 HTTP 层排查,因为请求一旦被系统按“直连/代理名单”分流,代码里换域名或换 fetch 方式都无效。
建议让厂商确认三件事:1. VPN 配置里的应用白名单是否包含当前包名;2. 是否存在排除名单把当前包名排掉;3. 内网网段和 DNS 是否已写入路由配置。还要注意,VPN 自己连接服务器的链路通常要直连,真正走隧道的是业务内网流量。
验证上可以用最小 demo:只保留一个内网接口请求,打开 SDK 日志,同时在网关侧看源地址。如果浏览器能进、宿主 App 不进,基本就说明 SDK 的应用名单或路由范围没有覆盖宿主 App。参考来源:HarmonyOS VPN Extension / VpnConfig 能力说明。
你这个判断方向是对的:VPN 发起应用自身是否走 VPN,通常由 VPN 实现侧的路由/白名单/保护隧道策略决定,不是普通 HTTP 请求层能解决的。
建议先确认三点:
-
天融信 SDK 在 HarmonyOS 上是否支持“发起 VPN 的本应用也进入 VPN 隧道”,以及是否有等价的 allowed/disallowed application 配置。
-
VPN 隧道自身用于建连的 socket 必须走外网直连,业务内网请求才走隧道;如果 SDK 把整个宿主应用默认排除了,就会出现系统浏览器可访问、宿主 App 不走 VPN 的现象。
-
抓包或在内网网关侧看源地址,确认宿主 App 请求到底是直连外网还是进入隧道。
如果 SDK 没提供把宿主应用纳入 VPN 的接口,只能让 SDK 厂商补能力,或把内网访问放到被 VPN 覆盖的独立进程/独立应用方案里验证。
鸿蒙Next中集成VPN SDK后访问未走VPN,可能原因:VPN配置未正确设置路由规则或排除列表;APP未使用VPN提供的虚拟网络接口(需调用VpnConnection绑定Network);系统限制后台应用或低版本API无法强制路由。请检查VpnConnection.Builder的addRoute是否涵盖目标地址,以及setBlocking是否生效。
是的,问题根源正在于此。
鸿蒙 Next 系统为确保 VPN 隧道不出现死循环,默认会绕过发起 VPN 应用自身的流量,必须通过 addAllowedApplication 或 setAllowedApplications 接口把自身包名加入白名单,流量才会走 VPN。
您使用的天融信 VPN SDK 没有实现这一接口,导致 APP 本身访问内网时被系统绕过,而浏览器等非发起方应用则正常走隧道。
因此需要让 SDK 适配鸿蒙的这一机制,或由您侧在 VPN 连接建立后主动调用接口把当前应用包名加入允许列表。

