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