77 lines
3.0 KiB
Python
77 lines
3.0 KiB
Python
import socket
|
||
import ssl
|
||
import dns.message
|
||
import dns.query
|
||
import dns.rcode
|
||
import argparse
|
||
from logger_DoE import *
|
||
import pandas as pd
|
||
|
||
domains = set(pd.read_csv('domains.csv').domain)
|
||
|
||
upstream_server = '223.5.5.5'
|
||
|
||
# 创建监听socket
|
||
listener = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||
listener.bind(('127.0.0.54', 53))
|
||
|
||
parser = argparse.ArgumentParser()
|
||
parser.add_argument('-pass', '--passdoe', default=0)
|
||
parser.add_argument('-tamper', '--tamper', default='')
|
||
parser.add_argument('-inject', '--inject', default='')
|
||
parser.add_argument('-ns', '--ns', default='1.1.1.1')
|
||
args = parser.parse_args()
|
||
tamper = args.tamper +'.'
|
||
inject = args.inject +'.'
|
||
ns = args.ns
|
||
|
||
logger = InfoLogger(interval=1)
|
||
logger.log_info(LogLevel.INFO, "程序开始运行")
|
||
|
||
while True:
|
||
# 接收DNS请求
|
||
data, addr = listener.recvfrom(1024)
|
||
#print(dns.message.from_wire(data))
|
||
data = dns.message.from_wire(data)
|
||
query_r = data.question[0].name.to_text()[:-1]
|
||
if query_r in domains and args.passdoe==0:
|
||
# print(data.question[0].name.to_text()[:-1])
|
||
# print(addr)
|
||
#print(data)
|
||
#print('对DoE域名的DNS请求:', query_r)
|
||
logger = InfoLogger(interval=1)
|
||
logger.log_info(LogLevel.INFO, f'对DoE域名的DNS请求:{query_r}')
|
||
# # 创建TLS连接并发送DNS请求到上游服务器
|
||
resp = dns.query.udp(
|
||
q=data,
|
||
where=upstream_server,
|
||
timeout=10)
|
||
#print('DNS响应:', resp.answer)
|
||
resp.answer = [dns.rrset.from_text(query_r+'.', 3600, dns.rdataclass.IN, dns.rdatatype.A, '10.10.10.10')]
|
||
#print(f'对DoE域名{query_r}的DNS请求已阻断,返回10.10.10.10')
|
||
logger.log_info(LogLevel.INFO, f'对DoE域名{query_r}的DNS请求已阻断,返回10.10.10.10')
|
||
logger.log_info(LogLevel.PAYLOAD, str(resp.answer.__str__()))
|
||
# with socket.create_connection((upstream_server,853)) as sock:
|
||
# with context.wrap_socket(sock, server_hostname=upstream_server[0]) as tls_sock:
|
||
# tls_sock.sendall(data.to_wire())
|
||
# resp = tls_sock.recv(4096)
|
||
|
||
# 将上游服务器的响应发送回客户端
|
||
listener.sendto(resp.to_wire(), addr)
|
||
else:
|
||
resp = dns.query.udp(
|
||
q=data,
|
||
where=upstream_server,
|
||
timeout=10)
|
||
if str(resp.question[0].name) == tamper and int(resp.question[0].rdtype) == 1:
|
||
print('---tamper---', tamper)
|
||
resp.answer = [
|
||
dns.rrset.from_text(tamper, 3600, dns.rdataclass.IN, dns.rdatatype.A, '8.8.8.8')]
|
||
if str(resp.question[0].name) == inject:
|
||
print('---inject---', inject)
|
||
resp.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)]
|
||
listener.sendto(resp.to_wire(), addr)
|
||
#break
|