업데이트로 돌아가기
New releaseJul 21, 2026

dnsdiag v2.9.4

DNS 측정, 문제 해결 및 보안 감사 도구 세트

공유

PyPI PyPI Downloads Downloads PyPI Docker Pulls GitHub stars

DNS 측정, 문제 해결 및 보안 감사 도구 세트

ISP가 귀하의 DNS 트래픽을 가로채고 있는지) 궁금한 적이 있으신가요? DNS 응답에서 비정상적인 동작을 발견했거나, 잘못된 주소로 리디렉션되어 DNS에 문제가 있다고 의심된 적이 있으신가요? 저희는 DNS 요청과 응답에 대한 기본 감사를 수행하여 DNS가 예상대로 작동하는지 확인할 수 있는 도구 세트를 제공합니다.

dnsping을 사용하면 임의의 쿼리에 대해 모든 DNS 서버의 응답 시간을 측정할 수 있습니다. 일반적인 ping 유틸리티와 유사하게, dnsping은 DNS 요청에 대해 유사한 기능을 제공하여 서버 응답성을 모니터링하는 데 도움을 줍니다.

또한 dnstraceroute를 사용하여 DNS 요청이 목적지까지 이동하는 경로를 추적하여 리디렉션되거나 가로채지고 있는지 확인할 수 있습니다. 동일한 서버로 전송된 DNS 쿼리를 비교함으로써 dnstraceroute는 이동 경로의 차이점을 관찰하여 잠재적인 문제를 알려줍니다.

dnseval은 여러 DNS 확인자를 평가하여 네트워크에 가장 적합한 DNS 확인자를 선택하는 데 도움을 줍니다. 타사 DNS 확인자에 의존하는 것을 피하기 위해 자체 DNS 확인자를 사용하는 것이 권장되지만, 필요할 때 dnseval은 최적의 DNS 확인자를 선택하는 데 도움을 줄 수 있습니다. 성능(지연 시간)과 신뢰성(패킷 손실)을 기준으로 DNS 서버를 비교하여 정보에 기반한 의사 결정을 위한 포괄적인 보기를 제공합니다.

설치

이 도구 세트를 사용하는 방법은 여러 가지가 있지만, 최적의 유연성과 제어를 위해 소스 코드에서 직접 실행하는 것을 권장합니다.

소스 코드

  1. git 저장소를 체크아웃하고 종속성을 설치합니다:
git clone https://github.com/farrokhi/dnsdiag.git
cd dnsdiag
pip3 install -r requirements.txt
  1. 또는 pip를 사용하여 패키지를 설치할 수 있습니다:
pip3 install dnsdiag

uv 사용 (권장)

uv는 설치 없이 도구를 직접 실행할 수 있는 빠른 Python 패키지 관리자입니다:

# 설치 없이 dnsping 직접 실행
uvx --from dnsdiag dnsping google.com

# 특정 옵션으로 실행
uvx --from dnsdiag dnsping -c 5 --tls -s 8.8.8.8 example.com

# dnstraceroute 실행
uvx --from dnsdiag dnstraceroute cloudflare.com

# dnseval 실행
uvx --from dnsdiag dnseval -f public-servers.txt github.com

dnsdiag를 영구적으로 설치하려면:

# dnsdiag 도구 설치
uv tool install dnsdiag

# 최신 버전으로 업그레이드
uv tool upgrade dnsdiag

바이너리 패키지

때때로 Windows, Mac OS X 및 Linux용 바이너리 패키지가 출시됩니다. 최신 릴리스는 릴리스 페이지에서 다운로드할 수 있습니다.

지원 플랫폼

사전 빌드된 바이너리는 다음에서 사용 가능합니다:

  • Linux (x86_64, ARM64)
  • macOS (Intel, Apple Silicon)
  • Windows (x86_64)

Windows ARM64는 현재 기본 컴파일 도구 체인을 필요로 하는 빌드 종속성 문제로 인해 지원되지 않습니다. ARM Windows를 사용하는 경우 Windows Subsystem for Linux (WSL2)를 사용하거나 소스에서 직접 설치하여 dnsdiag를 실행할 수 있습니다.

