개요
NetMonitor의 TCP·DNS는 실패 이벤트가 룰 매칭을 통과하면 바로 증상(detect 표 upsert)과 서버 전송으로 올라간다. 매니저 쪽 데이터에서 같은 (프로세스, 호스트/도메인) 조합의 반복 실패가 수십~수백 건씩 쌓이고 있어, 실제로 사람이 봐야 할 "복구 뒤 재발" 신호가 묻혔다.
NetMonitor 플러그인 내부에 (SUID, IP:포트)·(SUID, QueryName) 플래그 테이블을 두어, 복구 뒤 재발만 증상으로 올리고 그 밖은 삼키는 쪽으로 바꿨다.
설계 결정
- 영속화 없음. 메모리로만 유지하고 재시작 때 리셋한다.
- 신규 조합의 디폴트는 "플래그 꺼짐"이다. 성공이 한 번도 들지 않은 조합은 영구 silence 상태로 남는다.
- 축은 TCP가 (SUID, IP:포트), DNS가 (SUID, QueryName)이다. 상태 코드는 축에서 뺐다.
- TCP의 로컬 사유 처리는 다르다. 1020(방화벽 차단)은 플래그 밖이라 매번 올린다. 1030/1050은 수집을 중단했다.
- DNS는 기존 과탐 억제(
domainStats.detect >= 3)를 이중 안전망으로 그대로 유지한다. - 테이블 상한은 512, 초과 시 LRU 축출이다.
작업
TCP
- (SUID, IP:포트) 플래그 테이블 추가
- 1033(빠른 성공) → 플래그 ON, 1034/1045/1033(느림) → ON일 때 저장 + OFF
- 1020(방화벽 차단)은 플래그 밖에서 매번 올림
- 1030/1050 수집 중단(case 블록은 주석으로 보존)
DNS
- (SUID, QueryName) 플래그 테이블 추가(TCP와 동일한 구조)
- 3008 성공(ERROR_SUCCESS) → 플래그 ON
- 3008 실패 / 3011 서버 오류 / 1013·1014 타임아웃 → ON일 때 저장 + OFF, OFF면 삼킴
- 과탐 억제(
domainStats.detect >= 3)는 이중 안전망으로 그대로 유지
확인
TCP 실측
- 1시간 모니터링(자동 사이클 + 반복 횟수 3): 1 사이클당 실제 거부 3회. 플래그 미작동 대비 5.4배 압축을 확인했다(사이클 약 388회 시도, 저장 216건).
- 10분 극명 테스트(자동 사이클 + 대상 랜덤 + 실패만): 저장 0건. 각 호스트가 신규 조합이라 플래그가 디폴트 OFF이고, 성공이 한 번도 섞이지 않아 전부 삼켜졌다.
DNS 실측
- 10분 자연 환경 모니터링(리그 없이 평상 사용): 저장 0건. DNS 증상 17행 → 17행, DetectCount 합계 35 → 35로 변화가 없었다.
메모리 사용량
- 플래그 1개당 약 240바이트(Release)
- 상한 512가 가득 찬 상태에서 약 120KB(TCP·DNS 각각)
- 플러그인 전체는 여전히 1MB 미만
성능
- 삼키는 경로: 약 2µs 추가.
ExtractAllFields·UpsertDetect·서버 전송 등에서 수십~수백µs를 절감한다. - 띄우는 경로: 약 5µs 추가.
- 콜백당 평균 추가 비용은 5µs 미만으로, 수용 기준(1ms)에 200배 여유가 있다.
알려진 함의
폐쇄망이나 영구 거부 서버, 영구 NXDOMAIN 도메인처럼 성공이 한 번도 오지 않는 조합은 영구 silence로 남는다. 설계 의도 그대로다.
에이전트 재시작 뒤에는 테이블이 비어 있어 모든 조합이 신규로 간주된다. 재시작 뒤 첫 통신이 실패하면 삼켜지고, 성공 뒤 실패해야 증상이 뜬다.
관련 작업
실측에 쓴 리그는 OR-2583(TCP 증상 발생기)이다. 관련 분석은 SLOW_SUCCESS 판정(OR-2210), QPC 시각 처리(OR-2353), 프로세스 필터(OR-2466)에 있다. 후속 과제로 RST 증상을 1040/1044와 짝지어 올리는 작업(OR-2592)이 남아 있다.
Orange Platform 에이전트 NetMonitor의 반복 탐지 압축과 실측에 관한 기술 리포트입니다.