简介

网络防火墙提供如下功能:

  • 防火墙的基础能力,包括防火墙的使能、规则的启用与禁用、审计能力。
  • 防火墙规则的配置能力,包括规则的名称、描述、操作、生效应用、协议类型、地址、端口、出站/入站方向等。
  • DNS策略的配置能力,包括配置禁止/允许解析的域名、解析使用的DNS服务器(主选/备选)(应用级)。

说明

为了保证应用的运行效率,所有API调用都是异步的,对于异步调用的API均提供了Promise的方式,以下示例均采用Promise方式

场景介绍

防火墙的典型场景有:

  • 针对特定IP联网访问控制
  1. 支持限制特定应用访问网络。
  2. 支持限制对特定IP、特定协议、特定端口的网络通信。
  3. 支持限制特定应用对特定IP、特定协议、特定端口的网络通信。
  4. 支持拦截规则下发后立即生效(此点针对TCP协议:需断开已有被拦截的TCP连接)。
  • 针对域名联网访问控制支持拦截
  1. 支持限制应用对特定域名的DNS解析能力(仅限制非加密标准DNS协议,不限制加密、私有DNS协议)。
  2. 支持限制特定应用对特定域名的DNS解析能力(仅限制非加密标准DNS协议,不限制加密、私有DNS协议)。
  3. 支持拦截规则下发后立即生效(此点针对TCP协议:需断开已有被拦截的TCP连接)。

以下分别介绍具体开发方式。

针对特定IP联网访问控制

  1. 设备通过硬件接口,插入网线。

  2. 从@kit.NetworkKit中导入netfirewall命名空间。

// 从@kit.NetworkKit中导入netFirewall命名空间。
import { netFirewall } from '@kit.NetworkKit';
import { BusinessError } from '@kit.BasicServicesKit';
  1. 用户调用setNetFirewallPolicy方法,打开防火墙。
interface IpType{
      family:number;
      type:number;
      address?:string;
      mask?:number;
      startIp?:string;
      endIp?:string;
}
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(() => {
  console.info("set firewall policy success.");
}).catch((error : BusinessError) => {
  console.error("set firewall policy failed: " + JSON.stringify(error));
});
  1. 用户通过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: 24
    },{
      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: 24
    },{
      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) => {
  console.info('rule Id: ', result);
}, (reason: BusinessError) => {
  console.error('add firewall rule failed: ', JSON.stringify(reason));
});

针对域名联网访问控制支持拦截

  1. 设备通过硬件接口,插入网线。

  2. 从@kit.NetworkKit中导入netFirewall命名空间。

// 从@kit.NetworkKit中导入netFirewall命名空间。
import { netFirewall } from '@kit.NetworkKit';
import { BusinessError } from '@kit.BasicServicesKit';
  1. 用户态调用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(() => {
  console.info("set firewall policy success.");
}).catch((error : BusinessError) => {
  console.error("set firewall policy failed: " + JSON.stringify(error));
});
  1. 用户态通过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) => {
  console.info('rule Id: ', result);
}, (reason: BusinessError) => {
  console.error('add firewall rule failed: ', JSON.stringify(reason));
});

本文提到的 [相关技术点] 只是冰山一角!勉费《HarmonyOS全栈开发实战》+《鸿蒙项目源码合集》,涵盖基础到进阶,助你快速上手鸿蒙!👉 点我【下方】立拿

在这里插入图片描述

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