flowsearch
서브 쿼리로 정의한 플로우 규칙을 기반으로 네트워크 트래픽 레코드를 매칭합니다. 입력 레코드의 출발지/목적지 IP, 포트, 프로토콜 정보를 서브 쿼리 결과의 플로우 규칙과 비교하여 일치하는 규칙 목록을 _flow 필드에 할당합니다.
명령어 속성
| 항목 | 설명 |
|---|---|
| 명령어 유형 | 가공 쿼리 |
| 필요 권한 | 없음 |
| 라이선스 사용량 | 해당 없음 |
| 병렬 실행 | 지원 |
| 분산 실행 | 수집 노드에서 실행 (mapper) |
문법
옵션
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_ip | IP 주소 | 필수 | 출발지 IP 주소. IP 주소 타입이 아니면 _flowsearch_error 필드에 invalid-ip-type을 할당합니다. |
dst_ip | IP 주소 | 필수 | 목적지 IP 주소. IP 주소 타입이 아니면 _flowsearch_error 필드에 invalid-ip-type을 할당합니다. |
src_port | 32비트 정수 | 선택 | 출발지 포트 번호. 숫자 타입이 아니면 _flowsearch_error 필드에 invalid-src-port-type을 할당합니다. |
dst_port | 32비트 정수 | 선택 | 목적지 포트 번호. 숫자 타입이 아니면 _flowsearch_error 필드에 invalid-dst-port-type을 할당합니다. |
protocol | 문자열 | 선택 | 프로토콜 이름 |
출력 필드
| 필드 | 타입 | 설명 |
|---|---|---|
_flow | 배열 | 매칭된 플로우 규칙의 flow 필드 값 목록. 일치하는 규칙이 없으면 빈 배열을 할당합니다. |
_flowsearch_error | 문자열 | 오류 발생 시 오류 메시지. 서브 쿼리 오류 또는 입력 필드 타입 오류 시 할당됩니다. 정상 처리 시 할당하지 않습니다. |
오류 코드
파싱 오류
| 오류 코드 | 메시지 | 설명 |
|---|---|---|
| 90204 | [가 짝이 맞지 않습니다. | 대괄호 짝이 맞지 않는 경우 |
| 90206 | 서브 쿼리가 없습니다. | 서브 쿼리가 지정되지 않았거나 비어 있는 경우 |
런타임 오류
해당 사항 없음
설명
flowsearch 명령어는 서브 쿼리 결과를 플로우 규칙 테이블로 로드한 뒤, 각 입력 레코드의 네트워크 주소 정보를 규칙과 비교합니다. 서브 쿼리는 메인 쿼리보다 먼저 실행되며, 최대 10,000건의 규칙을 로드합니다.
매칭 과정은 다음과 같습니다:
- 입력 레코드의
src_ip와dst_ip를 각 규칙의 CIDR 프리픽스 길이로 마스킹하여 네트워크 주소를 계산합니다. - 규칙의 네트워크 주소와 입력 레코드의 네트워크 주소가 일치하는지 비교합니다.
- 네트워크 주소가 일치하면 포트와 프로토콜 조건을 추가로 확인합니다.
- 모든 조건이 일치하는 규칙의
flow값을_flow배열에 추가합니다.
서브 쿼리 결과에서 필수 필드(src_ip, dst_ip, src_cidr, dst_cidr, flow)가 누락되거나 타입이 잘못된 규칙은 무시됩니다.
입력 레코드의 src_ip 또는 dst_ip가 IP 주소 타입이 아니거나, 포트 필드가 숫자 타입이 아니면 _flowsearch_error 필드에 오류 메시지를 할당하고 _flow 필드는 할당하지 않습니다.
사용 예
이 사용 예에서 조회하는 WEB_APACHE_SAMPLE 테이블을 준비하려면 쿼리 실습용 데이터를 참고하세요.
-
인라인 플로우 규칙으로 매칭
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"]이 할당됩니다. -
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 _flowWEB_APACHE_SAMPLE의 각 요청을 플로우 규칙과 매칭하여 분류별 요청 수를 집계합니다. -
서브 쿼리 제한 시간 설정
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이 할당됩니다. -
포트 및 프로토콜 조건 없이 매칭
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 이전 버전부터 제공되었습니다.