gbmin's Tech Notes

서버 구축 및 유지보수, 클라우드 컴퓨팅, 네트워크 보안, IT 분야 기술 노트. :)

Tech Notes/Network & DNS

python으로 만든 DNS 쿼리 스크립트

gbmin 2023. 7. 18. 22:05

ChatGTP 코드 인터프리터 기능의 도움을 받아 python으로 작성한 DNS 쿼리 스크립트이다. dig를 이용해 DNS 조회하고, 여러 네트워크망에 DNS 쿼리를 한 번에 하여 현재 내 도메인의 DNS 설정값이 안정적인지 파악해 볼 수 있게 하였다. 


[목차]

1. DNS 쿼리 스크립트

사용 방법

쿼리 결과 확인 방법

스크립트 소스

2. 리버스 DNS 체크 스크립트

사용 방법

쿼리 결과 확인 방법

스크립트 소스


1. DNS 쿼리 스크립트

사용 방법

dg [조회할 도메인명]

 

쿼리 결과 확인 방법

Set NameServers 섹션 : 조회한 도메인이 설정된 NS 정보조회를 하여 DNS가 어디인지 조회한다.
Query Domain Name Servers 섹션 :
조회된 도메인의 NS에 A 레코드와 MX 레코드를 조회한다.
Query external public DNS 섹션 : 공개된 ISP 사업자(KT, SK, LG) DNS와 GoogleDNS에 조회한다.

 

각 세션의 정보가 아래와 같이 일치하면 DNS 가 안정화 된 것이며 각 세션의 정보가 맞지 않는다면 세션에 해당하는 정보를 체크해 원인 파악 및 조치해 나가면 된다.

root@gbminnote:~# dg gbminnote.com

############### Set NameServers
# f.gtld-servers.net
gbminnote.com.          172800  IN      NS      gerald.ns.cloudflare.com.
gbminnote.com.          172800  IN      NS      serena.ns.cloudflare.com.
gerald.ns.cloudflare.com. 172800 IN     A       108.162.193.168
gerald.ns.cloudflare.com. 172800 IN     A       172.64.33.168
gerald.ns.cloudflare.com. 172800 IN     A       173.245.59.168
gerald.ns.cloudflare.com. 172800 IN     AAAA    2606:4700:58::adf5:3ba8
gerald.ns.cloudflare.com. 172800 IN     AAAA    2803:f800:50::6ca2:c1a8
gerald.ns.cloudflare.com. 172800 IN     AAAA    2a06:98c1:50::ac40:21a8
serena.ns.cloudflare.com. 172800 IN     A       108.162.192.220
serena.ns.cloudflare.com. 172800 IN     A       172.64.32.220
serena.ns.cloudflare.com. 172800 IN     A       173.245.58.220
serena.ns.cloudflare.com. 172800 IN     AAAA    2606:4700:50::adf5:3adc
serena.ns.cloudflare.com. 172800 IN     AAAA    2803:f800:50::6ca2:c0dc
serena.ns.cloudflare.com. 172800 IN     AAAA    2a06:98c1:50::ac40:20dc

############### Query Domain Name Servers
# gerald.ns.cloudflare.com
gbminnote.com.          300     IN      A       27.0.236.139
gbminnote.com.          300     IN      MX      10 mail.gbminnote.com.
mail.gbminnote.com.     300     IN      A       211.37.179.216
# serena.ns.cloudflare.com
gbminnote.com.          300     IN      A       27.0.236.139
gbminnote.com.          300     IN      MX      10 mail.gbminnote.com.
mail.gbminnote.com.     300     IN      A       211.37.179.216

############### Query external public DNS
# Google 8.8.8.8
gbminnote.com.          300     IN      A       27.0.236.139
gbminnote.com.          300     IN      MX      10 mail.gbminnote.com.

# KT 168.126.63.1
gbminnote.com.          300     IN      A       27.0.236.139
gbminnote.com.          300     IN      MX      10 mail.gbminnote.com.
mail.gbminnote.com.     300     IN      A       211.37.179.216

# SK 219.250.36.130
gbminnote.com.          300     IN      A       27.0.236.139
gbminnote.com.          300     IN      MX      10 mail.gbminnote.com.

# LG 164.124.101.2
gbminnote.com.          300     IN      A       27.0.236.139
gbminnote.com.          300     IN      MX      10 mail.gbminnote.com.

 

 

스크립트 소스

세팅 방법 : /usr/bin/dg 파일명으로 저장하여 퍼미션을 700으로 넣고 사용한다.

