flowsearch

서브 쿼리로 정의한 플로우 규칙을 기반으로 네트워크 트래픽 레코드를 매칭합니다. 입력 레코드의 출발지/목적지 IP, 포트, 프로토콜 정보를 서브 쿼리 결과의 플로우 규칙과 비교하여 일치하는 규칙 목록을 _flow 필드에 할당합니다.

명령어 속성

항목설명
명령어 유형가공 쿼리
필요 권한없음
라이선스 사용량해당 없음
병렬 실행지원
분산 실행수집 노드에서 실행 (mapper)

문법

flowsearch [timeout=INT{s|m|h|d}] [ SUBQUERY ]

옵션

timeout=INT{s|m|h|d|mon}
서브 쿼리 실행 제한 시간. 지정한 시간 내에 서브 쿼리가 완료되지 않으면 서브 쿼리를 취소하고 오류 메시지를 _flowsearch_error 필드에 할당합니다.

대상

[ SUBQUERY ]
대괄호([])로 감싼 서브 쿼리. 서브 쿼리 결과가 플로우 규칙으로 사용됩니다. 서브 쿼리 결과에는 다음 필드가 포함되어야 합니다:
  • src_ip (IP 주소, 필수): 출발지 네트워크 주소
  • dst_ip (IP 주소, 필수): 목적지 네트워크 주소
  • src_cidr (32비트 정수, 필수): 출발지 CIDR 프리픽스 길이 (0~32)
  • dst_cidr (32비트 정수, 필수): 목적지 CIDR 프리픽스 길이 (0~32)
  • src_port (32비트 정수, 선택): 출발지 포트 번호 (0~65535). 미지정 시 모든 포트와 매칭
  • dst_port (32비트 정수, 선택): 목적지 포트 번호 (0~65535). 미지정 시 모든 포트와 매칭
  • protocol (문자열, 선택): 프로토콜 이름. 미지정 시 모든 프로토콜과 매칭 (대소문자 무시)
  • flow (모든 타입, 필수): 규칙 식별자. 이 값이 매칭 결과에 포함됩니다. null이면 해당 규칙을 무시합니다.

입력 필드

필드타입필수 여부설명
src_ipIP 주소필수출발지 IP 주소. IP 주소 타입이 아니면 _flowsearch_error 필드에 invalid-ip-type을 할당합니다.
dst_ipIP 주소필수목적지 IP 주소. IP 주소 타입이 아니면 _flowsearch_error 필드에 invalid-ip-type을 할당합니다.
src_port32비트 정수선택출발지 포트 번호. 숫자 타입이 아니면 _flowsearch_error 필드에 invalid-src-port-type을 할당합니다.
dst_port32비트 정수선택목적지 포트 번호. 숫자 타입이 아니면 _flowsearch_error 필드에 invalid-dst-port-type을 할당합니다.
protocol문자열선택프로토콜 이름

출력 필드

필드타입설명
_flow배열매칭된 플로우 규칙의 flow 필드 값 목록. 일치하는 규칙이 없으면 빈 배열을 할당합니다.
_flowsearch_error문자열오류 발생 시 오류 메시지. 서브 쿼리 오류 또는 입력 필드 타입 오류 시 할당됩니다. 정상 처리 시 할당하지 않습니다.

오류 코드

