nodemap

package
v0.0.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 1, 2026 License: MIT Imports: 57 Imported by: 0

README

pkg/nodemap - 网络设备仿真建模与策略自动化配置系统

概述

pkg/nodemap 是一个企业级网络设备仿真建模和策略自动化配置系统,专门用于处理安全策略工单和网络设备配置管理。该系统支持多厂商路由器、交换机、防火墙、负载均衡设备,通过仿真网络环境实现端到端的策略自动开通能力。

系统提供两个核心功能:

  • MakeTemplates: 用于安全策略工单处理,生成新的防火墙策略配置
  • Policies: 用于灵活查询和匹配现有的安全策略,进行策略分析和审计

核心功能

1. 安全策略工单处理与生成
  • 源节点定位: 自动识别和定位策略工单中的源节点
  • 安全策略匹配: 在仿真网络中进行策略匹配分析
  • 防火墙策略生成: 自动生成设备特定的防火墙策略配置
  • 配置下发: 生成可执行的设备配置命令
2. 策略查询与匹配
  • 多维度策略匹配: 支持地址、服务、动作等多维度策略查询
  • 策略冲突检测: 自动检测和报告策略冲突
  • 策略影响分析: 分析策略变更对网络的影响
  • 策略审计: 进行策略合规性检查和审计
3. 多厂商设备支持
  • 防火墙设备: USG、ASA、SRX、FortiGate、SecPath、Dptech
  • 负载均衡设备: F5
  • 路由器设备: H3C、思科IOS、思科Nexus
4. 网络路径分析
  • 源节点定位: 基于源网络和目标网络自动定位入口节点
  • 路由路径构建: 通过路由表查询构建完整的数据包路径
  • 环路检测: 自动检测和避免路由环路
  • 多路径支持: 支持直连、下一跳、Outside、Stub等多种路径类型
5. 策略命名与配置风格定制
  • 命名模板: 支持自定义策略、对象、服务的命名规则
  • 配置风格: 支持对象风格和直接配置风格切换
  • 策略复用: 支持现有策略的复用和匹配
  • 运维规范: 确保生成的配置符合客户的安全运维习惯

系统架构

核心组件
pkg/nodemap/
├── nodemap.go          # 核心网络拓扑管理
├── policy.go           # 策略匹配和查询引擎
├── traverse.go         # 网络遍历和路径分析核心
├── factory.go          # 设备适配器工厂
├── node/               # 设备节点抽象
│   ├── device/         # 具体设备实现
│   │   ├── firewall/   # 防火墙设备
│   │   │   ├── process.go    # 防火墙策略处理核心
│   │   │   ├── api.go        # 防火墙接口定义
│   │   │   ├── step.go       # 处理步骤定义
│   │   │   └── [vendor]/     # 厂商特定实现
│   │   └── lb/         # 负载均衡设备
│   └── processor/      # 节点处理器
├── adapter/            # 设备适配器
├── api/                # 接口定义
├── config/             # 配置管理
└── example/            # 使用示例
主要数据结构
NodeMap - 网络拓扑容器
type NodeMap struct {
    Name       string
    Ports      []api.Port
    Nodes      []api.Node
    Ipv4Areas  []*config.AreaInfo
    Ipv6Areas  []*config.AreaInfo
    Ipv4Stubs  []*StubInfo
    Ipv6Stubs  []*StubInfo
    CxMananger *ConnectorManager
    TNodeMapID *uint
    logger     *zap.Logger
    taskId     uint
    mutex      sync.Mutex
}
PolicyMatchResult - 策略匹配结果
type PolicyMatchResult struct {
    Policy         firewall.FirewallPolicy
    MatchDetails   map[string]MatchDetail
    MatchType      MatchType
    MatchedAddress *network.NetworkGroup
    OverallMatch   bool
}

核心方法详解

1. 网络遍历与节点定位 (Traverse)

位置: pkg/nodemap/traverse.go

功能: 在NodeMap的多个节点中进行工单定位和路由分析,构建完整的网络路径

核心组件:

TraverseProcess - 遍历处理器
type TraverseProcess struct {
    SimpleGraph
    Intent         *policy.Intent
    IPFamily       network.IPFamily
    NodeMap        *NodeMap
    Vrf            string
    Gateway        string
    Area           string
    TraverseOnly   bool
    Results        *TraverseResult
    FuncationNodes []api.Node
    Vertices       map[interface{}]graph.Vertex
    logger         *zap.Logger
}
TraverseNode - 遍历节点
type TraverseNode struct {
    nm           *NodeMap
    Node         api.Node
    Intent       *policy.Intent
    InVrf        string
    InPort       api.Port
    Neighbor     map[interface{}]graph.Vertex
    IPFamily     network.IPFamily
    Path         string
    Ok           bool
    Info         string
    Process      *TraverseProcess
    TraverseOnly bool
    logger       *zap.Logger
}

详细处理流程:

1. 源节点定位
func (tp *TraverseProcess) Traverse(ctx context.Context) {
    // 1. 进入Traverse入口
    // 2. 开始定位源节点
    ok, srcNode, portNameOrMsg = tp.NodeMap.LocateNode(srcNetworkList, dstNetworkList, tp.Intent.InputNode, tp.Vrf, tp.Gateway, tp.Area)
    // 3. 源节点定位完成
    // 4. 源端口确定
    // 5. 开始进行路由查询
}
2. 路由查询与路径构建
func (tn *TraverseNode) RunL3Route(traverseOnly bool, ctx context.Context) (processErr model.ProcessErr) {
    // 1. 检查环路避免
    // 2. 执行路由查询
    ok, hopTable, _, _ := tn.Node.IpRouteCheck(*dstNetworkList, tn.InPort.Name(), tn.InVrf, tn.IPFamily)
    // 3. 处理下一跳
    // 4. 递归处理后续节点
}
3. 节点类型处理
  • 防火墙节点: 执行策略匹配和生成
  • 负载均衡节点: 执行负载均衡策略处理
  • 路由器节点: 执行路由转发
4. 路径类型支持
  • 直连路由: 目标网络直接连接
  • 下一跳路由: 通过其他设备转发
  • Outside路由: 外部网络路由
  • Stub路由: 存根网络路由

环路检测机制:

func (tn *TraverseNode) IsLoop() bool {
    var pathList []string
    if tn.Path != "" {
        pathList = append(pathList, strings.Split(tn.Path, "|")...)
    }
    path := tn.InVrf + ":" + tn.Node.Name()
    return tools.Contains(pathList, path)
}
2. MakeTemplates - 安全策略工单处理与生成

位置: pkg/nodemap/nodemap.go (入口) 和 pkg/nodemap/node/device/firewall/process.go (具体实现)

功能: 接收安全策略工单,执行源节点定位、安全策略匹配,生成新的防火墙策略配置

主要用途:

  • 安全策略工单处理: 处理新的安全策略开通需求
  • 策略配置生成: 根据工单要求生成新的防火墙策略
  • 配置下发: 生成可执行的设备配置命令
  • 策略验证: 在仿真环境中验证生成的策略

工作流程:

  1. 意图分离: 将策略意图分离为IPv4和IPv6两部分
  2. 遍历处理: 创建TraverseProcess进行网络遍历
  3. 源节点定位: 自动定位策略工单中的源节点
  4. 策略匹配: 在仿真网络中进行安全策略匹配
  5. 策略生成: 生成设备特定的防火墙策略配置

详细处理流程 (在 firewall/process.go 中实现):

防火墙策略处理阶段
func (fp *FirewallProcess) MakeTemplates(ctx context.Context, intent *policy.Intent, inPort api.Port, vrf api.Vrf, force bool) (translateTo *policy.Intent, cmdList []interface{}, additionCli []string, err model.ProcessErr)

四个核心处理阶段:

  1. INPUT_NAT 处理 (processInputNat)

    • 检查入站NAT策略
    • 处理静态NAT配置
    • 计算流出端口
    • 生成NAT配置命令
  2. INPUT_POLICY 处理 (processInputPolicy)

    • 检查入站安全策略
    • 匹配现有策略或生成新策略
    • 处理策略冲突(Deny策略)
    • 生成安全策略配置命令
  3. OUTPUT_POLICY 处理 (processOutputPolicy)

    • 检查出站安全策略
    • 确保双向策略一致性
    • 生成出站策略配置命令
  4. OUTPUT_NAT 处理 (processOutputNat)

    • 检查出站NAT策略
    • 处理动态NAT配置
    • 生成SNAT配置命令

策略验证机制:

  • FlyConfig: 在仿真环境中验证生成的配置
  • MeetStatus: 检查策略是否满足意图要求
  • 冲突检测: 自动检测和报告策略冲突

使用示例:

// 创建策略意图(用于生成新策略)
intent := &policy.Intent{
    PolicyEntry:  *policyEntry,
    Snat:         "interface",
    TicketNumber: "TICKET-001",
    Area:         "DMZ",
}

// 执行策略模板生成(生成新的安全策略配置)
tp := nodeMap.MakeTemplates(intent, ctx)
if tp != nil {
    // 处理生成结果
    results := tp.Results
    // 执行配置下发
    Execute(results, deviceList, taskId)
}

策略命名配置示例:

# 不同客户的策略命名习惯配置
devices:
  - file_path: "firewall_config.txt"
    mode: "SecPath"
    metadata:
      # 客户A的命名习惯:GL4F-policy0001
      policy_name_template: "GL4F-policy{SEQ:id:4:1:1:MAIN}"
      
      # 客户B的命名习惯:JiS_DMZ_001
      policy_name_template: "JiS_DMZ_{SEQ:id:3:1:1:MAIN}"
      
      # 客户C的命名习惯:iboc_policy_20250101_01
      policy_name_template: "iboc_policy_{DATE:date:YYYYMMDD}_{SEQ:id:2:1:1:MAIN}"
      
      # 配置风格:启用对象风格
      securitypolicy.object_style: "true"
      securitypolicy.source_object: "true"
      securitypolicy.destination_object: "true"
      securitypolicy.service_object: "true"
      reuse_policy: "true"

网络遍历示例:

// 创建遍历处理器
traverseProcess := &TraverseProcess{
    Intent:       intent,
    IPFamily:     network.IPv4,
    NodeMap:      nodeMap,
    Vrf:          "default",
    TraverseOnly: false,
    Results:      &TraverseResult{},
    Vertices:     make(map[interface{}]graph.Vertex),
}

// 执行网络遍历
traverseProcess.Traverse(ctx)

// 处理遍历结果
for _, item := range traverseProcess.Results.Items {
    fmt.Printf("节点: %s, 路径: %s\n", item.Node.Name(), item.Node.(*TraverseNode).Path)
    
    // 获取匹配和生成的CLI命令
    matched, generated := traverseProcess.Results.GetTraverseResult(item.Node.CmdIp())
    fmt.Printf("匹配策略: %v\n", matched)
    fmt.Printf("生成配置: %v\n", generated)
}

策略处理示例:

// 创建防火墙处理器
firewallProcess := NewFirewallProcess(firewallNode, intent)

// 执行四个阶段的策略处理
translateTo, cmdList, additionCli, err := firewallProcess.MakeTemplates(
    ctx, intent, inPort, vrf, false)

if err.NotNil() {
    // 处理错误
    switch err.GetMark() {
    case model.ConfigConflict:
        // 配置冲突处理
    case model.PolicyDeny:
        // 策略拒绝处理
    case model.SimylationVerificationFailed:
        // 仿真验证失败处理
    }
}

// 处理生成的配置命令
for _, cmd := range cmdList {
    // 执行配置命令
}
3. Policies - 策略查询与匹配

位置: pkg/nodemap/policy.go

功能: 根据指定的匹配条件查询和匹配网络中现有的策略

主要用途:

  • 策略查询: 根据条件查询现有的安全策略
  • 策略匹配: 灵活匹配符合条件的安全策略
  • 策略分析: 分析现有策略的配置和影响
  • 策略审计: 进行策略合规性检查和审计

支持的匹配器:

  • AddressMatcher: 地址匹配(源地址/目标地址)
  • ActionMatcher: 动作匹配(permit/deny/reject等)
  • ServiceMatcher: 服务匹配(协议/端口)
  • NameMatcher: 策略名称匹配
  • CliMatcher: CLI模式匹配
  • CompositeMatcher: 复合匹配器

匹配策略:

  • StrategyOverlap: 重叠匹配
  • StrategyContains: 包含匹配
  • StrategyContainedBy: 被包含匹配
  • StrategyExactMatch: 精确匹配
  • StrategyThreshold: 阈值匹配
  • StrategyOverlapIgnoreAny: 重叠匹配忽略Any

使用示例:

// 创建地址匹配器(用于查询现有策略)
srcMatcher := &nodemap.AddressMatcher{
    Address:  srcNetwork,
    IsSource: true,
    Strategy: nodemap.StrategyOverlap,
}

// 创建动作匹配器
actionMatcher := nodemap.ActionMatcher{
    Action: firewall.POLICY_PERMIT,
}

// 执行策略查询(查询和匹配现有策略)
matchedPolicies := nodeMap.Policies("action-id", srcMatcher, actionMatcher)

// 处理查询结果
for device, policies := range matchedPolicies {
    fmt.Printf("设备 %s 匹配的策略数量: %d\n", device, len(policies))
    for _, policy := range policies {
        fmt.Printf("策略: %s, 匹配类型: %s\n", 
            policy.Policy.Name(), policy.MatchType)
    }
}

设备适配器

防火墙设备适配器

系统支持多种防火墙设备的适配器,每个适配器负责:

  • 设备配置解析
  • 策略语法转换
  • 配置命令生成
  • 设备状态管理

核心处理流程: 每个防火墙设备都实现了 FirewallTemplates 接口,提供以下方法:

  • MakeInputPolicyCli(): 生成入站策略配置
  • MakeOutputPolicyCli(): 生成出站策略配置
  • MakeStaticNatCli(): 生成静态NAT配置
  • MakeDynamicNatCli(): 生成动态NAT配置
  • FlyObjectToFlattenCli(): 将对象转换为CLI命令

支持的防火墙类型:

// 在 factory.go 中定义
switch baseInfo.Type {
case terminalmode.ASA:
    return ASA.NewASAAdapter(baseInfo, dc.Config)
case terminalmode.SRX:
    return SRX.NewSRXAdapter(baseInfo, dc.Config)
case terminalmode.SecPath:
    return SECPATH.NewSecPathAdapter(baseInfo, dc.Config)
case terminalmode.F5:
    return F5.NewF5Adapter(baseInfo, dc.Config)
case terminalmode.FortiGate:
    return FortiGate.NewFortiAdapter(baseInfo, dc.Config)
case terminalmode.Dptech:
    return DP.NewDptechAdapter(baseInfo, dc.Config)
case terminalmode.HuaWei:
    return USG.NewUsgAdapter(baseInfo, dc.Config)
}
负载均衡设备适配器

支持F5等负载均衡设备的配置管理:

  • 虚拟服务器配置
  • 健康检查策略
  • 会话保持配置
  • 负载均衡算法

配置管理

设备配置
devices:
  - host: "192.168.1.1"
    username: "admin"
    password: "password"
    mode: "USG"
    port: 22
    metadata:
      securitypolicy.object_style: "true"
      securitypolicy.source_object: "true"
      securitypolicy.destination_object: "true"
      securitypolicy.service_object: "true"
策略配置
policy:
  source: "192.168.1.0/24"
  destination: "10.0.0.0/8"
  service:
    protocol: "tcp"
    port: "80"
  ticketNumber: "TICKET-001"
  area: "DMZ"
  snat: "interface"
策略命名与配置风格定制

系统支持通过YAML配置定制策略的命名习惯和配置风格,确保生成的策略符合客户的安全运维规范:

1. 策略命名模板

策略名称模板:

metadata:
  policy_name_template: "GL4F-policy{SEQ:id:4:1:1:MAIN}"
  # 或
  policy_name_template: "JiS_DMZ_{SEQ:id:3:1:1:MAIN}"
  # 或
  policy_name_template: "iboc_policy_{DATE:date:YYYYMMDD}_{SEQ:id:2:1:1:MAIN}"

服务对象名称模板:

metadata:
  service_object_name_template: |
    {policy_name}_{protocol}{if:exist:compact_port=="true"}_{compact_port}{endif}

网络对象名称模板:

metadata:
  network_object_name_template: |
    {if:exist:single_rule=="true"}DMZ_{ip}
    {else}
      {if:exist:object_name=="true"}
          {object_name}
      {else}
        {if:exist:policy_name=="true"}
          {policy_name}{if:exist:is_source=="true"}_src_addr{else}_dst_addr{endif}
        {endif}	
      {endif}
    {endif}
2. 配置风格控制

对象风格配置:

metadata:
  securitypolicy.object_style: "true"      # 启用对象风格
  securitypolicy.source_object: "true"     # 启用源地址对象
  securitypolicy.destination_object: "true" # 启用目标地址对象
  securitypolicy.service_object: "true"    # 启用服务对象
  reuse_policy: "true"                     # 启用策略复用

NAT策略配置:

metadata:
  natpolicy.snat.object_style: "true"      # SNAT对象风格
  natpolicy.snat.source_object: "false"    # SNAT源地址对象
  natpolicy.snat.destination_object: "false" # SNAT目标地址对象
  natpolicy.snat.service_object: "true"    # SNAT服务对象
3. 模板变量说明

序列号变量:

  • {SEQ:id:4:1:1:MAIN}: 4位数字序列号,从1开始,步长1,主序列
  • {SEQ:id:3:1:1:MAIN}: 3位数字序列号,从1开始,步长1,主序列
  • {SEQ:id:4:2000:1:MAIN}: 4位数字序列号,从2000开始,步长1,主序列

日期变量:

  • {DATE:date:YYYYMMDD}: 当前日期,格式为YYYYMMDD

条件变量:

  • {if:exist:compact_port=="true"}: 条件判断,如果compact_port存在且为true
  • {if:exist:is_source=="true"}: 条件判断,如果是源地址
  • {if:exist:single_rule=="true"}: 条件判断,如果是单规则

引用变量:

  • {policy_name}: 引用策略名称
  • {protocol}: 引用协议名称
  • {ip}: 引用IP地址
  • {object_name}: 引用对象名称

使用示例

