使用网络防火墙
=======

#### 简介

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

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

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/93/v3/OMF_SiCgTtWzJsbkhrz-QA/note_3.0-zh-cn.png?HW-CC-KV=V1&HW-CC-Date=20260709T132436Z&HW-CC-Expire=86400&HW-CC-Sign=AE5CD8B59C70A7550F86EC86B9D6D7B78534609FFAF68196C3F6DB7B5687988E)

为了保证应用的运行效率，所有API调用都是异步的，对于异步调用的API均提供了Promise的方式，以下示例均采用Promise方式，更多方式可以查阅[@ohos.net.netFirewall (网络防火墙)](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-net-netfirewall)。

#### 场景介绍

防火墙的典型场景有：

*   针对特定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';
    import { hilog } from '@kit.PerformanceAnalysisKit';
    
3.  用户调用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)}\`);
        });
    
4.  用户通过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)}\`);
    });
    

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

1.  设备通过硬件接口，插入网线。
    
2.  从@kit.NetworkKit中导入netFirewall命名空间。
    
    // 从@kit.NetworkKit中导入netFirewall命名空间。
    import { netFirewall } from '@kit.NetworkKit';
    import { BusinessError } from '@kit.BasicServicesKit';
    import { hilog } from '@kit.PerformanceAnalysisKit';
    
3.  调用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)}\`);
        });
    
4.  通过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)}\`);
    });