• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# @ohos.net.vpnExtension (VPN 增强管理)
2
3三方VPN管理模块,支持三方VPN的启动和停止功能。三方VPN是指由第三方提供的VPN服务,它们通常提供更多的功能和更广泛的网络连接选项,包括更多的安全和隐私功能,以及更全面的定制选项。
4
5> **说明:**
6> 本模块首批接口从 API version 11 开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。
7
8## 导入模块
9
10```js
11import { vpnExtension } from '@kit.NetworkKit';
12```
13
14## LinkAddress<sup>11+</sup>
15type LinkAddress = connection.LinkAddress
16
17获取网络链接信息。
18
19**系统能力**:SystemCapability.Communication.NetManager.Core
20
21| 类型   | 说明                                                         |
22| ------ | ------------------------------------------------------------ |
23| [connection.LinkAddress](./js-apis-net-connection.md#linkaddress) | 网络链路信息 |
24
25## RouteInfo<sup>11+</sup>
26type RouteInfo = connection.RouteInfo
27
28获取网络路由信息。
29
30**系统能力**:SystemCapability.Communication.NetManager.Core
31
32| 类型   | 说明                                                         |
33| ------ | ------------------------------------------------------------ |
34| [connection.RouteInfo](./js-apis-net-connection.md#routeinfo) | 网络路由信息 |
35
36## VpnExtensionContext<sup>11+</sup>
37type VpnExtensionContext = _VpnExtensionContext
38
39vpn扩展的上下文。它允许访问serviceExtension特定资源。
40
41**系统能力**:SystemCapability.Ability.AbilityRuntime.Core
42
43| 类型   | 说明                                                         |
44| ------ | ------------------------------------------------------------ |
45| [_VpnExtensionContext](./js-apis-inner-application-VpnExtensionContext.md) | vpn扩展的上下文 |
46
47## vpnExtension.startVpnExtensionAbility
48
49startVpnExtensionAbility(want: Want): Promise\<void>
50
51启动新的三方vpn功能。
52
53**系统能力**:SystemCapability.Ability.AbilityRuntime.Core
54
55**模型约束**:此接口仅可在Stage模型下使用。
56
57**参数:**
58
59| 参数名 | 类型                                | 必填 | 说明               |
60| ------ | ----------------------------------- | ---- | ------------------ |
61| want   | [Want](../apis-ability-kit/js-apis-app-ability-want.md) | 是   | 指示要启动的信息。 |
62
63**返回值:**
64
65| 类型           | 说明                    |
66| -------------- | ----------------------- |
67| Promise\<void> | 无返回值的Promise对象。 |
68
69**错误码:**
70
71| 错误码 ID | 错误信息                               |
72| --------- | -------------------------------------- |
73| 401       | If the input parameter is not valid parameter.|
74| 16000001  | The specified ability does not exist.  |
75| 16000002  | Incorrect ability type.                |
76| 16000006  | Cross-user operations are not allowed. |
77| 16000008  | The crowdtesting application expires.  |
78| 16000011  | The context does not exist.            |
79| 16000050  | Internal error.                        |
80| 16200001  | The caller has been released.          |
81
82**示例:**
83Stage 模型示例:
84
85```ts
86import { common, Want } from '@kit.AbilityKit';
87import { vpnExtension } from '@kit.NetworkKit';
88
89let want: Want = {
90  deviceId: "",
91  bundleName: "com.example.myvpndemo",
92  abilityName: "MyVpnExtAbility",
93};
94
95@Entry
96@Component
97struct Index {
98  @State message: string = 'Hello World'
99
100  build() {
101    Row() {
102      Column() {
103        Text(this.message)
104          .fontSize(50)
105          .fontWeight(FontWeight.Bold).onClick(() => {
106          console.info("btn click") })
107        Button('Start Extension').onClick(() => {
108          vpnExtension.startVpnExtensionAbility(want);
109        }).width('70%').fontSize(45).margin(16)
110        }.width('100%')
111    }.height('100%')
112  }
113}
114```
115
116## vpnExtension.stopVpnExtensionAbility
117
118stopVpnExtensionAbility(want: Want): Promise\<void>
119
120停止同一应用程序中的服务。
121
122**系统能力**:SystemCapability.Ability.AbilityRuntime.Core
123
124**模型约束**:此接口仅可在Stage模型下使用。
125
126**参数:**
127
128| 参数名 | 类型                                | 必填 | 说明             |
129| ------ | ----------------------------------- | ---- | ---------------- |
130| want   | [Want](../apis-ability-kit/js-apis-app-ability-want.md) | 是   | 指示要启动的信息 |
131
132**返回值:**
133
134| 类型           | 说明                    |
135| -------------- | ----------------------- |
136| Promise\<void> | 无返回值的Promise对象。 |
137
138**错误码:**
139
140| 错误码 ID | 错误信息                               |
141| --------- | -------------------------------------- |
142| 401       | If the input parameter is not valid parameter.|
143| 16000001  | The specified ability does not exist.  |
144| 16000002  | Incorrect ability type.                |
145| 16000006  | Cross-user operations are not allowed. |
146| 16000011  | The context does not exist.            |
147| 16000050  | Internal error.                        |
148| 16200001  | The caller has been released.          |
149
150**示例:**
151Stage 模型示例:
152
153```ts
154import { common, Want } from '@kit.AbilityKit';
155import { vpnExtension } from '@kit.NetworkKit';
156
157let want: Want = {
158  deviceId: "",
159  bundleName: "com.example.myvpndemo",
160  abilityName: "MyVpnExtAbility",
161};
162
163@Entry
164@Component
165struct Index {
166  @State message: string = 'Hello World'
167
168  build() {
169    Row() {
170      Column() {
171        Text(this.message)
172          .fontSize(50)
173          .fontWeight(FontWeight.Bold).onClick(() => {
174          console.info("btn click") })
175        Button('Start Extension').onClick(() => {
176          vpnExtension.startVpnExtensionAbility(want);
177        }).width('70%').fontSize(45).margin(16)
178        Button('Stop Extension').onClick(() => {
179          console.info("btn end")
180          vpnExtension.stopVpnExtensionAbility(want);
181        }).width('70%').fontSize(45).margin(16)
182
183        }.width('100%')
184    }.height('100%')
185  }
186}
187```
188
189## vpnExtension.createVpnConnection
190
191createVpnConnection(context: VpnExtensionContext): VpnConnection
192
193创建一个 三方VPN 连接对象。
194
195> **说明:**
196>
197> 调用createVpnConnection接口前,需要先调用startVpnExtensionAbility接口启用vpn功能。
198
199**系统能力**:SystemCapability.Communication.NetManager.Vpn
200
201**模型约束**:此接口仅可在Stage模型下使用。
202
203**参数:**
204
205| 参数名  | 类型                                                         | 必填 | 说明           |
206| ------- | ------------------------------------------------------------ | ---- | -------------- |
207| context | [VpnExtensionContext](js-apis-inner-application-VpnExtensionContext.md) | 是   | 指定 context。 |
208
209**返回值:**
210
211| 类型                            | 说明                    |
212| :------------------------------ | :---------------------- |
213| [VpnConnection](#vpnconnection) | 返回一个 VPN 连接对象。 |
214
215**错误码:**
216
217| 错误码 ID | 错误信息         |
218| --------- | ---------------- |
219| 401       | Parameter error. |
220
221**示例:**
222Stage 模型示例:
223
224```ts
225import { vpnExtension, VpnExtensionAbility } from '@kit.NetworkKit';
226import { common, Want } from '@kit.AbilityKit';
227
228let context: vpnExtension.VpnExtensionContext;
229export default class MyVpnExtAbility extends VpnExtensionAbility {
230  onCreate(want: Want) {
231    let VpnConnection : vpnExtension.VpnConnection = vpnExtension.createVpnConnection(context);
232    console.info("vpn createVpnConnection: " + JSON.stringify(VpnConnection));
233  }
234}
235```
236
237## VpnConnection
238
239VPN 连接对象。在调用 VpnConnection 的方法前,需要先通过vpnExt.createVpnConnection创建 VPN 连接对象。
240
241### create
242
243create(config: VpnConfig): Promise\<number\>
244
245使用 config 创建一个 vpn 网络,使用 Promise 方式作为异步方法。
246
247**系统能力**:SystemCapability.Communication.NetManager.Vpn
248
249**参数:**
250
251| 参数名 | 类型                    | 必填 | 说明                      |
252| ------ | ----------------------- | ---- | ------------------------- |
253| config | [VpnConfig](#vpnconfig) | 是   | 指定 VPN 网络的配置信息。 |
254
255**返回值:**
256
257| 类型              | 说明                                                           |
258| ----------------- | -------------------------------------------------------------- |
259| Promise\<number\> | 以 Promise 形式返回获取结果,返回指定虚拟网卡的文件描述符 fd。 |
260
261**错误码:**
262
263| 错误码 ID | 错误信息                                         |
264| --------- | ------------------------------------------------ |
265| 401       | Parameter error.                                 |
266| 2200001   | Invalid parameter value.                         |
267| 2200002   | Operation failed. Cannot connect to service.     |
268| 2200003   | System internal error.                           |
269| 2203001   | VPN creation denied, please check the user type. |
270| 2203002   | VPN exist already, please execute destroy first. |
271
272**示例:**
273
274```js
275import { vpnExtension, VpnExtensionAbility } from '@kit.NetworkKit';
276import { common, Want } from '@kit.AbilityKit';
277import { hilog } from '@kit.PerformanceAnalysisKit';
278
279let context: vpnExtension.VpnExtensionContext;
280export default class MyVpnExtAbility extends VpnExtensionAbility {
281  private tunIp: string = '10.0.0.5';
282  private blockedAppName: string = 'com.example.myvpndemo';
283  onCreate(want: Want) {
284    let VpnConnection : vpnExtension.VpnConnection = vpnExtension.createVpnConnection(context);
285    console.info("vpn createVpnConnection: " + JSON.stringify(VpnConnection));
286    this.SetupVpn();
287  }
288  SetupVpn() {
289        class Address {
290            address: string;
291            family: number;
292
293            constructor(address: string, family: number) {
294                this.address = address;
295                this.family = family;
296            }
297        }
298
299        class AddressWithPrefix {
300            address: Address;
301            prefixLength: number;
302
303            constructor(address: Address, prefixLength: number) {
304                this.address = address;
305                this.prefixLength = prefixLength;
306            }
307        }
308
309        class Config {
310            addresses: AddressWithPrefix[];
311            mtu: number;
312            dnsAddresses: string[];
313            trustedApplications: string[];
314            blockedApplications: string[];
315
316            constructor(
317                tunIp: string,
318                blockedAppName: string
319            ) {
320                this.addresses = [
321                    new AddressWithPrefix(new Address(tunIp, 1), 24)
322                ];
323                this.mtu = 1400;
324                this.dnsAddresses = ["114.114.114.114"];
325                this.trustedApplications = [];
326                this.blockedApplications = [blockedAppName];
327            }
328        }
329
330        let config = new Config(this.tunIp, this.blockedAppName);
331
332        try {
333            let VpnConnection : vpnExtension.VpnConnection = vpnExtension.createVpnConnection(context);
334            VpnConnection.create(config).then((data) => {
335                hilog.error(0x0000, 'developTag', 'tunfd: %{public}s', JSON.stringify(data) ?? '');
336            })
337        } catch (error) {
338            hilog.error(0x0000, 'developTag', 'vpn setUp fail: %{public}s', JSON.stringify(error) ?? '');
339        }
340    }
341}
342```
343
344### protect
345
346protect(socketFd: number): Promise\<void\>
347
348保护套接字不受 VPN 连接影响,通过该套接字发送的数据将直接基于物理网络收发,因此其流量不会通过 VPN 转发,使用 Promise 方式作为异步方法。
349
350**系统能力**:SystemCapability.Communication.NetManager.Vpn
351
352**参数:**
353
354| 参数名   | 类型   | 必填 | 说明                                                                                        |
355| -------- | ------ | ---- | ------------------------------------------------------------------------------------------- |
356| socketFd | number | 是   | 指定保护的 socketfd,该文件描述符通过[getSocketFd](js-apis-socket.md#getsocketfd10-1)获取。 |
357
358**返回值:**
359
360| 类型            | 说明                                                  |
361| --------------- | ----------------------------------------------------- |
362| Promise\<void\> | 以 Promise 形式返回设定结果,失败返回错误码错误信息。 |
363
364**错误码:**
365
366| 错误码 ID | 错误信息                                     |
367| --------- | -------------------------------------------- |
368| 401       | Parameter error.                             |
369| 2200001   | Invalid parameter value.                     |
370| 2200002   | Operation failed. Cannot connect to service. |
371| 2200003   | System internal error.                       |
372| 2203004   | Invalid socket file descriptor.              |
373
374**示例:**
375
376```js
377import { vpnExtension, VpnExtensionAbility } from '@kit.NetworkKit';
378import { common, Want } from '@kit.AbilityKit';
379import { hilog } from '@kit.PerformanceAnalysisKit';
380
381let g_tunnelFd = -1;
382let context: vpnExtension.VpnExtensionContext;
383export default class MyVpnExtAbility extends VpnExtensionAbility {
384  private vpnServerIp: string = '192.168.31.13';
385  onCreate(want: Want) {
386    let VpnConnection : vpnExtension.VpnConnection = vpnExtension.createVpnConnection(context);
387    console.info("vpn createVpnConnection: " + JSON.stringify(VpnConnection));
388    this.CreateTunnel();
389    this.Protect();
390  }
391  CreateTunnel() {
392      g_tunnelFd = 8888;
393  }
394  Protect() {
395        hilog.info(0x0000, 'developTag', '%{public}s', 'vpn Protect');
396        let VpnConnection : vpnExtension.VpnConnection = vpnExtension.createVpnConnection(context);
397        VpnConnection.protect(g_tunnelFd).then(() => {
398            hilog.info(0x0000, 'developTag', '%{public}s', 'vpn Protect Success');
399        }).catch((err : Error) => {
400            hilog.error(0x0000, 'developTag', 'vpn Protect Failed %{public}s', JSON.stringify(err) ?? '');
401        })
402  }
403}
404```
405
406### destroy
407
408destroy(): Promise\<void\>
409
410销毁启动的 VPN 网络,使用 Promise 方式作为异步方法。
411
412**系统能力**:SystemCapability.Communication.NetManager.Vpn
413
414**返回值:**
415
416| 类型            | 说明                                                  |
417| --------------- | ----------------------------------------------------- |
418| Promise\<void\> | 以 Promise 形式返回设定结果,失败返回错误码错误信息。 |
419
420**错误码:**
421
422| 错误码 ID | 错误信息                                     |
423| --------- | -------------------------------------------- |
424| 401       | Parameter error.                             |
425| 2200002   | Operation failed. Cannot connect to service. |
426| 2200003   | System internal error.                       |
427
428**示例:**
429
430```js
431import { vpnExtension, VpnExtensionAbility } from '@kit.NetworkKit';
432import { common, Want } from '@kit.AbilityKit';
433import { BusinessError } from '@kit.BasicServicesKit';
434
435let context: vpnExtension.VpnExtensionContext;
436export default class MyVpnExtAbility extends VpnExtensionAbility {
437  onCreate(want: Want) {
438    let VpnConnection : vpnExtension.VpnConnection = vpnExtension.createVpnConnection(context);
439    console.info("vpn createVpnConnection: " + JSON.stringify(VpnConnection));
440    VpnConnection.destroy().then(() => {
441      console.info("destroy success.");
442    }).catch((error : BusinessError) => {
443      console.error("destroy fail" + JSON.stringify(error));
444    });
445  }
446}
447```
448
449## VpnConfig
450
451三方VPN配置参数。
452
453**系统能力**:SystemCapability.Communication.NetManager.Vpn
454
455| 名称                | 类型                                                           | 必填 | 说明                                |
456| ------------------- | -------------------------------------------------------------- | ---- | ----------------------------------- |
457| addresses           | Array\<[LinkAddress](js-apis-net-connection.md#linkaddress)\> | 是   | VPN 虚拟网卡的 IP 地址。            |
458| routes              | Array\<[RouteInfo](js-apis-net-connection.md#routeinfo)\>     | 否   | VPN 虚拟网卡的路由信息(目前最多可配置1024条路由)。            |
459| dnsAddresses        | Array\<string\>                                                | 否   | DNS 服务器地址信息。                |
460| searchDomains       | Array\<string\>                                                | 否   | DNS 的搜索域列表。                  |
461| mtu                 | number                                                         | 否   | 最大传输单元 MTU 值(单位:字节)。取值范围:576-1500。     |
462| isIPv4Accepted      | boolean                                                        | 否   | 是否支持 IPV4, 默认值为 true。true:支持 IPV4;false:不支持 IPV4。    |
463| isIPv6Accepted      | boolean                                                        | 否   | 是否支持 IPV6, 默认值为 false。true:支持 IPV6;false:不支持 IPV6。     |
464| isInternal          | boolean                                                        | 否   | 是否支持内置 VPN, 默认值为 false。true:支持内置 VPN;false:不支持内置 VPN。   |
465| isBlocking          | boolean                                                        | 否   | 是否阻塞模式, 默认值为 false。true:阻塞模式;false:非阻塞模式。       |
466| trustedApplications | Array\<string\>                                                | 否   | 白名单信息, string 类型表示的包名。  |
467| blockedApplications | Array\<string\>                                                | 否   | 黑名单信息, string 类型表示的包名。  |
468
469**示例:**
470
471```js
472import { vpnExtension} from '@kit.NetworkKit';
473
474let vpnConfig: vpnExtension.VpnConfig = {
475  addresses: [],
476  routes: [{
477    interface: "eth0",
478    destination: {
479      address: {
480        address:'',
481        family:1,
482        port:8080
483      },
484      prefixLength:1
485    },
486    gateway: {
487      address:'',
488      family:1,
489      port:8080
490    },
491    hasGateway: true,
492    isDefaultRoute: true,
493  }],
494  mtu: 1400,
495  dnsAddresses: ["223.5.5.5", "223.6.6.6"],
496  trustedApplications: [],
497  blockedApplications: [],
498}
499let context: vpnExtension.VpnExtensionContext;
500
501function vpnCreate(){
502  let VpnConnection: vpnExtension.VpnConnection = vpnExtension.createVpnConnection(context);
503  VpnConnection.create(vpnConfig).then((data) => {
504    console.info("vpn create " + JSON.stringify(data));
505  })
506}
507```