func()

in pkg/skoop/plugin/networkpolicy.go [49:123]


func (np *networkPolicy) CheckNetworkPolicy(src, dst model.Endpoint, protocol model.Protocol) ([]model.Suspicion, error) {
	var denies []*v1.NetworkPolicy
	var ret []model.Suspicion
	if src.Type == model.EndpointTypePod {
		pod, err := np.ipCache.GetPodFromIP(src.IP)
		if err != nil {
			return nil, fmt.Errorf("error get pod from ip ipCache: %v", err)
		}
		if dst.Type != model.EndpointTypeService && dst.Type != model.EndpointTypeLoadbalancer {
			nps, err := np.checkEgress(pod, dst, protocol)
			if err != nil {
				return nil, fmt.Errorf("error check egress policies: %v", err)
			}
			denies = append(denies, nps...)
		} else if !np.serviceAddrSkipCidrRule {
			// pod -> svc
			nps, err := np.checkEgress(pod, dst, protocol)
			if err != nil {
				return nil, fmt.Errorf("error check egress policies: %v", err)
			}
			denies = append(denies, nps...)
		}
	}
	if dst.Type == model.EndpointTypePod {
		pod, err := np.ipCache.GetPodFromIP(dst.IP)
		if err != nil {
			return nil, fmt.Errorf("error get pod from ip ipCache: %v", err)
		}
		nps, err := np.checkIngress(pod, src, protocol)
		if err != nil {
			return nil, fmt.Errorf("error check ingress policies: %v", err)
		}
		denies = append(denies, nps...)
	}
	if dst.Type == model.EndpointTypeService || dst.Type == model.EndpointTypeLoadbalancer {
		svc, err := np.ipCache.GetServiceFromIP(dst.IP)
		if err != nil {
			return nil, fmt.Errorf("error get service(%v) from ip ipCache: %v", dst.IP, err)
		}
		backends := np.service.Process(model.Packet{
			Src:      net.ParseIP(src.IP),
			Sport:    src.Port,
			Dst:      net.ParseIP(dst.IP),
			Dport:    dst.Port,
			Protocol: protocol,
		}, svc, nil)
		for _, backend := range backends {
			if backend.IP == dst.IP {
				return nil, fmt.Errorf("service network loop")
			}
			backendType, err := np.ipCache.GetIPType(backend.IP)
			if err != nil {
				return nil, err
			}
			dst := model.Endpoint{
				IP:   backend.IP,
				Type: backendType,
				Port: backend.Port,
			}
			sub, err := np.CheckNetworkPolicy(src, dst, protocol)
			if err != nil {
				return ret, err
			}
			ret = append(ret, sub...)
		}
	}

	for _, np := range denies {
		ret = append(ret, model.Suspicion{Level: model.SuspicionLevelCritical, Message: fmt.Sprintf("network policy %v/%v deny the packet from %v to(%v) %v:%v",
			np.Namespace, np.Name,
			src.IP, protocol, dst.IP, dst.Port),
		})
	}
	return ret, nil
}