Files
docker-dns/main.py
2021-06-29 09:24:44 +02:00

67 lines
1.9 KiB
Python

import time
from docker import DockerClient
from dnslib import DNSRecord, QTYPE, RCODE, RR, A
from dnslib.server import BaseResolver, DNSServer, DNSLogger, DNSHandler
class DockerResolver(BaseResolver):
def __init__(self):
self.docker_client = DockerClient()
def resolve(self, request: DNSRecord, handler):
reply = request.reply()
if not request.q.qname.matchGlob('*.docker'):
reply.header.rcode = getattr(RCODE, 'NXDOMAIN')
return reply
service, *_ = str(request.q.qname).split('.')
results = self.docker_client.containers.list(filters={'name': service})
if not results or len(results) == 0:
reply.header.rcode = getattr(RCODE, 'NXDOMAIN')
return reply
container = results[0]
networks = container.attrs['NetworkSettings']['Networks']
ip = None
for net_name, network in networks.items():
ip = network['IPAddress']
break
if ip is not None:
reply.add_answer(RR(rname=request.q.qname, rtype=getattr(QTYPE, 'A'), rclass=1, ttl=60*5, rdata=A(ip)))
return reply
def main():
resolver = DockerResolver()
logger = DNSLogger('request,reply,truncated,error', False)
DNSHandler.log = {
'log_request', # DNS Request
'log_reply', # DNS Response
'log_truncated', # Truncated
'log_error', # Decoding error
}
udp_server = DNSServer(
resolver,
port=1053,
address='127.0.0.1',
logger=logger,
)
tcp_server = DNSServer(
resolver,
port=1053,
address='127.0.0.1',
logger=logger,
)
udp_server.start_thread()
tcp_server.start_thread()
print("listening")
while udp_server.isAlive() or tcp_server.isAlive():
time.sleep(1)
if __name__ == '__main__':
main()