파싱 오류
오류 코드메시지설명
90204[가 짝이 맞지 않습니다.대괄호 짝이 맞지 않는 경우
90206서브 쿼리가 없습니다.서브 쿼리가 지정되지 않았거나 비어 있는 경우
런타임 오류

해당 사항 없음

설명

flowsearch 명령어는 서브 쿼리 결과를 플로우 규칙 테이블로 로드한 뒤, 각 입력 레코드의 네트워크 주소 정보를 규칙과 비교합니다. 서브 쿼리는 메인 쿼리보다 먼저 실행되며, 최대 10,000건의 규칙을 로드합니다.

매칭 과정은 다음과 같습니다:

  1. 입력 레코드의 src_ipdst_ip를 각 규칙의 CIDR 프리픽스 길이로 마스킹하여 네트워크 주소를 계산합니다.
  2. 규칙의 네트워크 주소와 입력 레코드의 네트워크 주소가 일치하는지 비교합니다.
  3. 네트워크 주소가 일치하면 포트와 프로토콜 조건을 추가로 확인합니다.
  4. 모든 조건이 일치하는 규칙의 flow 값을 _flow 배열에 추가합니다.

서브 쿼리 결과에서 필수 필드(src_ip, dst_ip, src_cidr, dst_cidr, flow)가 누락되거나 타입이 잘못된 규칙은 무시됩니다.

입력 레코드의 src_ip 또는 dst_ip가 IP 주소 타입이 아니거나, 포트 필드가 숫자 타입이 아니면 _flowsearch_error 필드에 오류 메시지를 할당하고 _flow 필드는 할당하지 않습니다.

사용 예

이 사용 예에서 조회하는 WEB_APACHE_SAMPLE 테이블을 준비하려면 쿼리 실습용 데이터를 참고하세요.

  1. 인라인 플로우 규칙으로 매칭

    json "[{'src_ip': ip('192.0.2.1'), 'dst_ip': ip('198.51.100.1'), 'src_port': 12345, 'dst_port': 80, 'protocol': 'TCP'}]"
    | flowsearch [
        json "[{'src_ip': ip('192.0.2.0'), 'dst_ip': ip('198.51.100.0'), 'src_cidr': 24, 'dst_cidr': 24, 'dst_port': 80, 'protocol': 'TCP', 'flow': 'web-traffic'}]"
      ]
    

    출발지가 192.0.2.0/24 대역이고 목적지가 198.51.100.0/24 대역, 목적지 포트 80, TCP 프로토콜인 규칙과 매칭합니다. _flow 필드에 ["web-traffic"]이 할당됩니다.

  2. WEB_APACHE_SAMPLE의 출발지 IP를 플로우 규칙으로 분류

    table WEB_APACHE_SAMPLE
    | eval dst_ip = ip("203.0.113.1")
    | flowsearch src_ip, dst_ip [
        json "[{'src_ip': ip('0.0.0.0'), 'dst_ip': ip('0.0.0.0'), 'src_cidr': 0, 'dst_cidr': 0, 'flow': 'all-traffic'}]"
      ]
    | search len(_flow) > 0
    | stats count by _flow
    

    WEB_APACHE_SAMPLE의 각 요청을 플로우 규칙과 매칭하여 분류별 요청 수를 집계합니다.

  3. 서브 쿼리 제한 시간 설정

    json "[{'src_ip': ip('192.0.2.10'), 'dst_ip': ip('203.0.113.5')}]"
    | flowsearch timeout=10s [
        json "[{'src_ip': ip('192.0.2.0'), 'dst_ip': ip('203.0.113.0'), 'src_cidr': 24, 'dst_cidr': 24, 'flow': 'internal-to-external'}]"
      ]
    

    서브 쿼리가 10초 이내에 완료되지 않으면 취소합니다. 시간 초과 시 모든 입력 레코드의 _flowsearch_error 필드에 sub query timeout이 할당됩니다.

  4. 포트 및 프로토콜 조건 없이 매칭

    json "[{'src_ip': ip('192.0.2.10'), 'dst_ip': ip('203.0.113.5')}]"
    | flowsearch [
        json "[{'src_ip': ip('192.0.2.0'), 'dst_ip': ip('203.0.113.0'), 'src_cidr': 24, 'dst_cidr': 24, 'flow': 'internal-to-external'}]"
      ]
    

    포트와 프로토콜 조건 없이 네트워크 대역만으로 매칭합니다. src_port, dst_port, protocol 필드를 규칙에 지정하지 않으면 해당 조건을 검사하지 않습니다.

호환성

flowsearch 명령어는 소나 4.0 이전 버전부터 제공되었습니다.