完整工作流程示例
package main

import (
    "context"
    "github.com/netxops/unicontroller/controller/pkg/nodemap"
    "github.com/netxops/unicontroller/controller/pkg/nodemap/config"
    "github.com/netxops/utils/network"
    "github.com/netxops/utils/policy"
    "github.com/netxops/utils/service"
)

func main() {
    // 1. 加载设备配置
    deviceConfigs := []config.DeviceConfig{
        // ... 设备配置
    }
    
    // 2. 创建网络拓扑
    nodeMap, ctx := nodemap.NewNodeMapFromNetwork(
        "test-network", 
        deviceConfigs, 
        false, 
        1, 
        nil,
    )
    
    // 3. 创建策略意图(用于生成新策略)
    pe := policy.NewPolicyEntry()
    src, _ := network.NewNetworkGroupFromString("192.168.1.0/24")
    dst, _ := network.NewNetworkGroupFromString("10.0.0.0/8")
    svs, _ := service.NewServiceWithL4("tcp", "", "80")
    pe.AddSrc(src)
    pe.AddDst(dst)
    pe.AddService(svs)
    
    intent := &policy.Intent{
        PolicyEntry:  *pe,
        Snat:         "interface",
        TicketNumber: "TICKET-001",
        Area:         "DMZ",
    }
    
    // 4. 执行策略模板生成(生成新的安全策略配置)
    tp := nodeMap.MakeTemplates(intent, ctx)
    if tp != nil {
        // 5. 执行配置下发
        nodemap.Execute(tp.Results, deviceConfigs, 1)
    }
    
    // 6. 策略查询示例(查询现有策略)
    srcMatcher := &nodemap.AddressMatcher{
        Address:  src,
        IsSource: true,
        Strategy: nodemap.StrategyOverlap,
    }
    
    matchedPolicies := nodeMap.Policies("query-001", srcMatcher)
    for device, policies := range matchedPolicies {
        fmt.Printf("设备 %s 匹配的策略: %d\n", device, len(policies))
    }
}

错误处理

系统定义了多种错误类型:

const (
    ConfigConflict               = "配置冲突"
    MissRoute                    = "路由缺失"
    SimylationVerificationFailed = "仿真验证失败"
    PolicyDeny                   = "Deny策略"
    RouteLoop                    = "路由环路"
    RouteQuery                   = "路由查询失败"
    SrcNodePoositionErr          = "源节点定位失败"
    NextHop_Empty                = "下一跳路由为空"
    Not_Support_Multi_Route      = "不支持多路由"
)
网络遍历错误处理

在网络遍历过程中,系统会进行详细的错误检测和处理:

1. 源节点定位失败
// 在 Traverse 方法中
ok, srcNode, portNameOrMsg = tp.NodeMap.LocateNode(srcNetworkList, dstNetworkList, tp.Intent.InputNode, tp.Vrf, tp.Gateway, tp.Area)
if !ok {
    tp.Results.err = model.NewProcessErr(portNameOrMsg, model.SrcNodePoositionErr)
    return
}
2. 路由查询失败
// 在 RunL3Route 方法中
ok, hopTable, _, _ := tn.Node.IpRouteCheck(*dstNetworkList, tn.InPort.Name(), tn.InVrf, tn.IPFamily)
if !ok {
    errStr := fmt.Sprintf("路由查询失败: 节点=%s, 入接口=%s, 意图=%s", tn.Node.Name(), tn.InPort.Name(), tn.Intent.String())
    return model.NewProcessErr(errStr, model.RouteQuery)
}
3. 路由环路检测
// 在 Run 方法中
if tn.IsLoop() {
    errStr := fmt.Sprintf("%s 在路径中形成循环: {%s} 目标: {%s}", tn.Node.Name(), tn.Path, tn.Intent.Dst())
    processErr = model.NewProcessErr(errStr, model.RouteLoop)
    tn.Process.Results.err = processErr
    return processErr
}
4. 下一跳路由问题
// 在 RunL3Route 方法中
if len(hopTable.Column("connected").List().Distinct()) == 0 {
    errStr := fmt.Sprintf("下一跳表为空: 目标网络=%v, 入接口=%s, VRF=%s", dstNetworkList, tn.InPort.Name(), tn.InVrf)
    return model.NewProcessErr(errStr, model.NextHop_Empty)
} else if len(hopTable.Column("connected").List().Distinct()) > 1 {
    errStr := fmt.Sprintf("不支持多路由匹配: 连接=%v", hopTable.Column("connected").List())
    return model.NewProcessErr(errStr, model.Not_Support_Multi_Route)
}
策略处理错误处理

在防火墙策略处理过程中,系统会进行详细的错误检测和处理:

1. 配置冲突检测
// 在 processInputNat 和 processOutputNat 中
if result.Action() == int(NAT_MATCHED) {
    errStr := fmt.Sprintf("nat matched, but not meet intent, Rule:[%s]", result.(*NatMatchResult).Rule().Cli())
    return nil, nil, nil, nil, model.NewProcessErr(errStr, model.ConfigConflict)
}
2. 策略拒绝处理
// 在 processInputPolicy 和 processOutputPolicy 中
case result.Action() == int(POLICY_DENY):
    if !force {
        return nil, nil, nil, model.NewProcessErr(fmt.Sprintf("POLICY Deny, Rule:[%s]", result.(*PolicyMatchResult).Rule().Cli()), model.PolicyDeny)
    }
3. 仿真验证失败
// 在所有策略生成后都会进行仿真验证
node.FlyConfig(flyObjects)
resultFly := node.InputPolicy(translateTo, inPort, outPort)
if resultFly.Action() != int(POLICY_PERMIT) {
    errStr := fmt.Sprintf("fly config failed, TranslateTo:[%s]", translateTo.String())
    return nil, nil, nil, model.NewProcessErr(errStr, model.SimylationVerificationFailed)
}

性能优化

进度跟踪

系统支持长时间操作的进度跟踪:

func (nm *NodeMap) progressCounter(key string, count int, nodeCount int) error {
    progress := int64(float64(count) / float64(nodeCount) * 100)
    if err := global.Redis.Set(context.Background(), key, progress, 6*time.Hour).Err(); err != nil {
        return err
    }
    nm.logger.Info(fmt.Sprintf("l3 node map process progress %d%s", progress, "%"))
    return nil
}
并发处理
  • 支持多设备并发配置下发
  • 异步策略查询和匹配
  • 分布式进度跟踪

扩展性

添加新设备支持
  1. 实现设备适配器接口
  2. 在工厂中注册新设备类型
  3. 添加设备特定的策略模板
自定义匹配器

实现 PolicyMatcher 接口:

type CustomMatcher struct {
    // 自定义匹配逻辑
}

func (cm *CustomMatcher) Match(policy firewall.FirewallPolicy) MatchResult {
    // 实现匹配逻辑
    return MatchResult{
        Matched: true,
        // ... 其他字段
    }
}
自定义命名模板

系统支持通过YAML配置自定义命名模板,适应不同客户的运维习惯:

metadata:
  # 自定义策略命名模板
  policy_name_template: "{VAR:SYSTEM}_{VAR:APP}_policy{SEQ:id:4:1:1:MAIN}"
  
  # 自定义服务对象命名模板
  service_object_name_template: |
    {policy_name}_{protocol}{if:exist:compact_port=="true"}_{compact_port}{endif}
  
  # 自定义网络对象命名模板
  network_object_name_template: |
    {if:exist:single_rule=="true"}{VAR:AREA}_{ip}
    {else}
      {if:exist:object_name=="true"}
          {object_name}
      {else}
        {policy_name}{if:exist:is_source=="true"}_src_addr{else}_dst_addr{endif}
      {endif}
    {endif}

支持的模板变量类型:

  • 序列号变量: {SEQ:id:位数:起始值:步长:序列类型}
  • 日期变量: {DATE:date:格式}
  • 条件变量: {if:exist:条件}...{endif}
  • 引用变量: {policy_name}, {protocol}, {ip}
  • 自定义变量: {VAR:变量名}

依赖项

  • github.com/netxops/utils: 工具库
  • github.com/netxops/utils/network: 网络工具
  • github.com/netxops/utils/policy: 策略工具
  • github.com/netxops/utils/graph: 图算法
  • go.uber.org/zap: 日志库
  • github.com/redis/go-redis/v9: Redis客户端

许可证

本项目采用 MIT 许可证。

贡献

欢迎提交 Issue 和 Pull Request 来改进这个项目。

联系方式

如有问题或建议,请联系项目维护者。

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Execute

func Execute(result *TraverseResult, deviceList []*config.DeviceConfig, taskId uint)

func ExecuteItem

func ExecuteItem(result *TraverseResult, deviceList []*config.DeviceConfig, item_id uint, nodemap_task_id uint) (resultList []executeResult, deviceStatusList []deviceColor)

func ExecuteItem2

func ExecuteItem2(result *TraverseResult, deviceList []*config.DeviceConfig, item_id uint, nodemap_task_id uint) (resultList []executeResult, deviceStatusList []deviceColor)

func JsonToMap

func JsonToMap(jsonStr string) (map[string]string, error)

func NewAdapter

func NewAdapter(dc *config.DeviceConfig) api.Adapter

