Asynchronous DNS client and server
Project description
async_dns
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
Release history Release notifications | RSS feed
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.9.tar.gz
(18.9 kB
view hashes)
Built Distribution
async_dns-1.0.9-py3-none-any.whl
(24.1 kB
view hashes)
Close
Hashes for async_dns-1.0.9-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | dbc8e631fa686e1848b903230a66421b5dc3b8f1a5eb84ffb4a9bfeeca410e75 |
|
MD5 | 9cb106ad0a02675c3bbcc884d7e681d0 |
|
BLAKE2b-256 | 771acf6acda3b1f0b56c336060d2649b402eafa1e5abb9d0ae32fd516ba43b01 |