Docker

로컬 머신에 dnsdiag를 설치하지 않으려면 Docker 이미지를 사용하여 컨테이너화된 환경에서 도구를 실행할 수 있습니다. 예를 들어:

docker run --network host -it --rm farrokhi/dnsdiag dnsping.py

dnsping

dnsping은 임의의 DNS 쿼리를 여러 번 전송하여 DNS 확인자를 "핑"할 수 있게 해줍니다. 지원되는 명령줄 옵션의 전체 목록은 --help를 사용하세요. 몇 가지 주요 플래그는 다음과 같습니다:

  • --tcp, --tls, --doh, --quic 또는 --http3를 사용하여 전송 프로토콜을 선택합니다 (기본값은 UDP). 이러한 옵션은 상호 배타적입니다. 한 명령에 하나의 프로토콜만 지정할 수 있습니다.
  • --flags를 사용하여 각 응답에 대한 응답 플래그 (EDNS 플래그 포함)를 표시합니다.
  • --dnssec를 사용하여 사용 가능한 경우 DNSSEC 검증을 요청합니다.
  • 확장 DNS 오류 메시지 (RFC 8914)는 존재할 때 자동으로 표시됩니다.
  • --nsid를 사용하여 사용 가능한 경우 Name Server Identifier (NSID)를 표시합니다 (RFC 5001).
  • --ecs를 사용하여 지리적 라우팅 최적화를 위한 EDNS Client Subnet 정보를 포함합니다.
  • --cookie를 사용하여 응답에 존재할 때 DNS 쿠키 (RFC 7873)를 표시합니다.
./dnsping.py -c 5 --dnssec --flags --tls -t AAAA -s 8.8.8.8 brokendnssec.net
dnsping.py DNS: 8.8.8.8:853, hostname: brokendnssec.net, proto: TLS, class: IN, type: AAAA, flags: [RD]
75  bytes from 8.8.8.8: seq=1   time=73.703 ms  SERVFAIL [QR RD RA -- DO] [EDE:10("For brokendnssec.net/soa")]
75  bytes from 8.8.8.8: seq=2   time=69.523 ms  SERVFAIL [QR RD RA -- DO] [EDE:10("For brokendnssec.net/soa")]
75  bytes from 8.8.8.8: seq=3   time=58.058 ms  SERVFAIL [QR RD RA -- DO] [EDE:10("For brokendnssec.net/soa")]
75  bytes from 8.8.8.8: seq=4   time=54.235 ms  SERVFAIL [QR RD RA -- DO] [EDE:10("For brokendnssec.net/soa")]
75  bytes from 8.8.8.8: seq=5   time=57.806 ms  SERVFAIL [QR RD RA -- DO] [EDE:10("For brokendnssec.net/soa")]

--- 8.8.8.8 dnsping statistics ---
5 requests transmitted, 5 responses received, 0% lost
min=54.235 ms, avg=22.665 ms, max=69.523 ms, stddev=38.202 ms

dnsping은 또한 최소, 최대, 평균 응답 시간과 지터(표준 편차) 및 패킷 손실과 같은 통계를 제공합니다.

다음은 dnsping의 몇 가지 흥미로운 사용 사례입니다:

  • 다양한 전송 프로토콜(예: UDP vs DoH) 간의 응답 시간 비교.
  • 지터 및 패킷 손실 측정을 통해 DNS 서버의 신뢰성 평가.
  • --dnssec 플래그를 사용하여 DNSSEC 활성화 상태에서 응답 시간 측정.
  • 지리적 위치 인식 응답을 위한 EDNS Client Subnet 동작 테스트:
./dnsping.py -c 3 --ecs 203.0.113.0/24 -s 94.140.14.14 google.com
dnsping.py DNS: 94.140.14.14:53, hostname: google.com, proto: UDP, class: IN, type: A, flags: [RD]
66  bytes from 94.140.14.14: seq=1   time=31.407 ms  NOERROR [ECS:203.0.113.0/24/24]
66  bytes from 94.140.14.14: seq=2   time=29.156 ms  NOERROR [ECS:203.0.113.0/24/24]
66  bytes from 94.140.14.14: seq=3   time=30.892 ms  NOERROR [ECS:203.0.113.0/24/24]

