
수동 DNS 캡처 및 모니터링 툴킷
dnsmonster를 위한 관리형 SaaS 솔루션을 탐색 중입니다! 피드백과 요구 사항을 공유하여 패시브 DNS 모니터링의 미래를 함께 만들어 주세요: 간단한 설문 조사 참여
목차
Golang 기반의 패시브 DNS 모니터링 프레임워크입니다.
dnsmonster는 DNS 트래픽을 위한 패킷 스니퍼를 구현합니다. pcap 파일, 라이브 인터페이스 또는 dnstap 소켓에서 트래픽을 수락할 수 있으며,
일반 컴퓨터에서 초당 20만 개 이상의 DNS 쿼리를 인덱싱할 수 있는 것으로 입증된 바와 같이 초당 수십만 개의 DNS 쿼리를 인덱싱하고 저장하는 데 사용할 수 있습니다. 확장 가능하고 단순하며 사용하기 쉽도록 설계되어
보안 팀이 기업의 DNS 트래픽에 대한 세부 사항을 이해하는 데 도움을 줍니다. dnsmonster는 DNS 대화를 추적하지 않고, 들어오는 대로 DNS 패킷을 인덱싱하는 것을 목표로 합니다. 또한 최종 사용자의 프라이버시를 침해하지 않도록 설계되어,
레이어 3 IP(IPv4 및 IPv6)를 마스킹할 수 있어 팀이 개별 사용자에게 쿼리를 추적하지 않고 집계된 데이터에 대한 추세 분석을 수행할 수 있습니다. 블로그 게시물
1.x 이전 버전의 코드는 베타 품질로 간주되며 변경 사항이 있을 수 있습니다. 각 릴리스 간의 주요 변경 사항 목록과 잠재적 데이터 손실을 완화하는 방법을 확인하려면 각 태그의 릴리스 노트를 참조하십시오.```mermaid graph TD subgraph Input B1["network input"] B2["pcap file"] B3["dnstap socket"] end
subgraph "Process"
C1["Sampling based of ratio"]
C2["Packet Process"]
C3["Dispatcher"]
O11["Output1"]
O12["Domain Skip (optional)"]
O13["Domain Allow (optional)"]
O21["Output2"]
O22["Domain Skip (optional)"]
O23["Domain Allow (optional)"]
O31["Output3"]
O32["Domain Skip (optional)"]
O33["Domain Allow (optional)"]
end
B1 --> Process
B2 --> Process
B3 --> Process
C1 --> C2
C2 --> C3
C3 --> O11
C3 --> O21
C3 --> O31
O11 --> O12 --> O13
O21 --> O22 --> O23
O31 --> O32 --> O33
subgraph Output
Splunk
Syslog
H["ClickHouse"]
Postgres
Kafka
I["JSON File"]
Influx
Elastic
J["stdout"]
Parquet
Sentinel
end
O13 --> H
O23 --> I
O33 --> J
# 주요 기능
- 리눅스의 `afpacket` 및 제로 카피 패킷 캡처 사용 기능.
- BPF 지원
- 개인정보 보호 강화를 위한 IP 주소 마스킹 기능
- 전처리 샘플링 비율 설정 기능
- 특정 도메인/접미사/접두사를 스토리지에 기록하지 않도록 '건너뛰기' `fqdn` 목록을 가질 수 있는 기능
- 특정 도메인에 대한 액세스를 기록하는 데 사용되는 '허용' 도메인 목록을 가질 수 있는 기능
- 건너뛰기 및 허용 도메인 파일/URL의 핫 리로드
- 출력 스트림별로 구성 가능한 로직을 갖춘 모듈식 출력.
- ClickHouse의 TTL 속성을 사용한 자동 데이터 보존 정책
- ClickHouse 출력용 내장 Grafana 대시보드.
- 단일 정적으로 링크된 바이너리로 배포 가능
- 환경 변수, 명령줄 옵션 또는 구성 파일을 사용하여 구성 가능
- ClickHouse의 SAMPLE 기능을 사용하여 출력 샘플링 가능
- `prometheus` 및 `statstd`를 사용하여 메트릭 전송 가능
- ClickHouse의 내장 LZ4 스토리지 덕분에 높은 압축률
- DNS Over TCP, 조각화된 DNS(udp/tcp) 및 IPv6 지원
- Unix 소켓 또는 TCP를 통한 [dnstap](https://github.com/dnstap/golang-dnstap) 지원
- Splunk 및 Microsoft Sentinel과의 내장 SIEM 통합
# 설치
## Linux
`dnsmonster`를 시작하는 가장 좋은 방법은 릴리스 섹션에서 바이너리를 다운로드하는 것입니다. 바이너리는 `musl`에 대해 정적으로 빌드되었으므로 대부분의 배포판에서 즉시 작동합니다. `afpacket` 지원을 위해서는 커널 3.x+를 사용해야 합니다. 최신 Linux 배포판(CentOS/RHEL 7+, Ubuntu 14.0.4.2+, Debian 7+)은 3.x+ 버전과 함께 제공되므로 즉시 작동합니다. 배포판이 사전 컴파일된 버전에서 작동하지 않는 경우, 세부 정보와 함께 이슈를 제출하고 이 섹션 [수동 빌드](#build-manually)를 사용하여 `dnsmonster`를 수동으로 빌드하세요.
### 컨테이너
`dnsmonster`는 원시 패킷 캡처 기능을 사용하므로 Docker/Podman 데몬은 컨테이너에 해당 기능을 부여해야 합니다.```
sudo docker run --rm -it --net=host --cap-add NET_RAW --cap-add NET_ADMIN --name dnsmonster ghcr.io/mosajjal/dnsmonster:latest --devName lo --stdoutOutputType=1
libpcap 사용 시:
go, libpcap-devel, linux-headers 패키지가 설치되어 있는지 확인하세요. 패키지 이름은 사용 중인 배포판에 따라 다를 수 있습니다. 그런 다음 저장소를 클론하고 go build ./cmd/dnsmonster를 실행하기만 하면 됩니다.```sh
git clone https://github.com/mosajjal/dnsmonster --depth 1 /tmp/dnsmonster
cd /tmp/dnsmonster
go get
go build -o dnsmonster ./cmd/dnsmonster- `libpcap` 없이:
`dnsmonster`는 `libpcap`에서 한 가지 함수만 사용하는데, 그것은 `tcpdump` 스타일 필터를 BPF 바이트코드로 변환하는 것입니다. BPF 지원 없이도 괜찮다면 `libpcap` 없이 `dnsmonster`를 빌드할 수 있습니다. 다른 모든 플랫폼에서는 패킷 캡처가 `libpcap`으로 대체되므로 하드 종속성이 됩니다. (*BSD, Windows, Darwin)```sh
git clone https://github.com/mosajjal/dnsmonster --depth 1 /tmp/dnsmonster
cd /tmp/dnsmonster
go get
go build -o dnsmonster -tags nolibpcap ./cmd/dnsmonster
위 빌드는 ARMv7 (RPi4) 및 AArch64에서도 작동합니다.
libpcap.a 사본이 있다면, 이를 dnsmonster에 정적으로 링크하여 완전히 정적으로 빌드할 수 있습니다. 아래 코드에서 /root/libpcap-1.9.1/libpcap.a를 사용자의 사본 위치로 변경하십시오.```
git clone https://github.com/mosajjal/dnsmonster --depth 1 /tmp/dnsmonster
cd /tmp/dnsmonster/
go get
go build --ldflags "-L /root/libpcap-1.9.1/libpcap.a -linkmode external -extldflags "-I/usr/include/libnl3 -lnl-genl-3 -lnl-3 -static"" -a -o dnsmonster ./cmd/dnsmonster
정적으로 링크된 바이너리가 어떻게 만들어지는지에 대한 자세한 내용은 [이](https://github.com/fenkohq/dnsmonster/blob/main/Dockerfile) Dockerfile을 참조하세요.
## Windows
Windows에서 빌드하는 것은 Linux와 거의 동일합니다. `npcap`이 설치되어 있는지 확인하기만 하면 됩니다. 저장소를 클론하고 (`--history 1` 작동), `go get`과 `go build ./cmd/dnsmonster`를 실행하세요.
앞서 언급했듯이, Windows용 바이너리 릴리스는 [npcap](https://nmap.org/npcap/#download)이 설치되어 있어야 합니다. 설치 후 바이너리는 별도의 설정 없이 작동합니다. Windows 10 환경에서 테스트되었으며 문제 없이 실행되었습니다. `--devName` 매개변수에 제공할 인터페이스 이름을 찾고 스니핑을 시작하려면 다음을 수행해야 합니다:
- 관리자 권한으로 cmd.exe를 열고 다음을 실행하세요: `getmac.exe`, 그러면 인터페이스의 MAC 주소와 Transport Name 열이 있는 테이블이 표시됩니다. 예: `\Device\Tcpip_{16000000-0000-0000-0000-145C4638064C}`
- `cmd.exe`에서 `dnsmonster.exe`를 다음과 같이 실행하세요:```sh
dnsmonster.exe --devName \Device\NPF_{16000000-0000-0000-0000-145C4638064C}
참고로 getmac.exe에서 \Tcpip를 \NPF로 변경한 후 dnsmonster.exe에 전달해야 합니다.
Linux 및 Windows와 거의 동일하며, git, libpcap 및 go가 설치되어 있는지 확인한 후 동일한 지침을 따릅니다:```sh
git clone https://github.com/mosajjal/dnsmonster --depth 1 /tmp/dnsmonster
cd /tmp/dnsmonster
go get
go build -o dnsmonster ./cmd/dnsmonster
# 아키텍처
## Docker를 사용한 올인원 설치

예제 다이어그램에서 DNS 서버 트래픽의 송신/수신을 캡처한 후, DNSMonster 서버에 도달하기 전에 선택적 패킷 집계 계층이 추가됩니다. DNS 서버에서 나가는 아웃바운드 데이터는 DNS 팜의 캐시 및 성능 분석을 수행하는 데 매우 유용합니다. 집계기를 사용할 수 없는 경우, 두 TAP을 DNSMonster에 직접 연결하고 두 개의 DNSMonster 에이전트가 트래픽을 감시하도록 할 수 있습니다.
`./autobuild.sh`를 실행하면 여러 컨테이너가 생성됩니다:
* `dnsmonster`의 여러 인스턴스가 모든 인터페이스에서 트래픽을 감시합니다. 인터페이스 목록은 `autobuild.sh` 실행 중에 입력하라는 메시지가 표시됩니다.
* `clickhouse` 인스턴스가 `dnsmonster`의 출력을 수집하고 모든 로그/데이터를 데이터 및 로그 디렉토리에 저장합니다. 두 디렉토리는 `autobuild.sh` 실행 중에 입력하라는 메시지가 표시됩니다.
* `grafana` 인스턴스가 `clickhouse` 데이터를 조회하고 미리 구축된 대시보드를 제공합니다.
### 올인원 데모
[](static/aio_demo.svg)
## 엔터프라이즈 배포

# 구성