67 lines
1.9 KiB
Python
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()
|