--- 94.140.14.14 dnsping statistics ---
3 requests transmitted, 3 responses received, 0% lost
min=29.156 ms, avg=30.485 ms, max=31.407 ms, stddev=1.176 ms
  • NSID 옵션을 사용한 DNS 서버 식별:
./dnsping.py -c 2 --nsid -s 8.8.8.8 google.com
dnsping.py DNS: 8.8.8.8:53, hostname: google.com, proto: UDP, class: IN, type: A, flags: [RD]
68  bytes from 8.8.8.8: seq=1   time=36.399 ms  NOERROR [NSID:gpdns-ams]
68  bytes from 8.8.8.8: seq=2   time=32.156 ms  NOERROR [NSID:gpdns-ams]

--- 8.8.8.8 dnsping statistics ---
2 requests transmitted, 2 responses received, 0% lost
min=32.156 ms, avg=34.278 ms, max=36.399 ms, stddev=2.122 ms
  • 향상된 보안 및 캐시 최적화를 위한 DNS 쿠키 테스트:
./dnsping.py -c 2 --cookie -s anyns.pch.net quad9.net
dnsping.py DNS: anyns.pch.net:53, hostname: quad9.net, proto: UDP, class: IN, type: A, flags: [RD]
82  bytes from anyns.pch.net: seq=1   time=30.552  ms  NOERROR [COOKIE:27f609c017bb2ec4ea70de5c68eec3fc39f6a53ee49c55f8]
82  bytes from anyns.pch.net: seq=2   time=24.794  ms  NOERROR [COOKIE:719631dd9fcce722d3ac859b68eec3fd2e5430b5c8a7f8cf]

--- anyns.pch.net dnsping statistics ---
2 requests transmitted, 2 responses received, 0% lost
min=24.794 ms, avg=27.673 ms, max=30.552 ms, stddev=4.072 ms

DNSSEC 및 보안 관련 플래그 해석

--dnssec--flags를 사용할 때 dnsping은 DNS 보안 검증에 직접적으로 관련된 DNS 프로토콜 필드를 노출합니다. 이러한 값은 확인자가 DNSSEC을 검증할 수 있는지 여부와 응답이 성공적으로 확인되었는지 여부를 나타냅니다.

일반적인 플래그:

  • DO (DNSSEC OK)
    클라이언트가 DNSSEC 관련 레코드를 요청하고 있음을 나타냅니다. 이 플래그가 있으면 확인자가 DNSSEC 쿼리를 지원한다는 것을 보여줍니다.

  • AD (Authenticated Data)
    응답이 DNSSEC를 사용하여 암호화 방식으로 검증되었을 때 검증 확인자에 의해 설정됩니다. 이는 DNSSEC 검증이 활성화되고 성공적임을 나타내는 강력한 신호입니다.

일반적인 패턴:

결과의미
NOERRORAD 플래그DNSSEC 검증 성공
SERVFAILDO 플래그DNSSEC 검증 실패 (종종 잘못된 서명 또는 잘못된 구성으로 인해 발생)
AD 플래그 없음확인자가 DNSSEC 검증을 수행하지 않음

확장 DNS 오류(EDE, RFC 8914)는 DNSSEC 검증이 실패할 때 추가 진단 정보를 제공합니다. 예를 들어:

  • EDE:10DNSSEC Bogus (잘못되었거나 깨진 DNSSEC 데이터)
  • EDE:6DNSSEC Signature Expired (DNSSEC 서명 만료)
  • EDE:7DNSSEC Signature Not Yet Valid (DNSSEC 서명 아직 유효하지 않음)

이러한 지표는 dnsping이 성능 테스트뿐만 아니라 확인자가 DNSSEC를 올바르게 적용하는지 검증하고 DNSSEC 배포 문제를 진단하는 데 유용하게 만듭니다.

dnstraceroute

