-
Notifications
You must be signed in to change notification settings - Fork 11
/
dnsfilter.py
92 lines (68 loc) · 1.71 KB
/
dnsfilter.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# coding:utf8
# 使用dnslib组dns a记录查询包
# 使用gevent spawn 出去
# 使用gevent spawn 监听
# 打印输入域名ip
#
import threading
import gevent
import dnslib
from gevent import socket
#import socket
from gevent import event
from progressbar import ProgressBar
import time
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.bind(('',531))
ip=[]
cur=0
success = 0
progress = ProgressBar().start()
def preload():
for i in open('dnsserverip.txt'):
ip.append(i)
print "load "+str(len(ip))+" ip"
def handle_request(domains):
global cur
cnts = len(domains)
for i in xrange(cnts):
d = domains[i]
# "http://"
d = d[7:]
print d
dnsr = dnslib.DNSRecord.question(d)
packet = dnsr.pack()
ret = s.sendto(packet, (ip[cur], 53))
cur=(cur+1) % len(ip)
if i % 10 == 0 or i == cnts-1:
time.sleep(0.1)
def handle_response(data):
global success
req=dnslib.DNSRecord.parse(data)
try:
ret = req.a
success += 1
if success % 10 == 0:
print "\t %10d" % success
except:
print "Err"
pass
def handler(s,data,addr):
req=dnslib.DNSRecord.parse(data)
if req.header.qr:
handle_response(data)
else:
print "Err"
return
def main():
preload()
domains = open("okinwrong.txt").read().strip().split('\n')[:100]
# start a new thread to send dns request
thread = threading.Thread(target=(handle_request),args=(domains,))
thread.start()
thread.join()
while True:
data,addr = s.recvfrom(8192)
gevent.spawn(handler,s,data,addr)
if __name__ == '__main__':
main()