HarmonyOS鸿蒙Next中集成三方VPN openvpn3相关问题,请指教。

HarmonyOS鸿蒙Next中集成三方VPN openvpn3相关问题,请指教。 我把openvpn3集成到了我的应用中,真机上测试,鸿蒙日志打印了如下日志,可以发现服务端将tunIP、路由等信息推送了我的客户端,但现在有个问题是,以上配置是我通过在鸿蒙侧VpnConnection.create(config)方法中调用c++侧的连接连接openvpn的方法得到的服务端下发的配置。

08-01 11:19:21.310 9252-9534 A015B0/com.cxz...vpn/NetMgrVpn com.cxz.m...tion:vpn I vpn [vpn_client.cpp 314] OpenVPN: TLS Handshake: peer certificate: CN=server, 2048 bit RSA, cipher: TLS_AES_256_GCM_SHA384 TLSv1.3 Kx=any Au=any Enc=AESGCM(256) Mac=AEAD
08-01 11:19:21.310 9252-9534 A015B0/com.cxz...vpn/NetMgrVpn com.cxz.m...tion:vpn I vpn [vpn_client.cpp 314] OpenVPN: Session is ACTIVE
08-01 11:19:21.310 9252-9534 A015B0/com.cxz...vpn/NetMgrVpn com.cxz.m...tion:vpn I vpn [vpn_client.cpp 320] 事件: GET_CONFIG
08-01 11:19:21.310 9252-9534 A015B0/com.cxz...vpn/NetMgrVpn com.cxz.m...tion:vpn I vpn [vpn_client.cpp 331] 未处理的事件: GET_CONFIG
08-01 11:19:21.310 9252-9534 A015B0/com.cxz...vpn/NetMgrVpn com.cxz.m...tion:vpn I vpn [vpn_client.cpp 314] OpenVPN: Sending PUSH_REQUEST to server...
08-01 11:19:21.316 9252-9534 A015B0/com.cxz...vpn/NetMgrVpn com.cxz.m...tion:vpn I vpn [vpn_client.cpp 314] OpenVPN: OPTIONS:
                                                                                           0 [route] [172.21.21.0] [255.255.255.0]
                                                                                           1 [route] [10.8.0.1]
                                                                                           2 [topology] [net30]
                                                                                           3 [ping] [10]
                                                                                           4 [ping-restart] [120]
                                                                                           5 [ifconfig] [10.8.0.6] [10.8.0.5]
                                                                                           6 [peer-id] [1]
                                                                                           7 [cipher] [AES-256-GCM]
08-01 11:19:21.316 9252-9534 A015B0/com.cxz...vpn/NetMgrVpn com.cxz.m...tion:vpn I vpn [vpn_client.cpp 314] OpenVPN: PROTOCOL OPTIONS:
                                                                                             key-derivation: OpenVPN PRF
                                                                                             control channel: tls-auth enabled
                                                                                             data channel: cipher AES-256-GCM, peer-id 1
08-01 11:19:21.316 9252-9534 A015B0/com.cxz...vpn/NetMgrVpn com.cxz.m...tion:vpn I vpn [vpn_client.cpp 314] OpenVPN: Connected via TUN_NULL
08-01 11:19:21.317 7539-7562 C02D13/hdcd/HDC_LOG hdcd W [BeginRemoveTask:111] BeginRemoveTask taskType:0 channelId:982008757
08-01 11:19:21.317 9252-9534 A015B0/com.cxz...vpn/NetMgrVpn com.cxz.m...tion:vpn I vpn [vpn_client.cpp 320] 事件: CONNECTED
08-01 11:19:21.317 9252-9534 A015B0/com.cxz...vpn/NetMgrVpn com.cxz.m...tion:vpn I vpn [vpn_client.cpp 467] VPN已连接

我的问题是:

我觉得正确的流程是不是应该是客户端c++侧接收来自服务端推送的配置,然后绑定到arkts侧的VpnConfig对象上?还是说客户端不需要接收来自服务端下发的配置,直接自定义VpnConfig对象?


更多关于HarmonyOS鸿蒙Next中集成三方VPN openvpn3相关问题,请指教。的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

楼主试试这个办法

1 服务端:

// C++侧解析服务端下发的配置参数

std::string tunIp = parse_server_push("ifconfig");

std::vector<Route> routes = parse_server_push("route");

std::vector<std::string> dns = parse_server_push("dns");

2 鸿蒙端:

// 动态生成VpnConfig

let vpnConfig: vpnExtension.VpnConfig = {

  addresses: [{
    address: { address: tunIp, family: 1 },
    prefixLength: 24
  }],

  routes: routes.map(route => ({
    interface: 'vpn-tun',
    destination: {
      address: { address: route.dest, family: 1 },
      prefixLength: route.prefix
    }
  })),

  mtu: 1400,

  dnsAddresses: dns,

  blockedApplications: ['com.example.blockapp']
};
// 通过VpnConnection应用动态配置

let vpnConnection = vpnExtension.createVpnConnection(context);

vpnConnection.create(vpnConfig).then(() => {
  console.info("VPN configuration applied successfully");
});

更多关于HarmonyOS鸿蒙Next中集成三方VPN openvpn3相关问题,请指教。的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


有没有集成过openvpn3的老师,帮忙解决我的疑问

在HarmonyOS Next中集成OpenVPN3,需使用鸿蒙NDK开发。OpenVPN3的C++核心代码需通过鸿蒙的Native API进行适配。关键点包括:1) 使用鸿蒙的NetManager接口处理网络连接;2) 通过鸿蒙安全子系统管理证书和密钥;3) 调用POSIX兼容层实现套接字通信。注意鸿蒙的权限管理系统需配置VPN相关权限。现有OpenVPN3代码需修改TUN驱动接口部分以兼容鸿蒙内核。

从日志看,OpenVPN3客户端已成功连接并获取了服务端下发的配置(如路由10.8.0.1/24、TUN IP 10.8.0.6等)。在HarmonyOS Next中集成时,建议采用以下方式:

  1. 服务端下发的配置需要通过ArkTS侧的VpnConfig对象进行设置。日志显示当前GET_CONFIG事件未被处理(vpn_client.cpp 331行),这正是关键问题所在。

  2. 正确流程应该是:

  • C++层通过回调将服务端下发的配置参数(ifconfig、route等)传递给ArkTS层
  • ArkTS层用这些参数构建VpnConfig对象
  • 调用VpnConnection.create(config)应用这些配置
  1. 不能直接自定义VpnConfig对象,必须使用服务端下发的真实配置,否则会导致路由不匹配或隧道无法正常工作。

需要检查:

  1. 是否实现了从C++到ArkTS的配置传递回调
  2. GET_CONFIG事件的处理逻辑是否完整
  3. VpnConfig对象是否包含了服务端下发的所有必要参数(特别是ifconfig和route)

日志显示隧道已建立但配置未应用,这正是因为GET_CONFIG事件未处理导致服务端配置未被应用到系统VPN接口。

回到顶部