dnstraceroute는 DNS 요청이 목적지까지 이동하는 경로를 추적하는 유틸리티입니다. 실제 네트워크 traceroute와 비교하여 DNS 트래픽이 원치 않는 경로를 통해 라우팅되지 않는지 확인할 수 있습니다.

dnstraceroute는 여러 전송 프로토콜(상호 배타적)을 지원합니다:

  • UDP (기본값) - 기존 DNS 쿼리
  • TCP (--tcp) - DNS over TCP
  • DoQ (--quic) - DNS over QUIC (AdGuard DNS 지원)
  • DoH3 (--http3) - DNS over HTTP/3 (Google DNS 및 Cloudflare 지원)
./dnstraceroute.py --expert --asn -C -t A -s 8.8.4.4 facebook.com

최신 DNS 프로토콜도 테스트할 수 있습니다:

# AdGuard DNS로 DNS over QUIC 테스트
./dnstraceroute.py --quic -s 94.140.14.14 -c 3 google.com

# Google DNS로 DNS over HTTP/3 테스트
./dnstraceroute.py --http3 -s 8.8.8.8 -c 3 google.com
dnstraceroute.py DNS: 8.8.4.4:53, hostname: facebook.com, rdatatype: A
1	192.168.0.1 (192.168.0.1) 1 ms
2	192.168.28.177 (192.168.28.177) 4 ms
3	192.168.0.1 (192.168.0.1) 693 ms
4	172.19.4.17 (172.19.4.17) 3 ms
5	dns.google (8.8.4.4) [AS15169 GOOGLE, US] 8 ms

=== Expert Hints ===
 [*] public DNS server is next to a private IP address (possible hijacking)

dnstraceroute와 함께 --expert 플래그를 사용하면 잠재적인 DNS 트래픽 하이재킹에 대한 경고를 포함한 전문가 힌트가 표시됩니다.

dnseval

dnseval은 지정된 DNS 서버 목록에 임의의 DNS 쿼리를 전송하여 응답 시간을 동시에 비교할 수 있는 대량 핑 유틸리티입니다.

dnseval을 사용하여 UDP(기본값), TCP, DoT(DNS over TLS), DoH(DNS over HTTPS), DoQ(DNS over QUIC) 및 DoH3(DNS over HTTP/3)를 포함한 다양한 전송 프로토콜 간의 응답 시간을 평가할 수 있습니다. 각각 --tcp, --tls, --doh, --quic--http3 플래그를 사용합니다. 이러한 프로토콜 옵션은 상호 배타적입니다. 한 명령에 하나만 지정할 수 있습니다.

프로토콜 지원 요약

도구UDPTCPTLS (DoT)DoHDoQDoH3
dnsping
dnstraceroute--
dnseval

DoQ: DNS over QUIC, DoH3: DNS over HTTP/3

