• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 使用网络防火墙
2<!--Kit: Network Kit-->
3<!--Subsystem: Communication-->
4<!--Owner: @wmyao_mm-->
5<!--Designer: @guo-min_net-->
6<!--Tester: @tongxilin-->
7<!--Adviser: @zhang_yixin13-->
8
9## 简介
10
11网络防火墙提供如下功能:
12- 防火墙的基础能力,包括防火墙的使能、规则的启用与禁用、审计能力。
13- 防火墙规则的配置能力,包括规则的名称、描述、操作、生效应用、协议类型、地址、端口、出站/入站方向等。
14- DNS策略的配置能力,包括配置禁止/允许解析的域名、解析使用的DNS服务器(主选/备选)(应用级)。
15
16> **说明:**
17> 为了保证应用的运行效率,所有API调用都是异步的,对于异步调用的API均提供了Promise的方式,以下示例均采用Promise方式,更多方式可以查阅[API参考](../reference/apis-network-kit/js-apis-net-netfirewall.md)。
18
19## 场景介绍
20
21防火墙的典型场景有:
22- 针对特定IP联网访问控制
231. 支持限制特定应用访问网络。
242. 支持限制对特定IP、特定协议、特定端口的网络通信。
253. 支持限制特定应用对特定IP、特定协议、特定端口的网络通信。
264. 支持拦截规则下发后立即生效(此点针对TCP协议:需断开已有被拦截的TCP连接)。
27- 针对域名联网访问控制支持拦截
281. 支持限制应用对特定域名的DNS解析能力(仅限制非加密标准DNS协议,不限制加密、私有DNS协议)。
292. 支持限制特定应用对特定域名的DNS解析能力(仅限制非加密标准DNS协议,不限制加密、私有DNS协议)。
303. 支持拦截规则下发后立即生效(此点针对TCP协议:需断开已有被拦截的TCP连接)。
31<!--Del-->
32- 联网访问控制支持可追溯
331. 支持拦截记录追溯,支持对系统应用提供查询拦截记录的能力。
342. 支持所有拦截规则的自动保存和开机自动恢复。
35<!--DelEnd-->
36
37以下分别介绍具体开发方式。
38
39## 针对特定IP联网访问控制
40
411. 设备通过硬件接口,插入网线。
422. 从@kit.NetworkKit中导入netfirewall命名空间。
43
44    ```ts
45    // 从@kit.NetworkKit中导入netFirewall命名空间。
46    import { netFirewall } from '@kit.NetworkKit';
47    import { BusinessError } from '@kit.BasicServicesKit';
48    ```
49
503. 用户调用setNetFirewallPolicy方法,打开防火墙。
51
52    ```ts
53    interface IpType{
54          family:number;
55          type:number;
56          address?:string;
57          mask?:number;
58          startIp?:string;
59          endIp?:string;
60    }
61    interface IpPort{
62        startPort:number;
63        endPort:number;
64    }
65
66    // 定义防火墙策略:打开,入站阻止,出站允许。
67    let policy: netFirewall.NetFirewallPolicy = {
68      isOpen: true,
69      inAction: netFirewall.FirewallRuleAction.RULE_DENY,
70      outAction: netFirewall.FirewallRuleAction.RULE_ALLOW
71    };
72    // 给用户100设置防火墙策略。
73    netFirewall.setNetFirewallPolicy(100, policy).then(() => {
74      console.info("set firewall policy success.");
75    }).catch((error : BusinessError) => {
76      console.error("set firewall policy failed: " + JSON.stringify(error));
77    });
78    ```
79
804. 用户通过addNetFirewallRule方法,添加防火墙规则。
81
82    ```ts
83    // 初始化具体的防火墙ip类型规则。
84    let ipRule: netFirewall.NetFirewallRule = {
85      name: "rule1",
86      description: "rule1 description",
87      direction: netFirewall.NetFirewallRuleDirection.RULE_IN,
88      action: netFirewall.FirewallRuleAction.RULE_DENY,
89      type: netFirewall.NetFirewallRuleType.RULE_IP,
90      isEnabled: true,
91      appUid: 20001,
92      localIps: [
93        {
94          family: 1,
95          type: 1,
96          address: "10.10.1.1",
97          mask: 24
98        },{
99          family: 1,
100          type: 2,
101          startIp: "10.20.1.1",
102          endIp: "10.20.1.10"
103        }] as IpType[],
104      remoteIps:[
105        {
106          family: 1,
107          type: 1,
108          address: "20.10.1.1",
109          mask: 24
110        },{
111          family: 1,
112          type: 2,
113          startIp: "20.20.1.1",
114          endIp: "20.20.1.10"
115        }] as IpType[],
116      protocol: 6,
117      localPorts: [
118        {
119          startPort: 1000,
120          endPort: 1000
121        },{
122          startPort: 2000,
123          endPort: 2001
124        }] as IpPort[],
125      remotePorts: [
126        {
127          startPort: 443,
128          endPort: 443
129        }] as IpPort[],
130      userId: 100
131    };
132    // 添加防火墙规则。
133    netFirewall.addNetFirewallRule(ipRule).then((result: number) => {
134      console.info('rule Id: ', result);
135    }, (reason: BusinessError) => {
136      console.error('add firewall rule failed: ', JSON.stringify(reason));
137    });
138    ```
139
140## 针对域名联网访问控制支持拦截
141
1421. 设备通过硬件接口,插入网线。
1432. 从@kit.NetworkKit中导入netFirewall命名空间。
144
145    ```ts
146    // 从@kit.NetworkKit中导入netFirewall命名空间。
147    import { netFirewall } from '@kit.NetworkKit';
148    import { BusinessError } from '@kit.BasicServicesKit';
149    ```
150
1513. 调用setNetFirewallPolicy方法,打开防火墙。
152
153    ```ts
154    interface domain{
155        isWildcard: boolean;
156        domain: string;
157    }
158
159    // 定义防火墙策略:打开,入站阻止,出站允许。
160    let policy: netFirewall.NetFirewallPolicy = {
161      isOpen: true,
162      inAction: netFirewall.FirewallRuleAction.RULE_DENY,
163      outAction: netFirewall.FirewallRuleAction.RULE_ALLOW
164    };
165    // 给用户100设置防火墙策略
166    netFirewall.setNetFirewallPolicy(100, policy).then(() => {
167      console.info("set firewall policy success.");
168    }).catch((error : BusinessError) => {
169      console.error("set firewall policy failed: " + JSON.stringify(error));
170    });
171    ```
172
1734. 通过addNetFirewallRule方法,添加防火墙规则。
174
175    ```ts
176    // 初始化具体的防火墙域名类型规则。
177    let domainRule: netFirewall.NetFirewallRule = {
178      name: "rule2",
179      description: "rule2 description",
180      direction: netFirewall.NetFirewallRuleDirection.RULE_IN,
181      action: netFirewall.FirewallRuleAction.RULE_DENY,
182      type: netFirewall.NetFirewallRuleType.RULE_DOMAIN,
183      isEnabled: true,
184      appUid: 20002,
185      domains: [
186        {
187          isWildcard: false,
188          domain: "www.openharmony.cn"
189        },{
190          isWildcard: true,
191          domain: "*.openharmony.cn"
192        }] as domain[],
193      userId: 100
194    };
195
196    // 添加防火墙规则。
197    netFirewall.addNetFirewallRule(domainRule).then((result: number) => {
198      console.info('rule Id: ', result);
199    }, (reason: BusinessError) => {
200      console.error('add firewall rule failed: ', JSON.stringify(reason));
201    });
202    ```
203
204<!--Del-->
205## 查询防火墙拦截记录
206
2071. 设备通过硬件接口,插入网线。
2082. 从@kit.NetworkKit中导入netfirewall命名空间。
209
210    ```ts
211    // 从@kit.NetworkKit中导入netFirewall命名空间。
212    import { netFirewall } from '@kit.NetworkKit';
213    import { BusinessError } from '@kit.BasicServicesKit';
214    ```
215
2163. 用户态通过getInterceptRecords方法查询拦截记录。
217
218    ```ts
219    // 通过getInterceptedRecords方法分页查询拦截记录。
220    let interceptRecordParam: netFirewall.RequestParam = {
221      page: 1,
222      pageSize: 10,
223      orderField: netFirewall.NetFirewallOrderField.ORDER_BY_RECORD_TIME,
224      orderType: netFirewall.NetFirewallOrderType.ORDER_DESC
225    };
226    netFirewall.getInterceptedRecords(100, interceptRecordParam).then((result: netFirewall.InterceptedRecordPage) => {
227      console.info("result:", JSON.stringify(result));
228    }, (error: BusinessError) => {
229      console.error("get intercept records failed: " + JSON.stringify(error));
230    });
231    ```
232<!--DelEnd-->
233