func NewDeviceBaseInfo(host, user, pass, devType, community string, port int) *DeviceBaseInfo { func NewAdapter(dc *config.DeviceConfig, task_id uint, dumpDb bool) api.Adapter {

func NewNodeFromAdapter

func NewNodeFromAdapter(ad api.Adapter, nodemapName string, force bool) api.Node

func NodeMapInit

func NodeMapInit()

func ReadLogData

func ReadLogData()

func RouteTraceExample

func RouteTraceExample()

RouteTraceExample 路由跟踪示例

Types

type ActionMatcher

type ActionMatcher struct {
	Action firewall.Action
}

func (ActionMatcher) Match

type AddressMatcher

type AddressMatcher struct {
	Address   *network.NetworkGroup
	Strategy  MatchStrategy
	Threshold float64
	IsSource  bool
}

func NewAddressMatcher

func NewAddressMatcher(addr string, strategy MatchStrategy, isSource bool, threshold float64) *AddressMatcher

NewAddressMatcher 新增辅助函数

func (AddressMatcher) Match

type BaseLocatorStrategy

type BaseLocatorStrategy struct {
	NodeMap *NodeMap
	Logger  *zap.Logger
}

BaseLocatorStrategy 基础定位策略,提供公共功能

func NewBaseLocatorStrategy

func NewBaseLocatorStrategy(nodeMap *NodeMap, logger *zap.Logger) *BaseLocatorStrategy

NewBaseLocatorStrategy 创建基础定位策略

func (*BaseLocatorStrategy) GetAreaInfoList

func (b *BaseLocatorStrategy) GetAreaInfoList(ipFamily network.IPFamily) []*config.AreaInfo

GetAreaInfoList 根据 IP 地址族获取对应的 Area 信息列表

func (*BaseLocatorStrategy) GetRouteTable

func (b *BaseLocatorStrategy) GetRouteTable(node api.Node, vrf string, ipFamily network.IPFamily) *network.AddressTable

GetRouteTable 根据节点和 VRF 获取路由表

type CliMatcher

type CliMatcher struct {
	CliPattern string
}

func (CliMatcher) Match

type CompositeMatcher

type CompositeMatcher struct {
	Matchers []PolicyMatcher
}

func (CompositeMatcher) Match

type ConnectorAdapter

type ConnectorAdapter struct {
	// contains filtered or unexported fields
}

ConnectorAdapter 将nodemap.Connector适配为routing.Connector

func NewConnectorAdapter

func NewConnectorAdapter(connector api.Connector) *ConnectorAdapter

NewConnectorAdapter 创建连接器适配器

func (*ConnectorAdapter) HitByIp

func (ca *ConnectorAdapter) HitByIp(ip, vrf string) bool

HitByIp 检查是否匹配IP

func (*ConnectorAdapter) HitByNetwork

func (ca *ConnectorAdapter) HitByNetwork(net network.AbbrNet, vrf string) bool

HitByNetwork 检查是否匹配网络

func (*ConnectorAdapter) ID

func (ca *ConnectorAdapter) ID() string

ID 获取连接器ID

func (*ConnectorAdapter) SelectNodeByIP

func (ca *ConnectorAdapter) SelectNodeByIP(ip, vrf string) (model.Node, model.Port, error)

SelectNodeByIP 通过IP选择节点

func (*ConnectorAdapter) SelectPortsByNetwork

func (ca *ConnectorAdapter) SelectPortsByNetwork(net network.AbbrNet, vrf string) []model.Port

SelectPortsByNetwork 通过网络选择端口

type ConnectorManager

type ConnectorManager struct {
	ConnectorList []api.Connector
}

func (*ConnectorManager) GetConnectorByID

func (cx *ConnectorManager) GetConnectorByID(id string) api.Connector

func (*ConnectorManager) GetConnectorByIp

func (cx *ConnectorManager) GetConnectorByIp(ip, vrf string) api.Connector

func (*ConnectorManager) GetConnectorByNetwork

func (cx *ConnectorManager) GetConnectorByNetwork(net network.AbbrNet, vrf string) api.Connector

func (*ConnectorManager) GetOrCreateConnectorByPort

func (cx *ConnectorManager) GetOrCreateConnectorByPort(port api.Port, connections []*config.ConnectionInfo) api.Connector

func (*ConnectorManager) MarshalJSON

func (cm *ConnectorManager) MarshalJSON() ([]byte, error)

MarshalJSON 实现 JSON 序列化

func (*ConnectorManager) NewConnector

func (cx *ConnectorManager) NewConnector(mode api.Mode) api.Connector

func (*ConnectorManager) UnmarshalJSON

func (cm *ConnectorManager) UnmarshalJSON(data []byte) error

UnmarshalJSON 实现 JSON 反序列化

type ExitInfo

type ExitInfo struct {
	Timestamp time.Time         `json:"timestamp"`
	Reason    ExitReason        `json:"reason"`
	Node      string            `json:"node"`
	Port      string            `json:"port"`
	VRF       string            `json:"vrf"`
	Details   map[string]string `json:"details"`
	Success   bool              `json:"success"`
	ErrorMsg  string            `json:"error_msg,omitempty"`
}

ExitInfo 退出信息

type ExitReason

type ExitReason string

ExitReason 退出原因类型

const (
	ExitReasonConnectedRoute   ExitReason = "ConnectedRoute"   // 直连路由
	ExitReasonOutsidePort      ExitReason = "OutsidePort"      // Outside端口
	ExitReasonStubPort         ExitReason = "StubPort"         // Stub端口
	ExitReasonNextHopFound     ExitReason = "NextHopFound"     // 找到下一跳
	ExitReasonRouteQueryFailed ExitReason = "RouteQueryFailed" // 路由查询失败
	ExitReasonNextHopNotFound  ExitReason = "NextHopNotFound"  // 下一跳未找到
	ExitReasonMultiRoute       ExitReason = "MultiRoute"       // 多路由不支持
	ExitReasonProcessError     ExitReason = "ProcessError"     // 处理错误
	ExitReasonLoopDetected     ExitReason = "LoopDetected"     // 检测到环路
	ExitReasonRouteLoop        ExitReason = "RouteLoop"        // 路由环路
	ExitReasonSourceNodeFailed ExitReason = "SourceNodeFailed" // 源节点定位失败
)

type IntentMap

type IntentMap struct {
	Src          string `json:"src"`
	Dst          string `json:"dst"`
	Protocol     string `json:"protocol"`
	Dport        string `json:"dport"`
	Vrf          string `json:"vrf"`
	RealIp       string `json:"realIp"`
	RealPort     string `json:"realPort"`
	Area         string `json:"area"`
	Snat         string `json:snat`
	Gw6          string `json:"gw_6"`
	TicketNumber string `json:"ticketNumber"`
	SubTicket    string `json:"subTicket"`
	TraverseOnly bool   `json:"traverseOnly"`
	ItemId       uint   `json:"item_id"`
}

type LocateRequest

type LocateRequest struct {
	SrcNetList *network.NetworkList
	DstNetList *network.NetworkList
	NodeName   string
	Vrf        string
	Gw         string
	Area       string
	IPFamily   network.IPFamily
	NodeMap    *NodeMap
	Logger     *zap.Logger
	// contains filtered or unexported fields
}

LocateRequest 定位请求

func (*LocateRequest) GetPortList

func (req *LocateRequest) GetPortList() ([]api.Port, map[api.Port]bool)

GetPortList 获取端口列表

func (*LocateRequest) GetSecurityZoneInfo

func (req *LocateRequest) GetSecurityZoneInfo() *config.SecurityZoneInfo

GetSecurityZoneInfo 获取安全区域信息

func (*LocateRequest) SetPortList

func (req *LocateRequest) SetPortList(portList []api.Port, portListMap map[api.Port]bool)

SetPortList 设置端口列表

func (*LocateRequest) SetSecurityZoneInfo

func (req *LocateRequest) SetSecurityZoneInfo(info *config.SecurityZoneInfo)

SetSecurityZoneInfo 设置安全区域信息

type LocatorStrategy

type LocatorStrategy interface {
	// CanHandle 判断是否可以处理该定位请求
	CanHandle(req *LocateRequest) bool

	// Locate 执行定位逻辑
	Locate(req *LocateRequest) (bool, api.Node, string)
}

LocatorStrategy 定位策略接口

type MatchDetail

type MatchDetail struct {
	Matched      bool
	MatcherType  string
	MatcherValue string

	OverlapDetail float64
	ExtraInfo     map[string]interface{}
	MatchType     MatchType
}

type MatchResult

type MatchResult struct {
	Matched        bool
	MatchType      MatchType
	MatchedAddress *network.NetworkGroup
	OverlapDetail  float64
	ExtraInfo      map[string]interface{}
}

type MatchStrategy

type MatchStrategy int
const (
	// StrategyOverlap 定义重叠匹配策略
	// 当策略地址范围与匹配器地址范围有任何交集时,视为匹配
	StrategyOverlap MatchStrategy = iota

	// StrategyContains 定义包含匹配策略
	// 策略地址范围必须完全包含匹配器地址范围,即匹配器地址范围是策略地址范围的子集
	StrategyContains

	// StrategyContainedBy 定义被包含匹配策略
	// 策略地址范围必须被匹配器地址范围完全包含,即策略地址范围是匹配器地址范围的子集
	StrategyContainedBy

	// StrategyExactMatch 定义精确匹配策略
	// 策略地址范围必须与匹配器地址范围完全相同
	StrategyExactMatch

	// StrategyThreshold 定义阈值匹配策略
	// 重叠部分占策略地址范围的比例必须大于或等于设定的阈值才视为匹配
	StrategyThreshold

	// StrategyOverlapIgnoreAny 定义忽略"Any"地址的重叠匹配策略
	// 检查地址重叠,但忽略策略中源或目的地址为"Any"的情况
	// 用于避免匹配过于宽泛的策略,提高匹配精确度
	StrategyOverlapIgnoreAny

	// StrategyIsolatedInQuery 定义孤立地址在查询范围内匹配策略
	// 遍历策略地址中的每个孤立地址(通过 iterator 遍历时,每个独立的 entry 都是孤立地址)
	// 只要策略中的任意一个孤立地址在查询范围内,就视为匹配
	// 例如:策略包含 [10.1.0.0/25, 10.1.0.222, 10.2.0.0/24, 192.168.1.0/24]
	//      查询 10.1.0.0/24 → 匹配(10.1.0.0/25 和 10.1.0.222 在查询范围内)
	//      查询 10.0.0.0/8 → 匹配(10.1.0.0/25、10.1.0.222 和 10.2.0.0/24 在查询范围内)
	//      查询 192.168.0.0/16 → 匹配(192.168.1.0/24 在查询范围内)
	//      查询 172.16.0.0/16 → 不匹配(所有孤立地址都不在查询范围内)
	StrategyIsolatedInQuery
)

func (MatchStrategy) String

func (ms MatchStrategy) String() string

type MatchType

type MatchType int
const (
	MatchNone MatchType = iota
	MatchSource
	MatchDestination
	MatchBoth
)

func (MatchType) String

func (mt MatchType) String() string

type NameMatcher

type NameMatcher struct {
	Name string
}

func (NameMatcher) Match

type NetworkLocator

type NetworkLocator struct {
	*BaseLocatorStrategy
}

NetworkLocator 网络地址定位策略

func NewNetworkLocator

func NewNetworkLocator(nodeMap *NodeMap, logger *zap.Logger) *NetworkLocator

NewNetworkLocator 创建网络地址定位器

func (*NetworkLocator) CanHandle

func (l *NetworkLocator) CanHandle(req *LocateRequest) bool

CanHandle 判断是否可以处理该定位请求

func (*NetworkLocator) Locate

func (l *NetworkLocator) Locate(req *LocateRequest) (bool, api.Node, string)

Locate 执行定位逻辑

type NodeAdapter

type NodeAdapter struct {
	// contains filtered or unexported fields
}

NodeAdapter 将nodemap.Node适配为routing.Node

func NewNodeAdapter

func NewNodeAdapter(node api.Node) *NodeAdapter

NewNodeAdapter 创建节点适配器

func (*NodeAdapter) GetPort

func (na *NodeAdapter) GetPort(portID string) (model.Port, error)

GetPort 获取端口

func (*NodeAdapter) GetPortByName

func (na *NodeAdapter) GetPortByName(name string) (model.Port, error)

GetPortByName 通过名称获取端口

func (*NodeAdapter) GetRouteTable

func (na *NodeAdapter) GetRouteTable(vrf string, ipFamily network.IPFamily) (*model.RouteTable, error)

GetRouteTable 获取路由表

func (*NodeAdapter) ID

func (na *NodeAdapter) ID() string

ID 获取节点ID

func (*NodeAdapter) ListPorts

func (na *NodeAdapter) ListPorts() []model.Port

ListPorts 列出所有端口

func (*NodeAdapter) Name

func (na *NodeAdapter) Name() string

Name 获取节点名称

func (*NodeAdapter) QueryRoute

func (na *NodeAdapter) QueryRoute(
	dst network.NetworkList,
	inPort, vrf string,
	ipFamily network.IPFamily) (*model.RouteResult, error)

QueryRoute 查询路由

func (*NodeAdapter) SetRouteTable

func (na *NodeAdapter) SetRouteTable(vrf string, ipFamily network.IPFamily, table *model.RouteTable) error

SetRouteTable 设置路由表

func (*NodeAdapter) Type

func (na *NodeAdapter) Type() model.NodeType

Type 获取节点类型

type NodeLocator

type NodeLocator struct {
	// contains filtered or unexported fields
}

NodeLocator 节点定位器,封装节点定位逻辑

func NewNodeLocator

func NewNodeLocator(nm *NodeMap) *NodeLocator

NewNodeLocator 创建新的节点定位器

func (*NodeLocator) Locate

func (nl *NodeLocator) Locate(srcnetList *network.NetworkList, dstnetList *network.NetworkList, nodeName, vrf, gw, area string) (bool, api.Node, string)

Locate 定位节点(NodeLocator 的新实现,使用策略模式)

func (*NodeLocator) LocateLegacy

func (nl *NodeLocator) LocateLegacy(srcnetList *network.NetworkList, dstnetList *network.NetworkList, nodeName, vrf, gw, area string) (bool, api.Node, string)

LocateLegacy 定位节点(旧实现,保留用于向后兼容和测试)

type NodeMap

type NodeMap struct {
	Name              string
	Ports             []api.Port
	Nodes             []api.Node
	Ipv4Areas         []*config.AreaInfo
	Ipv6Areas         []*config.AreaInfo
	Ipv4SecurityZones []*config.SecurityZoneInfo
	Ipv6SecurityZones []*config.SecurityZoneInfo
	Ipv4Stubs         []*StubInfo
	Ipv6Stubs         []*StubInfo
	CxMananger        *ConnectorManager
	TNodeMapID        *uint
	// contains filtered or unexported fields
}

func NewNodeMapFromNetwork

func NewNodeMapFromNetwork(name string, deviceList []config.DeviceConfig, force bool, task_id uint, nodeMapId *uint, templatePath ...string) (*NodeMap, context.Context)

NewNodeMapFromNetwork 创建新的 NodeMap templatePath: 防火墙模板路径,如果为空则使用默认路径

func (*NodeMap) AddNode

func (nm *NodeMap) AddNode(n api.Node, connections []*config.ConnectionInfo)

func (*NodeMap) AttachToConnector

func (nm *NodeMap) AttachToConnector(p api.Port, connector api.Connector)

func (*NodeMap) FlattenName

func (nm *NodeMap) FlattenName() string

func (*NodeMap) FlattenPath

func (nm *NodeMap) FlattenPath() []string

func (*NodeMap) GetAllPorts

func (nm *NodeMap) GetAllPorts() []api.Port

GetAllPorts 返回所有的 Port 对象

func (*NodeMap) GetNode

func (nm *NodeMap) GetNode(name string) api.Node

func (*NodeMap) GetNodeById

func (nm *NodeMap) GetNodeById(id string) api.Node

func (*NodeMap) GetPort

func (nm *NodeMap) GetPort(ref string) api.Port

GetPort 根据端口引用(名称或ID)返回对应的 Port 对象

func (*NodeMap) GetPortsByArea

func (nm *NodeMap) GetPortsByArea(area string, ipFamily network.IPFamily) []api.Port

func (*NodeMap) IsOutsidePort

func (nm *NodeMap) IsOutsidePort(nodeName, portName string, af network.IPFamily) (bool, string)

func (*NodeMap) IsStubPort

func (nm *NodeMap) IsStubPort(node api.Node, port api.Port, ipType network.IPFamily) bool

func (*NodeMap) LocateNode

func (nm *NodeMap) LocateNode(srcnetList *network.NetworkList, dstnetList *network.NetworkList, nodeName, vrf, gw, area string) (bool, api.Node, string)

LocateNode 定位节点(备份方法,保留用于向后兼容) 新的实现请使用 NodeLocator.Locate 方法

func (*NodeMap) LocateStubNode

func (nm *NodeMap) LocateStubNode(netList *network.NetworkList, vrf string, ipType network.IPFamily) (bool, api.Node, api.Port)

func (*NodeMap) Locator

func (nm *NodeMap) Locator() *NodeLocator

Locator 返回节点定位器实例

func (*NodeMap) MakeTemplates

func (nm *NodeMap) MakeTemplates(intent *policy.Intent, ctx context.Context) *TraverseProcess

func (*NodeMap) MarshalJSON

func (nm *NodeMap) MarshalJSON() ([]byte, error)

MarshalJSON 实现 JSON 序列化

func (*NodeMap) MatchSecurityZone

func (nm *NodeMap) MatchSecurityZone(srcnetList *network.NetworkList, vrf string, ipFamily network.IPFamily) (*config.SecurityZoneInfo, bool)

MatchSecurityZone 检查源网络是否匹配安全区域(公开方法) 返回匹配的安全区域信息和是否匹配

func (*NodeMap) Policies

func (nm *NodeMap) Policies(actionID string, matchers ...PolicyMatcher) map[string][]PolicyMatchResult

func (*NodeMap) SelectPortListByNetwork

func (nm *NodeMap) SelectPortListByNetwork(net network.AbbrNet, vrf string) []api.Port

func (*NodeMap) SetOutside

func (nm *NodeMap) SetOutside(nodeName, portName, areaName string, ipv4, force bool)

func (*NodeMap) SetStubInterface

func (nm *NodeMap) SetStubInterface(nodeName, portName string, ipType network.IPFamily)

func (NodeMap) TableName

func (NodeMap) TableName() string

func (*NodeMap) ToDot

func (nm *NodeMap) ToDot() string

func (*NodeMap) ToMermaid

func (nm *NodeMap) ToMermaid() string

func (*NodeMap) UnmarshalJSON

func (nm *NodeMap) UnmarshalJSON(data []byte) error

UnmarshalJSON 实现 JSON 反序列化

func (*NodeMap) WhichNodeHasOutside

func (nm *NodeMap) WhichNodeHasOutside(vrf string, af network.IPFamily) []api.Node

func (*NodeMap) WithLogger

func (nm *NodeMap) WithLogger(logger *zap.Logger)

func (*NodeMap) WithRedisClient

func (nm *NodeMap) WithRedisClient(client RedisClient)

WithRedisClient 设置 Redis 客户端

type NodeMapTopologyAdapter

type NodeMapTopologyAdapter struct {
	// contains filtered or unexported fields
}

NodeMapTopologyAdapter 将NodeMap适配为routing.Topology

func NewNodeMapTopologyAdapter

func NewNodeMapTopologyAdapter(nodeMap *NodeMap) *NodeMapTopologyAdapter

NewNodeMapTopologyAdapter 创建NodeMap拓扑适配器

func (*NodeMapTopologyAdapter) AddNode

func (nmta *NodeMapTopologyAdapter) AddNode(node model.Node) error

AddNode 添加节点

func (*NodeMapTopologyAdapter) GetConnector

func (nmta *NodeMapTopologyAdapter) GetConnector(connectorID string) (model.Connector, error)

GetConnector 获取连接器

func (*NodeMapTopologyAdapter) GetConnectorByIP

func (nmta *NodeMapTopologyAdapter) GetConnectorByIP(ip, vrf string) (model.Connector, error)

GetConnectorByIP 通过IP获取连接器

func (*NodeMapTopologyAdapter) GetConnectorByNetwork

func (nmta *NodeMapTopologyAdapter) GetConnectorByNetwork(net network.AbbrNet, vrf string) (model.Connector, error)

GetConnectorByNetwork 通过网络获取连接器

func (*NodeMapTopologyAdapter) GetNode

func (nmta *NodeMapTopologyAdapter) GetNode(nodeID string) (model.Node, error)

GetNode 获取节点

func (*NodeMapTopologyAdapter) GetPort

func (nmta *NodeMapTopologyAdapter) GetPort(portID string) (model.Port, error)

GetPort 获取端口

func (*NodeMapTopologyAdapter) GetPortsByArea

func (nmta *NodeMapTopologyAdapter) GetPortsByArea(area string, ipFamily network.IPFamily) []model.Port

GetPortsByArea 获取区域端口

func (*NodeMapTopologyAdapter) IsOutsidePort

func (nmta *NodeMapTopologyAdapter) IsOutsidePort(nodeID, portID string, ipFamily network.IPFamily) (bool, string)

IsOutsidePort 判断是否为Outside端口

func (*NodeMapTopologyAdapter) IsStubPort

func (nmta *NodeMapTopologyAdapter) IsStubPort(nodeID, portID string, ipFamily network.IPFamily) bool

IsStubPort 判断是否为Stub端口

func (*NodeMapTopologyAdapter) ListNodes

func (nmta *NodeMapTopologyAdapter) ListNodes() []model.Node

ListNodes 列出所有节点

func (*NodeMapTopologyAdapter) ListPorts

func (nmta *NodeMapTopologyAdapter) ListPorts() []model.Port

ListPorts 列出所有端口

func (*NodeMapTopologyAdapter) LocateSourceNode

func (nmta *NodeMapTopologyAdapter) LocateSourceNode(
	src network.NetworkList,
	options *graph.LocateOptions) (model.Node, model.Port, error)

LocateSourceNode 定位源节点

type NodeNameLocator

type NodeNameLocator struct {
	*BaseLocatorStrategy
}

NodeNameLocator 节点名称定位策略

func NewNodeNameLocator

func NewNodeNameLocator(nodeMap *NodeMap, logger *zap.Logger) *NodeNameLocator

NewNodeNameLocator 创建节点名称定位器

func (*NodeNameLocator) CanHandle

func (l *NodeNameLocator) CanHandle(req *LocateRequest) bool

CanHandle 判断是否可以处理该定位请求

func (*NodeNameLocator) Locate

func (l *NodeNameLocator) Locate(req *LocateRequest) (bool, api.Node, string)

Locate 执行定位逻辑

type OrMatcher

type OrMatcher struct {
	Matchers []PolicyMatcher
}

保留现有的 Matcher 实现

func (OrMatcher) Match

func (m OrMatcher) Match(policy firewall.FirewallPolicy) MatchResult

type OutsideNodeLocator

type OutsideNodeLocator struct {
	*BaseLocatorStrategy
}

OutsideNodeLocator Outside 节点定位策略

func NewOutsideNodeLocator

func NewOutsideNodeLocator(nodeMap *NodeMap, logger *zap.Logger) *OutsideNodeLocator

NewOutsideNodeLocator 创建 Outside 节点定位器

func (*OutsideNodeLocator) CanHandle

func (l *OutsideNodeLocator) CanHandle(req *LocateRequest) bool

CanHandle 判断是否可以处理该定位请求

func (*OutsideNodeLocator) Locate

func (l *OutsideNodeLocator) Locate(req *LocateRequest) (bool, api.Node, string)

Locate 执行定位逻辑

type PolicyMatchResult

type PolicyMatchResult struct {
	Policy         firewall.FirewallPolicy
	MatchDetails   map[string]MatchDetail
	MatchType      MatchType
	MatchedAddress *network.NetworkGroup
	OverallMatch   bool
}

type PolicyMatcher

type PolicyMatcher interface {
	Match(policy firewall.FirewallPolicy) MatchResult
}

PolicyMatcher 定义了防火墙策略匹配器的接口

type PortAdapter

type PortAdapter struct {
	// contains filtered or unexported fields
}

PortAdapter 将nodemap.Port适配为routing.Port

func NewPortAdapter

func NewPortAdapter(port api.Port) *PortAdapter

NewPortAdapter 创建端口适配器

func (*PortAdapter) ConnectorID

func (pa *PortAdapter) ConnectorID() string

ConnectorID 获取连接器ID

func (*PortAdapter) ID

func (pa *PortAdapter) ID() string

ID 获取端口ID

func (*PortAdapter) IPAddresses

func (pa *PortAdapter) IPAddresses(ipFamily network.IPFamily) []string

IPAddresses 获取IP地址列表

func (*PortAdapter) Name

func (pa *PortAdapter) Name() string

Name 获取端口名称

func (*PortAdapter) Node

func (pa *PortAdapter) Node() model.Node

Node 获取节点

func (*PortAdapter) VRF

func (pa *PortAdapter) VRF() string

VRF 获取VRF

type PortListIsSameNodeValidator

type PortListIsSameNodeValidator struct{}

func (PortListIsSameNodeValidator) Validate

func (pv PortListIsSameNodeValidator) Validate(data map[string]interface{}) validator.Result

type RedisClient

type RedisClient interface {
	Set(ctx context.Context, key string, value interface{}, expiration time.Duration) error
}

RedisClient 定义 Redis 客户端接口,用于统一不同版本的 Redis 客户端

func NewRedisV8Adapter

func NewRedisV8Adapter(client *redis.Client) RedisClient

NewRedisV8Adapter 创建一个新的 redisV8Adapter

type RouteDecision

type RouteDecision struct {
	Timestamp    time.Time         `json:"timestamp"`
	DecisionType string            `json:"decision_type"` // 决策类型
	Node         string            `json:"node"`          // 节点名称
	Port         string            `json:"port"`          // 端口名称
	VRF          string            `json:"vrf"`           // VRF
	Area         string            `json:"area"`          // 区域
	Criteria     map[string]string `json:"criteria"`      // 决策依据
	Result       string            `json:"result"`        // 决策结果
	Reason       string            `json:"reason"`        // 决策原因
	Details      map[string]string `json:"details"`       // 详细信息
}

RouteDecision 路由决策信息

type RouteDecisionType

type RouteDecisionType string

RouteDecisionType 路由决策类型

const (
	DecisionSourceNodeLocation RouteDecisionType = "SourceNodeLocation" // 源节点定位
	DecisionFunctionNodeCheck  RouteDecisionType = "FunctionNodeCheck"  // 功能节点检查
	DecisionOutputPortMatch    RouteDecisionType = "OutputPortMatch"    // 输出端口匹配
	DecisionAreaClassification RouteDecisionType = "AreaClassification" // 区域分类
	DecisionRouteQuery         RouteDecisionType = "RouteQuery"         // 路由查询
	DecisionNextHopSelection   RouteDecisionType = "NextHopSelection"   // 下一跳选择
	DecisionFailure            RouteDecisionType = "Failure"            // 失败决策
)

type RouteHop

type RouteHop struct {
	InPort  string `json:"in_port"`  // 入接口
	Node    string `json:"node"`     // 节点
	OutPort string `json:"out_port"` // 出接口(可选)
}

RouteHop 路由跳信息

type RouteTraceEntry

type RouteTraceEntry struct {
	Timestamp time.Time              `json:"timestamp"`
	Event     RouteTraceEvent        `json:"event"`
	IntentID  string                 `json:"intent_id,omitempty"`
	NodeName  string                 `json:"node_name,omitempty"`
	PortName  string                 `json:"port_name,omitempty"`
	VRF       string                 `json:"vrf,omitempty"`
	Path      string                 `json:"path,omitempty"`
	NextHop   string                 `json:"next_hop,omitempty"`
	OutPort   string                 `json:"out_port,omitempty"`
	Area      string                 `json:"area,omitempty"`
	Decision  string                 `json:"decision,omitempty"`
	Reason    string                 `json:"reason,omitempty"`
	Error     string                 `json:"error,omitempty"`
	Details   map[string]interface{} `json:"details,omitempty"`
	Duration  time.Duration          `json:"duration,omitempty"`
}

RouteTraceEntry 路由跟踪条目

type RouteTraceEvent

type RouteTraceEvent string

RouteTraceEvent 路由跟踪事件类型

const (
	EventMakeTemplatesStart RouteTraceEvent = "MakeTemplatesStart"
	EventMakeTemplatesEnd   RouteTraceEvent = "MakeTemplatesEnd"
	EventTraverseStart      RouteTraceEvent = "TraverseStart"
	EventTraverseEnd        RouteTraceEvent = "TraverseEnd"
	EventLocateNodeStart    RouteTraceEvent = "LocateNodeStart"
	EventLocateNodeEnd      RouteTraceEvent = "LocateNodeEnd"
	EventRouteQueryStart    RouteTraceEvent = "RouteQueryStart"
	EventRouteQueryEnd      RouteTraceEvent = "RouteQueryEnd"
	EventNextHopFound       RouteTraceEvent = "NextHopFound"
	EventOutsidePortFound   RouteTraceEvent = "OutsidePortFound"
	EventStubPortFound      RouteTraceEvent = "StubPortFound"
	EventLoopDetected       RouteTraceEvent = "LoopDetected"
	EventRouteDecision      RouteTraceEvent = "RouteDecision"
	EventNodeProcessing     RouteTraceEvent = "NodeProcessing"
	EventPathUpdate         RouteTraceEvent = "PathUpdate"
)

type RouteTracer

type RouteTracer struct {
	// contains filtered or unexported fields
}

RouteTracer 路由跟踪器

func NewRouteTracer

func NewRouteTracer(logger *zap.Logger, intent *policy.Intent) *RouteTracer

NewRouteTracer 创建新的路由跟踪器

func (*RouteTracer) AddRouteHop

func (rt *RouteTracer) AddRouteHop(inPort, node, outPort string)

AddRouteHop 添加路由跳信息

func (*RouteTracer) AddRouteHopWithoutOutPort

func (rt *RouteTracer) AddRouteHopWithoutOutPort(inPort, node string)

AddRouteHopWithoutOutPort 添加没有出接口的路由跳信息

func (*RouteTracer) GetExitInfo

func (rt *RouteTracer) GetExitInfo() *ExitInfo

GetExitInfo 获取退出信息

func (*RouteTracer) GetExitInfoJSON

func (rt *RouteTracer) GetExitInfoJSON() ([]byte, error)

GetExitInfoJSON 获取退出信息的JSON格式

func (*RouteTracer) GetRouteDecisions

func (rt *RouteTracer) GetRouteDecisions() []RouteDecision

GetRouteDecisions 获取所有路由决策

func (*RouteTracer) GetRouteDecisionsJSON

func (rt *RouteTracer) GetRouteDecisionsJSON() ([]byte, error)

GetRouteDecisionsJSON 获取路由决策的JSON格式

func (*RouteTracer) GetRouteHops

func (rt *RouteTracer) GetRouteHops() []RouteHop

GetRouteHops 获取所有路由跳信息

func (*RouteTracer) GetRouteHopsJSON

func (rt *RouteTracer) GetRouteHopsJSON() ([]byte, error)

GetRouteHopsJSON 获取路由跳信息的JSON格式

func (*RouteTracer) GetRoutePathString

func (rt *RouteTracer) GetRoutePathString() string

GetRoutePathString 获取路由路径的字符串表示

func (*RouteTracer) GetTraceEntries

func (rt *RouteTracer) GetTraceEntries() []RouteTraceEntry

GetTraceEntries 获取所有跟踪条目

func (*RouteTracer) GetTraceJSON

func (rt *RouteTracer) GetTraceJSON() ([]byte, error)

GetTraceJSON 获取跟踪条目的JSON格式

func (*RouteTracer) GetTraceSummary

func (rt *RouteTracer) GetTraceSummary() map[string]interface{}

GetTraceSummary 获取跟踪摘要

func (*RouteTracer) LogAreaClassification

func (rt *RouteTracer) LogAreaClassification(node, port, vrf, area string, criteria map[string]interface{}, result, reason string)

LogAreaClassification 记录区域分类决策

func (*RouteTracer) LogDestinationNode

func (rt *RouteTracer) LogDestinationNode(inPort, node string)

LogDestinationNode 记录目标节点信息(没有出接口的终点)

func (*RouteTracer) LogError

func (rt *RouteTracer) LogError(event RouteTraceEvent, nodeName, errorMsg string, details map[string]interface{})

LogError 记录错误

func (*RouteTracer) LogEvent

func (rt *RouteTracer) LogEvent(event RouteTraceEvent, details map[string]interface{})

LogEvent 记录路由跟踪事件

func (*RouteTracer) LogExit

func (rt *RouteTracer) LogExit(reason ExitReason, node, port, vrf string, success bool, errorMsg string, details map[string]interface{})

LogExit 记录退出信息

func (*RouteTracer) LogFailure

func (rt *RouteTracer) LogFailure(node, port, vrf string, failureType string, reason string, details map[string]interface{})

LogFailure 记录失败决策

func (*RouteTracer) LogFunctionNodeCheck

func (rt *RouteTracer) LogFunctionNodeCheck(node, port, vrf string, isFunctionNode bool, nodeType string, result, reason string)

LogFunctionNodeCheck 记录功能节点检查决策

func (*RouteTracer) LogNextHop

func (rt *RouteTracer) LogNextHop(currentNode, nextNode, nextPort, nextHopIP, outPort string)

LogNextHop 记录下一跳信息(不记录路由跳,只记录事件)

func (*RouteTracer) LogNextHopSelection

func (rt *RouteTracer) LogNextHopSelection(node, port, vrf string, nextHop, nextNode, nextPort string, criteria map[string]interface{}, result, reason string)

LogNextHopSelection 记录下一跳选择决策

func (*RouteTracer) LogOutputPortMatch

func (rt *RouteTracer) LogOutputPortMatch(node, inPort, outPort, vrf, area string, criteria map[string]interface{}, result, reason string)

LogOutputPortMatch 记录输出端口匹配决策

func (*RouteTracer) LogPathUpdate

func (rt *RouteTracer) LogPathUpdate(path string)

LogPathUpdate 记录路径更新

func (*RouteTracer) LogRouteDecisionNew

func (rt *RouteTracer) LogRouteDecisionNew(decisionType RouteDecisionType, node, port, vrf, area, result, reason string, criteria, details map[string]interface{})

LogRouteDecisionNew 记录路由决策

func (*RouteTracer) LogRouteDecisionOld

func (rt *RouteTracer) LogRouteDecisionOld(nodeName, portName, vrf, decision, reason string, details map[string]interface{})

LogRouteDecisionOld 记录路由决策(旧版本,保持兼容性)

func (*RouteTracer) LogRouteHop

func (rt *RouteTracer) LogRouteHop(inPort, node, outPort string)

LogRouteHop 记录完整的路由跳(推荐使用的方法)

func (*RouteTracer) LogRouteQuery

func (rt *RouteTracer) LogRouteQuery(node, port, vrf string, dstNetwork string, criteria map[string]interface{}, result, reason string)

LogRouteQuery 记录路由查询决策

func (*RouteTracer) LogRouteQueryWithOutput

func (rt *RouteTracer) LogRouteQueryWithOutput(node, port, vrf string, dstNetwork, outPort string, criteria map[string]interface{}, result, reason string)

LogRouteQueryWithOutput 记录路由查询决策(包含输出端口信息)

func (*RouteTracer) LogSourceNode

func (rt *RouteTracer) LogSourceNode(inPort, node string)

LogSourceNode 记录源节点信息(不记录路由跳,只记录决策信息)

func (*RouteTracer) LogSourceNodeLocation

func (rt *RouteTracer) LogSourceNodeLocation(node, port, vrf string, criteria map[string]interface{}, result, reason string)

LogSourceNodeLocation 记录源节点定位决策

func (*RouteTracer) LogSourceNodeLocationFailure

func (rt *RouteTracer) LogSourceNodeLocationFailure(errorMsg string, criteria map[string]interface{})

LogSourceNodeLocationFailure 记录源节点定位失败决策(带详细失败原因)

func (*RouteTracer) ToRouteTraceInfo

func (rt *RouteTracer) ToRouteTraceInfo() *model.RouteTraceInfo

ToRouteTraceInfo 将RouteTracer转换为API格式的RouteTraceInfo

type SecurityZoneLocator

type SecurityZoneLocator struct {
	*BaseLocatorStrategy
}

SecurityZoneLocator 安全区域定位策略 重新设计:对所有节点生成 AddressTable,使用最长匹配,排除默认路由

func NewSecurityZoneLocator

func NewSecurityZoneLocator(nodeMap *NodeMap, logger *zap.Logger) *SecurityZoneLocator

NewSecurityZoneLocator 创建安全区域定位器

func (*SecurityZoneLocator) CanHandle

func (l *SecurityZoneLocator) CanHandle(req *LocateRequest) bool

CanHandle 判断是否可以处理该定位请求

func (*SecurityZoneLocator) Locate

func (l *SecurityZoneLocator) Locate(req *LocateRequest) (bool, api.Node, string)

type ServiceMatcher

type ServiceMatcher struct {
	Service *service.Service
}

func (ServiceMatcher) Match

type StubInfo

type StubInfo struct {
	Node api.Node
	Port api.Port
}

type StubNodeLocator

type StubNodeLocator struct {
	*BaseLocatorStrategy
}

StubNodeLocator Stub 节点定位策略

func NewStubNodeLocator

func NewStubNodeLocator(nodeMap *NodeMap, logger *zap.Logger) *StubNodeLocator

NewStubNodeLocator 创建 Stub 节点定位器

func (*StubNodeLocator) CanHandle

func (l *StubNodeLocator) CanHandle(req *LocateRequest) bool

CanHandle 判断是否可以处理该定位请求

func (*StubNodeLocator) Locate

func (l *StubNodeLocator) Locate(req *LocateRequest) (bool, api.Node, string)

Locate 执行定位逻辑

type TraverseNode

type TraverseNode struct {
	Node   api.Node
	Intent *policy.Intent
	InVrf  string
	InPort api.Port
	// Next     []*TraverseNode
	Neighbor map[interface{}]graph.Vertex
	IPFamily network.IPFamily
	Path     string
	Ok       bool
	Info     string
	Process  *TraverseProcess
	// Session      api.NodeSession
	TraverseOnly bool
	// contains filtered or unexported fields
}

func NewTraverseNode

func NewTraverseNode(nm *NodeMap,
	n api.Node,
	intent *policy.Intent,
	inVrf string,
	inPort api.Port,
	ipFamily network.IPFamily,
	path string,
	process *TraverseProcess,
	traverseOnly bool) *TraverseNode

func (*TraverseNode) AddVertex

func (tn *TraverseNode) AddVertex(other graph.Vertex)

func (*TraverseNode) Flatten

func (tn *TraverseNode) Flatten() []string

func (*TraverseNode) IsLoop

func (tn *TraverseNode) IsLoop() bool

func (*TraverseNode) Iterator

func (tn *TraverseNode) Iterator() *graph.VertexIterator

func (*TraverseNode) Key

func (tn *TraverseNode) Key() interface{}

实现graph.Vertex接口

func (*TraverseNode) MarkFunctionNode

func (tn *TraverseNode) MarkFunctionNode(traverseOnly bool, ctx context.Context) (processErr model.ProcessErr)

func (*TraverseNode) MarshalJSON

func (tn *TraverseNode) MarshalJSON() ([]byte, error)

func (*TraverseNode) PrintCurrentPath

func (tn *TraverseNode) PrintCurrentPath()

func (*TraverseNode) Run

func (tn *TraverseNode) Run(traverseOnly bool, ctx context.Context) (processErr model.ProcessErr)

func (*TraverseNode) RunL3Route

func (tn *TraverseNode) RunL3Route(traverseOnly bool, ctx context.Context) (processErr model.ProcessErr)

func (*TraverseNode) Vertices

func (tn *TraverseNode) Vertices(key interface{}) graph.Vertex

func (*TraverseNode) WithLogger

func (tn *TraverseNode) WithLogger(logger *zap.Logger)

type TraverseProcess

type TraverseProcess struct {
	graph.SimpleGraph
	Intent         *policy.Intent
	IPFamily       network.IPFamily
	NodeMap        *NodeMap
	Vrf            string
	Gateway        string
	Area           string
	TraverseOnly   bool
	FuncationNodes []api.Node
	Results        *TraverseResult

	Vertices    map[interface{}]graph.Vertex
	RouteTracer *RouteTracer        // 添加路由跟踪器
	Warnings    []model.WarningInfo // 警告信息列表
	// contains filtered or unexported fields
}

func (*TraverseProcess) AddF5Result

func (tp *TraverseProcess) AddF5Result(node api.Node, stepProcess *processor.NodeProcessor, result lb.LBProcessResult)

func (*TraverseProcess) AddResult

func (tp *TraverseProcess) AddResult(node api.Node, stepProcess *processor.NodeProcessor, cmdListList []interface{}, addtionCli []string)

func (*TraverseProcess) AddWarning

func (tp *TraverseProcess) AddWarning(warning model.WarningInfo)

AddWarning 添加警告信息

func (*TraverseProcess) GetFunctionNode

func (tp *TraverseProcess) GetFunctionNode(name string) api.Node

func (*TraverseProcess) GetRouteDecisions

func (tp *TraverseProcess) GetRouteDecisions() []RouteDecision

GetRouteDecisions 获取路由决策信息

func (*TraverseProcess) GetRouteDecisionsJSON

func (tp *TraverseProcess) GetRouteDecisionsJSON() ([]byte, error)

GetRouteDecisionsJSON 获取路由决策信息的JSON格式

func (*TraverseProcess) GetRouteHops

func (tp *TraverseProcess) GetRouteHops() []RouteHop

GetRouteHops 获取路由跳信息

func (*TraverseProcess) GetRouteHopsJSON

func (tp *TraverseProcess) GetRouteHopsJSON() ([]byte, error)

GetRouteHopsJSON 获取路由跳信息的JSON格式

func (*TraverseProcess) GetRoutePathString

func (tp *TraverseProcess) GetRoutePathString() string

GetRoutePathString 获取路由路径字符串

func (*TraverseProcess) GetRouteTraceJSON

func (tp *TraverseProcess) GetRouteTraceJSON() ([]byte, error)

GetRouteTraceJSON 获取路由跟踪的JSON数据

func (*TraverseProcess) GetRouteTraceSummary

func (tp *TraverseProcess) GetRouteTraceSummary() map[string]interface{}

GetRouteTraceSummary 获取路由跟踪摘要

func (*TraverseProcess) LogPathUpdate

func (tp *TraverseProcess) LogPathUpdate(path string)

LogPathUpdate 记录路径更新

func (*TraverseProcess) LogRouteDecision

func (tp *TraverseProcess) LogRouteDecision(nodeName, portName, vrf, decision, reason string, details map[string]interface{})

LogRouteDecision 记录路由决策

func (*TraverseProcess) MarshalJSON

func (tp *TraverseProcess) MarshalJSON() ([]byte, error)

func (*TraverseProcess) PrintRouteTrace

func (tp *TraverseProcess) PrintRouteTrace()

PrintRouteTrace 打印路由跟踪信息

func (*TraverseProcess) PushFunctionNode

func (tp *TraverseProcess) PushFunctionNode(n api.Node)

func (*TraverseProcess) Traverse

func (tp *TraverseProcess) Traverse(ctx context.Context)

NodeMap路由和策略匹配的入口

func (*TraverseProcess) WithIntent

func (tp *TraverseProcess) WithIntent(intent *policy.Intent) *TraverseProcess

func (*TraverseProcess) WithLogger

func (tp *TraverseProcess) WithLogger(logger *zap.Logger)

type TraverseResult

type TraverseResult struct {
	Items []*TraverseResultItem
	// contains filtered or unexported fields
}

func (*TraverseResult) Execute

func (tr *TraverseResult) Execute(session api.NodeSession)

func (*TraverseResult) GetErr

func (tr *TraverseResult) GetErr() model.ProcessErr

func (*TraverseResult) GetTraverseResult

func (tr *TraverseResult) GetTraverseResult(nodeIp string) (matched []string, generated []string)

func (*TraverseResult) NodeList

func (tr *TraverseResult) NodeList() []api.Node

type TraverseResultItem

type TraverseResultItem struct {
	Node        api.Node
	StepProcess *processor.NodeProcessor
	CmdListList []interface{}
	AdditionCli []string
	State       []string
	LBResult    lb.LBProcessResult
}

func (*TraverseResultItem) Execute

func (ti *TraverseResultItem) Execute(deviceList []*config.DeviceConfig, task_id uint, screen chan string) (global.CmdExecuteStatusColor, string, string, error)

func (*TraverseResultItem) GenerateCli

func (ti *TraverseResultItem) GenerateCli() []string

func (*TraverseResultItem) MarshalJSON

func (ti *TraverseResultItem) MarshalJSON() ([]byte, error)

func (*TraverseResultItem) MatchedCli

func (ti *TraverseResultItem) MatchedCli() []string

func (*TraverseResultItem) UnmarshalJSON

func (ti *TraverseResultItem) UnmarshalJSON(b []byte) error

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL