1# 网络防火墙(仅对系统应用开放)
2
3## 简介
4
5网络防火墙提供如下功能:
6- 防火墙的基础能力,包括防火墙的使能、规则的启用与禁用、审计能力
7- 防火墙规则的配置能力,包括规则的名称、描述、操作、生效应用、协议类型、地址、端口、出站/入站方向等
8- DNS策略的配置能力,包括配置禁止/允许解析的域名、解析使用的DNS服务器(主选/备选)(应用级)
9
10> **说明:**
11> 为了保证应用的运行效率,所有API调用都是异步的,对于异步调用的API均提供了Promise的方式,以下示例均采用promise方式,更多方式可以查阅[API参考](../reference/apis-network-kit/js-apis-net-netfirewall.md)。
12
13## 约束
14
15- 开发语言:JS
16
17## 场景介绍
18
19防火墙的典型场景有:
20- 针对特定IP联网访问控制
211. 支持限制特定应用访问网络
222. 支持限制对特定IP、特定协议、特定端口的网络通信
233. 支持限制特定应用对特定IP、特定协议、特定端口的网络通信
244. 支持拦截规则下发后立即生效(此点针对TCP协议:需断开已有被拦截的TCP连接)
25- 针对域名联网访问控制支持拦截
261. 支持限制应用对特定域名的DNS解析能力(仅限制非加密标准DNS协议,不限制加密、私标DNS协议)
272. 支持限制特地应用对特定域名的DNS解析能力(仅限制非加密标准DNS协议,不限制加密、私标DNS协议)
283. 支持拦截规则下发后立即生效(此点针对TCP协议:需断开已有被拦截的TCP连接)
29- 联网访问控制支持可追溯
301. 支持拦截记录追溯,支持对系统应用提供查询拦截记录的能力
312. 支持所有拦截规则的自动保存和开机自动恢复
32
33以下分别介绍具体开发方式。
34
35## 接口说明
36
37完整的JS API说明以及实例代码请参考:[网络防火墙](../reference/apis-network-kit/js-apis-net-netfirewall.md)。
38
39| 接口                                                                                               | 描述              |
40| -------------------------------------------------------------------------------------------------- | ----------------- |
41| setNetFirewallPolicy(userId: number, policy: NetFirewallPolicy): Promise\<void>                    | 设置防火墙状态    |
42| getNetFirewallPolicy(userId: number): Promise\<NetFirewallPolicy>                                  | 查询防火墙状态    |
43| addNetFirewallRule(rule: NetFirewallRule): Promise\<number>                                        | 添加防火墙规则    |
44| updateNetFirewallRule(rule: NetFirewallRule): Promise\<void>                                       | 更新防火墙规则    |
45| removeNetFirewallRule(userId: number, ruleId: number): Promise\<void>                              | 删除防火墙规则    |
46| getNetFirewallRules(userId: number, requestParam: RequestParam): Promise\<FirewallRulePage>        | 分页查询防火墙规则 |
47| getNetFirewallRule(userId: number, ruleId: number): Promise\<NetFirewallRule>                      | 查询单条防火墙规则 |
48| getInterceptedRecords(userId: number, requestParam: RequestParam): Promise\<InterceptedRecordPage> | 查询防火墙拦截记录 |
49
50## 针对特定IP联网访问控制
51
521. 设备通过硬件接口,插入网线。
532. 从@ohos.net.netFirewall中导入netfirewall命名空间。
543. 用户调用setNetFirewallPolicy方法,打开防火墙。
554. 用户通过addNetFirewallRule方法,添加防火墙规则。
56
57```ts
58// 从@kit.NetworkKit中导入netFirewall命名空间
59import { netFirewall } '@kit.NetworkKit';
60import { BusinessError } from '@kit.BasicServicesKit';
61
62// 定义防火墙策略:打开,入站阻止,出站允许
63let policy: netFirewall.NetFirewallPolicy = {
64  isOpen: true,
65  inAction: netFirewall.FirewallRuleAction.RULE_DENY,
66  outAction: netFirewall.FirewallRuleAction.RULE_ALLOW
67};
68// 给用户100设置防火墙策略
69netFirewall.setNetFirewallPolicy(100, policy).then(() => {
70  console.info("set firewall policy success.");
71}).catch((error : BusinessError) => {
72  console.error("set firewall policy failed: " + JSON.stringify(error));
73});
74
75// 初始化具体的防火墙ip类型规则
76let ipRule: netFirewall.NetFirewallRule = {
77  name: "rule1",
78  description: "rule1 description",
79  direction: netFirewall.NetFirewallRuleDirection.RULE_IN,
80  action:netFirewall.NetFirewallRuleDirection.RULE_DENY,
81  type: netFirewall.NetFirewallRuleType.RULE_IP,
82  isEnabled: true,
83  appUid: 20001,
84  localIps: [
85    {
86      family: 1,
87      type: 1,
88      address: "10.10.1.1",
89      mask: 24
90    },{
91      family: 1,
92      type: 2,
93      startIp: "10.20.1.1",
94      endIp: "10.20.1.10"
95    }],
96  remoteIps:[
97    {
98      family: 1,
99      type: 1,
100      address: "20.10.1.1",
101      mask: 24
102    },{
103      family: 1,
104      type: 2,
105      startIp: "20.20.1.1",
106      endIp: "20.20.1.10"
107    }],
108  protocol: 6,
109  localPorts: [
110    {
111      startPort: 1000,
112      endPort: 1000
113    },{
114      startPort: 2000,
115      endPort: 2001
116    }],
117  remotePorts: [
118    {
119      startPort: 443,
120      endPort: 443
121    }],
122  userId: 100
123};
124// 添加防火墙规则
125netFirewall.addNetFirewallRule(ipRule).then((result: number) => {
126  console.info('rule Id: ', result);
127}, (reason: BusinessError) => {
128  console.error('add firewall rule failed: ', JSON.stringify(reason));
129});
130```
131
132## 针对域名联网访问控制支持拦截
133
1341. 设备通过硬件接口,插入网线。
1352. 从@ohos.net.netfirewall中导入netFirewall命名空间。
1363. 用户态调用setNetFirewallPolicy方法,打开防火墙。
1374. 用户态通过addNetFirewallRule方法,添加防火墙规则。
138
139```ts
140// 从@kit.NetworkKit中导入netFirewall命名空间
141import { netFirewall } '@kit.NetworkKit';
142import { BusinessError } from '@kit.BasicServicesKit';
143
144// 定义防火墙策略:打开,入站阻止,出站允许
145let policy: netFirewall.NetFirewallPolicy = {
146  isOpen: true,
147  inAction: netFirewall.FirewallRuleAction.RULE_DENY,
148  outAction: netFirewall.FirewallRuleAction.RULE_ALLOW
149};
150// 给用户100设置防火墙策略
151netFirewall.setNetFirewallPolicy(100, policy).then(() => {
152  console.info("set firewall policy success.");
153}).catch((error : BusinessError) => {
154  console.error("set firewall policy failed: " + JSON.stringify(error));
155});
156
157// 初始化具体的防火墙域名类型规则
158let domainRule: netFirewall.NetFirewallRule = {
159  name: "rule2",
160  description: "rule2 description",
161  direction: netFirewall.NetFirewallRuleDirection.RULE_IN,
162  action:netFirewall.NetFirewallRuleDirection.RULE_DENY,
163  type: netFirewall.NetFirewallRuleType.RULE_DOMAIN,
164  isEnabled: true,
165  appUid: 20002,
166  domains: [
167    {
168      isWildcard: false,
169      domain: "www.openharmony.cn"
170    },{
171      isWildcard: true,
172      domain: "*.openharmony.cn"
173    }],
174  userId: 100
175};
176// 添加防火墙规则
177netFirewall.addNetFirewallRule(domainRule).then((result: number) => {
178  console.info('rule Id: ', result);
179}, (reason: BusinessError) => {
180  console.error('add firewall rule failed: ', JSON.stringify(reason));
181});
182```
183
184## 查询防火墙拦截记录
185
1861. 设备通过硬件接口,插入网线。
1872. 从@ohos.net.netFirewall中导入netfirewall命名空间。
1883. 用户态通过getInterceptRecords方法查询拦截记录。
189
190```ts
191// 从@kit.NetworkKit中导入netFirewall命名空间
192import { netFirewall } '@kit.NetworkKit';
193import { BusinessError } from '@kit.BasicServicesKit';
194
195// 通过getInterceptedRecords方法分页查询拦截记录
196let interceptRecordParam: netFirewall.RequestParam = {
197  page: 1,
198  pageSize: 10,
199  orderField: netFirewall.NetFirewallOrderField.ORDER_BY_RECORD_TIME,
200  orderType: netFirewall.NetFirewallOrderType.ORDER_DESC
201};
202netFirewall.getInterceptedRecords(100, interceptRecordParam).then((result: netFirewall.InterceptedRecordPage) => {
203  console.info("result:", JSON.stringify(result));
204}, (error: BusinessError) => {
205  console.error("get intercept records failed: " + JSON.stringify(error));
206});
207```
208