使用网络防火墙
简介
网络防火墙提供如下功能:
- 防火墙的基础能力,包括防火墙的使能、规则的启用与禁用、审计能力。
- 防火墙规则的配置能力,包括规则的名称、描述、操作、生效应用、协议类型、地址、端口、出站/入站方向等。
- DNS策略的配置能力,包括配置禁止/允许解析的域名、解析使用的DNS服务器(主选/备选)(应用级)。
为了保证应用的运行效率,所有API调用都是异步的,对于异步调用的API均提供了Promise的方式,以下示例均采用Promise方式,更多方式可以查阅@ohos.net.netFirewall (网络防火墙)。
场景介绍
防火墙的典型场景有:
- 针对特定IP联网访问控制
- 支持限制特定应用访问网络。
- 支持限制对特定IP、特定协议、特定端口的网络通信。
- 支持限制特定应用对特定IP、特定协议、特定端口的网络通信。
- 支持拦截规则下发后立即生效(此点针对TCP协议:需断开已有被拦截的TCP连接)。
- 针对域名联网访问控制支持拦截
- 支持限制应用对特定域名的DNS解析能力(仅限制非加密标准DNS协议,不限制加密、私有DNS协议)。
- 支持限制特定应用对特定域名的DNS解析能力(仅限制非加密标准DNS协议,不限制加密、私有DNS协议)。
- 支持拦截规则下发后立即生效(此点针对TCP协议:需断开已有被拦截的TCP连接)。
以下分别介绍具体开发方式。
针对特定IP联网访问控制
-
设备通过硬件接口,插入网线。
-
从@kit.NetworkKit中导入netfirewall命名空间。
// 从@kit.NetworkKit中导入netFirewall命名空间。import { netFirewall } from '@kit.NetworkKit';import { BusinessError } from '@kit.BasicServicesKit';import { hilog } from '@kit.PerformanceAnalysisKit'; -
用户调用setNetFirewallPolicy方法,打开防火墙。
// IP类型interface IpType{family:number;type:number;address?:string;mask?:number;startIp?:string;endIp?:string;}// IP端口interface IpPort{startPort:number;endPort:number;}// ...// 定义防火墙策略:打开,入站阻止,出站允许。let policy: netFirewall.NetFirewallPolicy = {isOpen: true,inAction: netFirewall.FirewallRuleAction.RULE_DENY,outAction: netFirewall.FirewallRuleAction.RULE_ALLOW};// 给用户100设置防火墙策略。netFirewall.setNetFirewallPolicy(100, policy).then(() => {hilog.info(0x0000, 'testTag', `set firewall policy success.`);}).catch((error : BusinessError) => {hilog.error(0x0000, 'testTag', `error: set firewall policy failed: ${JSON.stringify(error)}`);}); -
用户通过addNetFirewallRule方法,添加防火墙规则。
// 初始化具体的防火墙ip类型规则。let ipRule: netFirewall.NetFirewallRule = {name: 'rule1',description: 'rule1 description',direction: netFirewall.NetFirewallRuleDirection.RULE_IN,action: netFirewall.FirewallRuleAction.RULE_DENY,type: netFirewall.NetFirewallRuleType.RULE_IP,isEnabled: true,appUid: 20001,localIps: [{family: 1,type: 1,address: '10.10.1.1',mask: 32},{family: 1,type: 2,startIp: '10.20.1.1',endIp: '10.20.1.10'}] as IpType[],remoteIps:[{family: 1,type: 1,address: '20.10.1.1',mask: 32},{family: 1,type: 2,startIp: '20.20.1.1',endIp: '20.20.1.10'}] as IpType[],protocol: 6,localPorts: [{startPort: 1000,endPort: 1000},{startPort: 2000,endPort: 2001}] as IpPort[],remotePorts: [{startPort: 443,endPort: 443}] as IpPort[],userId: 100};// 添加防火墙规则。netFirewall.addNetFirewallRule(ipRule).then((result: number) => {// ...hilog.info(0x0000, 'testTag', `rule Id: ${result}`);}, (reason: BusinessError) => {// ...hilog.error(0x0000, 'testTag', `error: add firewall rule failed: ${JSON.stringify(reason)}`);});
针对域名联网访问控制支持拦截
-
设备通过硬件接口,插入网线。
-
从@kit.NetworkKit中导入netFirewall命名空间。
// 从@kit.NetworkKit中导入netFirewall命名空间。import { netFirewall } from '@kit.NetworkKit';import { BusinessError } from '@kit.BasicServicesKit';import { hilog } from '@kit.PerformanceAnalysisKit'; -
调用setNetFirewallPolicy方法,打开防火墙。
interface domain{isWildcard: boolean;domain: string;}// ...// 定义防火墙策略:打开,入站阻止,出站允许。let policy: netFirewall.NetFirewallPolicy = {isOpen: true,inAction: netFirewall.FirewallRuleAction.RULE_DENY,outAction: netFirewall.FirewallRuleAction.RULE_ALLOW};// 给用户100设置防火墙策略netFirewall.setNetFirewallPolicy(100, policy).then(() => {hilog.info(0x0000, 'testTag', `set firewall policy success.`);}).catch((error : BusinessError) => {hilog.error(0x0000, 'testTag', `error: set firewall policy failed: ${JSON.stringify(error)}`);}); -
通过addNetFirewallRule方法,添加防火墙规则。
// 初始化具体的防火墙域名类型规则。let domainRule: netFirewall.NetFirewallRule = {name: 'rule2',description: 'rule2 description',direction: netFirewall.NetFirewallRuleDirection.RULE_IN,action: netFirewall.FirewallRuleAction.RULE_DENY,type: netFirewall.NetFirewallRuleType.RULE_DOMAIN,isEnabled: true,appUid: 20002,domains: [{isWildcard: false,domain: 'www.HarmonyOS.cn'},{isWildcard: true,domain: '*.HarmonyOS.cn'}] as domain[],userId: 100};// 添加防火墙规则。netFirewall.addNetFirewallRule(domainRule).then((result: number) => {// ...hilog.info(0x0000, 'testTag', `rule Id: ${result}`);}, (reason: BusinessError) => {// ...hilog.error(0x0000, 'testTag', `error: add firewall rule failed: ${JSON.stringify(reason)}`);});