./dnseval.py --skip-warmup --dnssec -c10 -f public-servers.txt ripe.net
server                   avg(ms)  min(ms)  max(ms)  stddev(ms)  lost(%)  ttl      flags                      response
---------------------------------------------------------------------------------------------------------------------
1.0.0.1                  29.01    14.15    45.36    8.60        %0       300      QR -- -- RD RA AD -- DO     NOERROR
1.1.1.1                  23.90    18.14    42.07    7.83        %0       300      QR -- -- RD RA AD -- DO     NOERROR
1.0.0.2                  25.90    21.36    31.58    4.26        %0       300      QR -- -- RD RA AD -- DO     NOERROR
1.1.1.2                  22.68    18.36    32.15    3.96        %0       300      QR -- -- RD RA AD -- DO     NOERROR
1.0.0.3                  22.53    18.98    32.52    3.94        %0       300      QR -- -- RD RA AD -- DO     NOERROR
1.1.1.3                  21.70    20.25    22.97    0.77        %0       299      QR -- -- RD RA AD -- DO     NOERROR
2606:4700:4700::1001     21.70    19.13    27.50    2.28        %0       299      QR -- -- RD RA AD -- DO     NOERROR
2606:4700:4700::1111     22.63    20.42    30.18    3.13        %0       299      QR -- -- RD RA AD -- DO     NOERROR
2606:4700:4700::1002     24.97    20.89    44.63    7.16        %0       299      QR -- -- RD RA AD -- DO     NOERROR
2606:4700:4700::1112     23.24    21.37    25.87    1.48        %0       298      QR -- -- RD RA AD -- DO     NOERROR
2606:4700:4700::1003     21.68    19.28    24.88    1.65        %0       298      QR -- -- RD RA AD -- DO     NOERROR
2606:4700:4700::1113     22.61    19.86    26.09    1.73        %0       299      QR -- -- RD RA AD -- DO     NOERROR
195.46.39.39             25.56    16.42    55.37    15.37       %0       300      QR -- -- RD RA -- -- --     NOERROR
195.46.39.40             19.08    16.51    23.86    2.24        %0       300      QR -- -- RD RA -- -- --     NOERROR
2a05:d014:939:3300::39   0.00     0.00     0.00     0.00        %100     N/A      -- -- -- -- -- -- -- --     No Response
2a05:d014:939:3300::40   0.00     0.00     0.00     0.00        %100     N/A      -- -- -- -- -- -- -- --     No Response
208.67.220.220           30.60    14.54    120.64   31.88       %0       300      QR -- -- RD RA AD -- DO     NOERROR
208.67.222.222           21.78    17.42    36.45    6.06        %0       50       QR -- -- RD RA AD -- DO     NOERROR
2620:0:ccc::2            29.48    19.23    98.29    24.22       %0       299      QR -- -- RD RA AD -- DO     NOERROR
2620:0:ccd::2            22.36    17.90    30.18    3.98        %0       299      QR -- -- RD RA AD -- DO     NOERROR
216.146.35.35            172.53   114.46   360.87   71.47       %0       299      QR -- -- RD RA AD -- DO     NOERROR
216.146.36.36            187.36   118.21   324.32   59.08       %0       110      QR -- -- RD RA AD -- DO     NOERROR
209.244.0.3              46.49    25.23    115.86   28.19       %0       300      QR -- -- RD RA -- -- DO     NOERROR
209.244.0.4              58.33    28.09    109.18   29.20       %0       299      QR -- -- RD RA -- -- DO     NOERROR
4.2.2.1                  64.58    30.21    86.79    30.19       %25      299      QR -- -- RD RA -- -- DO     NOERROR
4.2.2.2                  40.54    22.69    74.80    20.76       %0       70       QR -- -- RD RA -- -- DO     NOERROR
4.2.2.3                  90.62    90.62    90.62    0.00        %50      70       QR -- -- RD RA -- -- DO     NOERROR
4.2.2.4                  31.53    23.80    70.93    14.51       %0       294      QR -- -- RD RA -- -- DO     NOERROR
4.2.2.5                  24.11    24.05    24.18    0.09        %33      294      QR -- -- RD RA -- -- DO     NOERROR
80.80.80.80              0.00     0.00     0.00     0.00        %100     N/A      -- -- -- -- -- -- -- --     No Response
80.80.81.81              0.00     0.00     0.00     0.00        %100     N/A      -- -- -- -- -- -- -- --     No Response
8.8.4.4                  28.35    20.85    39.14    7.24        %0       300      QR -- -- RD RA AD -- DO     NOERROR
8.8.8.8                  21.22    16.22    24.93    2.39        %0       299      QR -- -- RD RA AD -- DO     NOERROR

결과를 JSONL 형식으로 저장하여 추가 처리할 수도 있습니다. 출력 파일의 각 줄은 하나의 DNS 서버에 대한 전체 측정 결과를 포함하는 유효한 JSON 객체입니다.

./dnseval.py -c 5 -j results.jsonl -f public-servers.txt example.com

출력은 jq와 같은 표준 JSON 도구를 사용하여 줄 단위로 구문 분석할 수 있습니다.

cat results.jsonl | jq -r 'select(.data.r_lost_percent == 0) | .data.resolver'

저자

Babak Farrokhi

라이선스

dnsdiag는 2항 BSD 라이선스 하에 출시됩니다.

카테고리