
# 使用DSL加工函数过滤VPC流日志公网流量
虚拟私有云VPC提供流日志功能，可以帮您采集指定VPC内网络实例的流量信息，包括入方向和出方向的流量。创建流日志后，您可以在配置的日志组中查看流日志记录。更多VPC流信息请参考[VPC流日志概述](https://support.huaweicloud.com/usermanual-vpc/FlowLog_0002.html)。
在虚拟私有云VPC控制台上创建VPC流日志后，VPC流日志将被采集到云日志服务中，您可以通过云日志服务对VPC流日志进行查询、分析和排查网络故障。本文介绍通过云日志服务数据加工对VPC流日志进行公网流量过滤的操作方法。
DSL加工的功能在邀测中，仅支持华北-北京四、华东-上海一、华南-广州局点的内测用户使用，其他局点暂不支持。
#### 前提条件
- VPC流日志已接入LTS，详细请参见[虚拟私有云VPC接入LTS](https://support.huaweicloud.com/usermanual-lts/lts_04_0305.html)。
- 已在LTS控制台创建日志组和日志流，用于保存数据加工后的VPC流日志公网流量日志。
 
#### 使用场景
例如，VPC流日志已接入LTS，采集到云日志服务中的日志示例如下：
```
{
  "content": "1 5f67944957444bd6bb4fe3b367de8f3d 1d515d18-1b36-47dc-a983-bd6512aed4bd 192.168.0.154 192.168.3.25 38929 53 17 1 96 1548752136 1548752736 ACCEPT OK",
  "version": 1,
  "project_id": "5f67944957444bd6bb4fe3b367de8f3d",
  "interface_id": "1d515d18-1b36-47dc-a983-bd6512aed4bd",
  "srcaddr": "192.168.0.154",
  "dstaddr": "192.168.3.25",
  "srcport": 38929,
  "dstport": 53,
  "protocol": 17,
  "packets": 1,
  "bytes": 96,
  "start": 1548752136,
  "end": 1548752736,
  "action": "ACCEPT",
  "log_status": "ok"
}
```
在对VPC流日志查询和分析过程中，为便于分析公网流量，您需要对原始日志做以下处理：
- 如果srcaddr和dstaddr字段不存在，则丢弃该日志。
- 如果是私网之间互通的流量，则丢弃该日志。
基于以上需求，您可以通过DSL日志加工，对采集到的VPC流日志进行日志加工，便于问题分析。
#### 操作步骤
1. VPC流日志已接入LTS，详细请参见[虚拟私有云VPC接入LTS](https://support.huaweicloud.com/usermanual-lts/lts_04_0305.html)。
2. 在云日志服务控制台的左侧导航栏中选择"日志加工 \> DSL加工"，单击"新建DSL加工任务" 。
3. 在基本信息页面中，完成如下配置。 
   - 任务名称：DSL加工任务的名称，例如test-vpc。
   
   - 启用状态：默认开启。
   
   - 源日志流：在当前账号下方，选择**已完成结构化配置的日志组、日志流**，即VPC流日志接入LTS时创建的日志组和日志流。
   
   - 目标日志流：单击"添加"，选择日志组和日志流（用于存储通过DSL加工处理后的日志），填写日志流别名（用于DSL加工语句编写）。
   
   - 高级配置：本示例不设置。
   
   
   
   
4. 然后单击"下一步"，在加工规则下方输入加工语句： 
   ```
   # 如果srcaddr和dstaddr字段不存在，丢弃。
   e_if(e_not_has("srcaddr"), e_drop())
   e_if(e_not_has("dstaddr"), e_drop())
   # 如果srcaddr和dstaddr不符合IP地址格式，丢弃。
   e_if(op_not(e_match("srcaddr", r'^(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$')), e_drop())
   e_if(op_not(e_match("dstaddr", r'^(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$')), e_drop())
   # 如果是内网之间互通的流量，丢弃。
   e_if(op_and(
   op_or(ip_cidrmatch("10.0.0.0/8", v("srcaddr")),
         ip_cidrmatch("172.16.0.0/12", v("srcaddr")),
         ip_cidrmatch("192.168.0.0/16", v("srcaddr"))
   ),
   op_or(ip_cidrmatch("10.0.0.0/8", v("dstaddr")),
         ip_cidrmatch("172.16.0.0/12", v("dstaddr")),
         ip_cidrmatch("192.168.0.0/16", v("dstaddr"))
   )),e_drop())
   ```
   - 通过[流程控制函数](https://support.huaweicloud.com/usermanual-lts/lts_07_0165.html)中的e_if函数、[事件检查函数](https://support.huaweicloud.com/usermanual-lts/lts_07_0159.html)中的e_not_has函数删除不存在srcaddr和dstaddr字段的日志。
   
   - 通过[流程控制函数](https://support.huaweicloud.com/usermanual-lts/lts_07_0165.html)中的e_if函数、[操作符函数](https://support.huaweicloud.com/usermanual-lts/lts_07_0158.html)中的op_not函数、[事件检查函数](https://support.huaweicloud.com/usermanual-lts/lts_07_0159.html)中的e_match函数删除srcaddr和dstaddr字段不符合IP地址格式的日志。
   
   - 通过[流程控制函数](https://support.huaweicloud.com/usermanual-lts/lts_07_0165.html)中的e_if函数、[操作符函数](https://support.huaweicloud.com/usermanual-lts/lts_07_0158.html)中的op_and和op_or函数、[IP解析函数](https://support.huaweicloud.com/usermanual-lts/lts_07_0151.html)中的ip_cidrmatch函数删除内网日志。
   
   - 更多加工语法请参考[DSL数据加工语法（邀测）](https://support.huaweicloud.com/usermanual-lts/lts_07_0143.html)。
   
   
   
   
5. 在"测试数据"页签输入测试数据，参考如下：（以下示例仅供参考，请以实际上报的数据为准） 
   模拟测试时需要将srcaddr的值改为公网IP。
   ```
   {
     "content": "1 5f67944957444bd6bb4fe3b367de8f3d 1d515d18-1b36-47dc-a983-bd6512aed4bd 192.168.0.154 192.168.3.25 38929 53 17 1 96 1548752136 1548752736 ACCEPT OK",
     "version": 1,
     "project_id": "5f67944957444bd6bb4fe3b367de8f3d",
     "interface_id": "1d515d18-1b36-47dc-a983-bd6512aed4bd",
     "srcaddr": "192.168.0.154",
     "dstaddr": "192.168.3.25",
     "srcport": 38929,
     "dstport": 53,
     "protocol": 17,
     "packets": 1,
     "bytes": 96,
     "start": 1548752136,
     "end": 1548752736,
     "action": "ACCEPT",
     "log_status": "ok"
   }
   ```
   单击"执行预览"，您可以看到原始日志只保留了公共流量的流日志。结果预览如下：
   结果预览里的srcaddr的IP值为修改后的公网地址。
   ```
   {
   "srcaddr"："ip",
   "dstport"：53,
   "start"："1548752136",
   "dstaddr"："192.168.3.25",
   "version"：1,
   "content"："1 5f67944957444bd6bb4fe3b367de8f3d 1d515d18-1b36-47dc-a983-bd6512aed4bd 192.168.0.154 192.168.3.25 38929 53 17 1 96 1548752136 1548752736 ACCEPT OK",
   "packets"：1,
   "protocol"：17,
   "interface_id"："1d515d18-1b36-47dc-a983-bd6512aed4bd",
   "log_status"："ok",
   "project_id"："5f67944957444bd6bb4fe3b367de8f3d",
   "bytes"：96,
   "srcport"："38929",
   "action"："ACCEPT",
   "end"："1548752736"
   }
   ```
   
   
6. 单击"确定"保存加工任务，创建成功后在DSL加工页面生成一条任务明细。
 
