web dns query

커맨드라인에서 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)

답글 남기기

Your email address will not be published.