Skip to main content

Asynchronous DNS client and server

Project description

async_dns

PyPI

Asynchronous DNS server and client built with pure Python.

Requirements: Python 3.5+ (asyncio is required).

Installation

$ pip3 install async_dns
# or
$ pip3 install git+https://github.com/gera2ld/async_dns.git

CLI

Resolver

usage: python3 -m async_dns.resolver [-h] [-p {udp,tcp}]
                                     [-n NAMESERVERS [NAMESERVERS ...]]
                                     [-t TYPES [TYPES ...]]
                                     hostnames [hostnames ...]

Async DNS resolver

positional arguments:
  hostnames             the hostnames to query

optional arguments:
  -h, --help            show this help message and exit
  -p {udp,tcp}, --protocol {udp,tcp}
                        whether to use TCP protocol as default to query remote
                        servers
  -n NAMESERVERS [NAMESERVERS ...], --nameservers NAMESERVERS [NAMESERVERS ...]
                        name servers
  -t TYPES [TYPES ...], --types TYPES [TYPES ...]
                        query types, default as `any`

Examples:

# Resolve an IP
$ python3 -m async_dns.resolver www.google.com
$ python3 -m async_dns.resolver -t mx -- gmail.com

# Query via TCP
$ python3 -m async_dns.resolver -n 127.0.0.1 -p tcp www.google.com

Server

usage: python3 -m async_dns.server [-h] [-b BIND] [--hosts HOSTS]
                                   [-P PROXY [PROXY ...]] [-p {udp,tcp}]

DNS server by Gerald.

optional arguments:
  -h, --help            show this help message and exit
  -b BIND, --bind BIND  the address for the server to bind
  --hosts HOSTS         the path of a hosts file
  -x PROXY [PROXY ...], --proxy PROXY [PROXY ...]
                        the proxy DNS servers, `none` to serve as a recursive
                        server, `default` to proxy to default nameservers
  -p {udp,tcp}, --protocol {udp,tcp}
                        whether to use TCP protocol as default to query remote
                        servers

Examples:

# Start a DNS proxy server on :53 via TCP
$ python3 -m async_dns.server -b :53 -p tcp --hosts /etc/hosts

# Start a DNS server over TCP proxy
$ python3 -m async_dns.server -x 8.8.8.8 -p tcp

# Start a DNS recursive server
$ python3 -m async_dns.server -x none

API

import asyncio
from async_dns import types
from async_dns.resolver import ProxyResolver

loop = asyncio.get_event_loop()
resolver = ProxyResolver()
res = loop.run_until_complete(resolver.query('www.baidu.com', types.A))
print(res)

ProxyResolver supports routing based on domains:

resolver = ProxyResolver(proxies=[
    ('*.lan', ['192.168.1.1']),                        # query '192.168.1.1' for '*.lan' domains
    (lambda d: d.endswith('.local'), ['127.0.0.1']),   # query 127.0.0.1 for domains ending with '.local'
    (None, ['8.8.8.8', '8.8.4.4']),                    # None matches all others
])

Test

$ python3 -m unittest

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

async_dns-1.0.8.tar.gz (18.8 kB view hashes)

Uploaded Source

Built Distribution

async_dns-1.0.8-py3-none-any.whl (24.1 kB view hashes)

Uploaded Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page