#!/usr/bin/env python3

import subprocess
import sys

def run_dig(server, domain, query_type='A'):
    result = subprocess.run(['dig', f'@{server}', domain, '-t', query_type], stdout=subprocess.PIPE)
    lines = [line for line in result.stdout.decode().split('\n') if line and not line.startswith(';') and not line.startswith('dig:')]
    return lines

def main(domain):
    print(f"\n############### Set NameServers")
    print("# f.gtld-servers.net")
    results = run_dig('f.gtld-servers.net', domain, 'NS')
    for line in results:
        print(line)

    ns_records = [line.split()[-1].rstrip('.') for line in results if 'IN       NS' in line]

    for ns in ns_records:
        print(f"\n############### Query Domain Name Servers")
        print(f"# {ns}")
        results = run_dig(ns, domain)
        results.extend(run_dig(ns, domain, 'MX'))
        for line in results:
            print(line)


    print(f"\n############### Query external public DNS")
    print("# Google 8.8.8.8")
    results = run_dig('8.8.8.8', domain)
    results.extend(run_dig('8.8.8.8', domain, 'MX'))
    for line in results:
        print(line)

    print("\n# KT 168.126.63.1")
    results = run_dig('168.126.63.1', domain)
    results.extend(run_dig('168.126.63.1', domain, 'MX'))
    for line in results:
        print(line)

    print("\n# SK 219.250.36.130")
    results = run_dig('219.250.36.130', domain)
    results.extend(run_dig('219.250.36.130', domain, 'MX'))
    for line in results:
        print(line)

    print("\n# LG 164.124.101.2")
    results = run_dig('164.124.101.2', domain)
    results.extend(run_dig('164.124.101.2', domain, 'MX'))
    for line in results:
        print(line)

if __name__ == '__main__':
    if len(sys.argv) != 2:
        print("Usage: ddd <domain>")
        sys.exit(1)

    main(sys.argv[1])

 

 

2. 리버스 DNS 체크 스크립트

리버스 DNS는 아이피를 조회했을 때 해당 아이피에 등록된 호스트를 등록하는 정책이다 인터넷 서비스 공급 업체(ISP)를 통해 등록해야 하며 등록완료 후 DNS 반영 까지는 약 24시간 정도 소요된다. 이 역시 간단한 스크립트로 사용할 수 있게 작성했다.

 

사용 방법

dg [조회할 아이피]

 

쿼리 결과 확인 방법

아이피를 조회하면 Google, KT, SK, LG 망 회선에 정상적으로 반영되었는지 확인이 가능하다.

root@gbminnote:~# dr 142.250.207.69
# Google 8.8.8.8 Reverse DNS
hkg12s32-in-f5.1e100.net.

# KT 168.126.63.1 Reverse DNS
hkg12s32-in-f5.1e100.net.

# SK 219.250.36.130 Reverse DNS
hkg12s32-in-f5.1e100.net.

# LG 164.124.101.2 Reverse DNS
hkg12s32-in-f5.1e100.net.

 

스크립트 소스

세팅 방법 : /usr/bin/dr 파일명으로 저장하여 퍼미션을 700으로 넣고 사용한다.

#!/usr/bin/env python3

import subprocess
import sys

def run_dig_reverse(server_name, server_ip, ip):
    print(f"# {server_name} {server_ip} Reverse DNS")
    result = subprocess.run(['dig', f'@{server_ip}', '+short', '-x', ip], stdout=subprocess.PIPE)
    print(result.stdout.decode().strip())
    print()  # Add a blank line for readability

def main(ip):
    run_dig_reverse('Google', '8.8.8.8', ip)
    run_dig_reverse('KT', '168.126.63.1', ip)
    run_dig_reverse('SK', '219.250.36.130', ip)
    run_dig_reverse('LG', '164.124.101.2', ip)

if __name__ == '__main__':
    if len(sys.argv) != 2:
        print("Usage: ddr <ip>")
        sys.exit(1)

    main(sys.argv[1])

 

참고 : [Tech Notes/Network & DNS] - dig 명령어, DNS 쿼리 및 결과 분석 방법

 

dig 명령어, DNS 쿼리 및 결과 분석 방법

dig는 Domain Information Groper의 약자로 DNS 서버에 질의를 보내는 데 사용되는 유용한 도구다. 웹호스팅과 시스템 관리를 하다 보면 도메인 DNS를 조회해야 할 일이 종종 생기는데, DNS의 문제를 파악하

gbminnote.com