ChatGTP 코드 인터프리터 기능의 도움을 받아 python으로 작성한 DNS 쿼리 스크립트이다. dig를 이용해 DNS 조회하고, 여러 네트워크망에 DNS 쿼리를 한 번에 하여 현재 내 도메인의 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])