• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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<!--Del-->
30- 联网访问控制支持可追溯
311. 支持拦截记录追溯,支持对系统应用提供查询拦截记录的能力。
322. 支持所有拦截规则的自动保存和开机自动恢复。
33<!--DelEnd-->
34
35以下分别介绍具体开发方式。
36
37## 接口说明
38
39完整的JS API说明以及实例代码请参考:[网络防火墙](../reference/apis-network-kit/js-apis-net-netfirewall.md)。
40
41| 接口                                                                                               | 描述              |
42| -------------------------------------------------------------------------------------------------- | ----------------- |
43| setNetFirewallPolicy(userId: number, policy: NetFirewallPolicy): Promise\<void>                    | 设置防火墙状态。    |
44| getNetFirewallPolicy(userId: number): Promise\<NetFirewallPolicy>                                  | 查询防火墙状态。    |
45| addNetFirewallRule(rule: NetFirewallRule): Promise\<number>                                        | 添加防火墙规则。    |
46| updateNetFirewallRule(rule: NetFirewallRule): Promise\<void>                                       | 更新防火墙规则。   |
47| removeNetFirewallRule(userId: number, ruleId: number): Promise\<void>                              | 删除防火墙规则。    |
48| getNetFirewallRules(userId: number, requestParam: RequestParam): Promise\<FirewallRulePage>        | 分页查询防火墙规则。 |
49| getNetFirewallRule(userId: number, ruleId: number): Promise\<NetFirewallRule>                      | 查询单条防火墙规则。 |
50| <!--DelRow-->getInterceptedRecords(userId: number, requestParam: RequestParam): Promise\<InterceptedRecordPage> | 查询防火墙拦截记录。 |
51
52## 针对特定IP联网访问控制
53
541. 设备通过硬件接口,插入网线。
552. 从@kit.NetworkKit中导入netfirewall命名空间。
563. 用户调用setNetFirewallPolicy方法,打开防火墙。
574. 用户通过addNetFirewallRule方法,添加防火墙规则。
58
59```ts
60// 从@kit.NetworkKit中导入netFirewall命名空间
61import { netFirewall } from '@kit.NetworkKit';
62import { BusinessError } from '@kit.BasicServicesKit';
63
64interface IpType{
65      family:number;
66      type:number;
67      address?:string;
68      mask?:number;
69      startIp?:string;
70      endIp?:string;
71}
72interface IpPort{
73    startPort:number;
74    endPort:number;
75}
76
77// 定义防火墙策略:打开,入站阻止,出站允许
78let policy: netFirewall.NetFirewallPolicy = {
79  isOpen: true,
80  inAction: netFirewall.FirewallRuleAction.RULE_DENY,
81  outAction: netFirewall.FirewallRuleAction.RULE_ALLOW
82};
83// 给用户100设置防火墙策略
84netFirewall.setNetFirewallPolicy(100, policy).then(() => {
85  console.info("set firewall policy success.");
86}).catch((error : BusinessError) => {
87  console.error("set firewall policy failed: " + JSON.stringify(error));
88});
89
90// 初始化具体的防火墙ip类型规则
91let ipRule: netFirewall.NetFirewallRule = {
92  name: "rule1",
93  description: "rule1 description",
94  direction: netFirewall.NetFirewallRuleDirection.RULE_IN,
95  action:netFirewall.NetFirewallRuleDirection.RULE_DENY,
96  type: netFirewall.NetFirewallRuleType.RULE_IP,
97  isEnabled: true,
98  appUid: 20001,
99  localIps: [
100    {
101      family: 1,
102      type: 1,
103      address: "10.10.1.1",
104      mask: 24
105    },{
106      family: 1,
107      type: 2,
108      startIp: "10.20.1.1",
109      endIp: "10.20.1.10"
110    }] as IpType[],
111  remoteIps:[
112    {
113      family: 1,
114      type: 1,
115      address: "20.10.1.1",
116      mask: 24
117    },{
118      family: 1,
119      type: 2,
120      startIp: "20.20.1.1",
121      endIp: "20.20.1.10"
122    }] as IpType[],
123  protocol: 6,
124  localPorts: [
125    {
126      startPort: 1000,
127      endPort: 1000
128    },{
129      startPort: 2000,
130      endPort: 2001
131    }] as IpPort[],
132  remotePorts: [
133    {
134      startPort: 443,
135      endPort: 443
136    }] as IpPort[],
137  userId: 100
138};
139// 添加防火墙规则
140netFirewall.addNetFirewallRule(ipRule).then((result: number) => {
141  console.info('rule Id: ', result);
142}, (reason: BusinessError) => {
143  console.error('add firewall rule failed: ', JSON.stringify(reason));
144});
145```
146
147## 针对域名联网访问控制支持拦截
148
1491. 设备通过硬件接口,插入网线。
1502. 从@kit.NetworkKit中导入netFirewall命名空间。
1513. 用户态调用setNetFirewallPolicy方法,打开防火墙。
1524. 用户态通过addNetFirewallRule方法,添加防火墙规则。
153
154```ts
155// 从@kit.NetworkKit中导入netFirewall命名空间
156import { netFirewall } from '@kit.NetworkKit';
157import { BusinessError } from '@kit.BasicServicesKit';
158
159interface domain{
160    isWildcard: boolean;
161    domain: string;
162}
163
164// 定义防火墙策略:打开,入站阻止,出站允许
165let policy: netFirewall.NetFirewallPolicy = {
166  isOpen: true,
167  inAction: netFirewall.FirewallRuleAction.RULE_DENY,
168  outAction: netFirewall.FirewallRuleAction.RULE_ALLOW
169};
170// 给用户100设置防火墙策略
171netFirewall.setNetFirewallPolicy(100, policy).then(() => {
172  console.info("set firewall policy success.");
173}).catch((error : BusinessError) => {
174  console.error("set firewall policy failed: " + JSON.stringify(error));
175});
176
177// 初始化具体的防火墙域名类型规则
178let domainRule: netFirewall.NetFirewallRule = {
179  name: "rule2",
180  description: "rule2 description",
181  direction: netFirewall.NetFirewallRuleDirection.RULE_IN,
182  action:netFirewall.NetFirewallRuleDirection.RULE_DENY,
183  type: netFirewall.NetFirewallRuleType.RULE_DOMAIN,
184  isEnabled: true,
185  appUid: 20002,
186  domains: [
187    {
188      isWildcard: false,
189      domain: "www.openharmony.cn"
190    },{
191      isWildcard: true,
192      domain: "*.openharmony.cn"
193    }] as domain[],
194  userId: 100
195};
196// 添加防火墙规则
197netFirewall.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命名空间。
2093. 用户态通过getInterceptRecords方法查询拦截记录。
210
211```ts
212// 从@kit.NetworkKit中导入netFirewall命名空间
213import { netFirewall } from '@kit.NetworkKit';
214import { BusinessError } from '@kit.BasicServicesKit';
215
216// 通过getInterceptedRecords方法分页查询拦截记录
217let interceptRecordParam: netFirewall.RequestParam = {
218  page: 1,
219  pageSize: 10,
220  orderField: netFirewall.NetFirewallOrderField.ORDER_BY_RECORD_TIME,
221  orderType: netFirewall.NetFirewallOrderType.ORDER_DESC
222};
223netFirewall.getInterceptedRecords(100, interceptRecordParam).then((result: netFirewall.InterceptedRecordPage) => {
224  console.info("result:", JSON.stringify(result));
225}, (error: BusinessError) => {
226  console.error("get intercept records failed: " + JSON.stringify(error));
227});
228```
229<!--DelEnd-->
230