커맨드라인에서 nslookup 이나 dig를 이용해 dns 쿼리를 가끔 이용하는데, pc를 이용할 수 없는 상황이 생김.
그래서, iPhone web 브라우저에서 dns 쿼리를 가능하게 하도록 프로그램 작성함.(https://webdns.boxcorea.com)
사용한 파이썬 라이브러리는 dnspython인데, 사용법이 쉽지않다. 아래는 위 사이트의 백엔드 코드.
import dns.resolver
import dns.message
import dns.rdataclass
import dns.rdatatype
import dns.name
import dns.flags
def is_answer(result):
res = list()
start = end = int()
for i in range(len(result)):
if result[i] == ';ANSWER':
start = i+1
if result[i] == ';AUTHORITY':
end = i
if start == end:
res.append('No name server returned any records for this request.')
return res
else:
for i in range(start, end):
res.append(result[i])
i += 1
return res
def any_query(domain, qtype, dserver):
qname = dns.name.from_text(domain)
if qtype == 'ANY':
q = dns.message.make_query(qname, dns.rdatatype.ANY)
result = str(dns.query.udp(q, dserver)).split('\n')
res = is_answer(result)
return res
def not_any_query(domain, qtype, dserver):
# qtype is 'A', 'AAAA', 'MX', 'NS', 'TXT', 'SOA', 'CNAME'
resolver = dns.resolver.Resolver(configure=False)
resolver.nameservers = [dserver]
if not domain:
return ['Need to hostname']
try:
# answers = dns.resolver.query(domain, qtype, raise_on_no_answer=False)
answers = resolver.query(domain, qtype, raise_on_no_answer=False)
if answers.rrset is not None:
# print(type(answers.rrset))
result = str(answers.rrset).split('\n')
return result
else:
result = ['No name server returned any records for this request.']
return result
except:
return ['No name server returned any records for this request! or hostname is null.']
def dns_query(domain, qtype, dserver):
if qtype == 'ANY':
result = any_query(domain, qtype, dserver)
else:
result = not_any_query(domain, qtype, dserver)
return result
if __name__ == '__main__':
r = dns_query('google.com', 'ANY', '168.126.63.1')
print(r)
r = dns_query('daum.net', 'MX', '208.67.222.222')
print(r)
