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