在上一篇中,使用scrapy改动源IP发送请求的最后我们提到因为hosts文件不支持正则,会导致我们的随机域名DNS查询失败。

使用DNS代理服务器能够解决问题,

以下是我用gevent写的小工具。非常easy。我们仅仅拦截匹配的A记录。然后发送DNS Response,假设不匹配,那么我们服务器就是一个DNS代理,转发请求。

# -*- coding=utf-8 -*-
import struct
from cStringIO import StringIO
from collections import namedtuple
from gevent import socket
from gevent.server import DatagramServerHex = lambda x : '0x{0:04x}'.format(x) # Hex(256) => "0x0100"QueryResult = namedtuple("DnsQuery","transactionID,flags,questions,answerRrs \authorityRrs,additionalRrs,qname,qtype,qclass"
)LOCALDNS = ("114.114.114.114",53)Hosts = {"*.ttt.com":"173.194.127.144", # google ip
}def preg_match(preg,real):"""only support '*'>>>preg_match("www.*.test*.com","www.python.test.com")True>>>preg_match("www.*.test*.com","www.python.tes.com")False"""pre = 0for s in preg.split('*'):now = real.find(s)if now < pre:return Falsepre = now +len(s)return Truedef udp_send(address,data):sock = socket.socket(type=socket.SOCK_DGRAM)sock.connect(address)sock.send(data)response, address = sock.recvfrom(8192*4)return response,addressclass DnsParser:@classmethoddef parseQuery(self,query):"""6a 02 01 00 00 01                         j.....00 00 00 00 00 00 03 77 77 77 03 61 61 61 03 63  .......www.aaa.c6f 6d 00 00 01 00 01                             om.....dns query package like above03 77 77 77 : three www"""transactionID,flags,questions,answerRrs,authorityRrs,additionalRrs = map(Hex,struct.unpack("!6H",query[:12]))quries = StringIO(query[12:])c = struct.unpack("!c",quries.read(1))[0]domain = []while  c != '\x00':n = ord(c)domain.append(''.join(struct.unpack("!%sc" % n,quries.read(ord(c)))))c = struct.unpack("!c",quries.read(1))[0]domain = '.'.join(domain)qtype,qclass = map(Hex,struct.unpack("!2H",quries.read()))return QueryResult(transactionID,flags,questions,answerRrs,authorityRrs,additionalRrs,domain,qtype,qclass)@classmethoddef generateReqponse(self,queryData,ip):"""only support ipv4"""return ''.join([queryData[:2],"\x81\x80\x00\x01\x00\x02\x00\x00\x00\x00",queryData[12:],"\xc0\x0c","\x00\x01","\x00\x01","\x00\x00\x00\x1e","\x00\x04",struct.pack('BBBB',*map(int,ip.split('.')))])class DnsServer(DatagramServer):def handle(self,data,address):query = DnsParser.parseQuery(data)print "get dns query from %s,query:%s" %(str(address),str(query))find = Falsefor preg,ip in Hosts.iteritems():if preg_match(preg,query.qname):find = Truebreakif find and query.qtype == "0x0001": #only handle A recordprint 'domain:%s in hosts' % query.qnameresponse = DnsParser.generateReqponse(data,ip)self.socket.sendto(response,address)else:print 'transfer for %s' % query.qnameresponse,serveraddress = udp_send(LOCALDNS,data)self.socket.sendto(response,address)if __name__ == "__main__":DnsServer("192.168.9.178:53").serve_forever()

哈哈,刚好100行,不得不说python的强大。

来个截图:

功能有限。各位童鞋能够扩展,代码已经放到github,https://github.com/Skycrab/PyDnsProxy,有兴趣的童鞋一起完好。

[python网络编程]DNSserver相关推荐

  1. python网络编程--socket简单实现

    python网络编程                                                                                           ...

  2. python网络编程-异常处理-异常捕获-抛出异常-断言-自定义异常-UDP通信-socketserver模块应用-03

    python网络编程-异常处理-异常捕获-抛出异常-断言-自定义异常-UDP通信-socketserver模块应用-03 参考文章: (1)python网络编程-异常处理-异常捕获-抛出异常-断言-自 ...

  3. python编程入门指南怎么样-学习python网络编程怎么入门

    第一部分底层网络学习 Python提供了访问底层操作系统Socket接口的全部方法,需要的时候这些接口可以提供灵活而强有力的功能. (1)基本客户端操作 在<python 网络编程基础>一 ...

  4. python编程实例下载-python网络编程之文件下载实例分析

    本文实例讲述了python网络编程之文件下载实现方法.分享给大家供大家参考.具体如下: 真是越看越喜欢python啊,想要了解它提供的http和ftp下载功能,原来是如此的简单. 1.相应模块 ftp ...

  5. python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)...

    python网络编程基础(线程与进程.并行与并发.同步与异步.阻塞与非阻塞.CPU密集型与IO密集型) 目录 线程与进程并行与并发同步与异步阻塞与非阻塞CPU密集型与IO密集型 线程与进程 进程 前言 ...

  6. python网络编程案例_Python 网络编程_python网络编程基础_python高级编程

    Python 网络编程 Python 提供了两个级别访问的网络服务.: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的 ...

  7. python 网络编程 问题记录

    191223 python 网络编程 套接字的初使用 在本机配置服务端和客户端后,运行没问题:将服务端代码弄到另一台电脑上后启动,用原来的电脑去连接它,就连不上了,不知啥原因,是ip自动获取和指定ip ...

  8. python网络编程(苦肝一夜,近万字)

    文章目录 一.TCP/IP简介 二.网络设计模块 1.Socket简介 2.python中的socket模块,使用该模块建立服务器需要6个步骤. 1.创建socket对象. 2.将socket绑定(指 ...

  9. python网络编程证书_《Python网络编程基础》笔记

    python网络编程基础 ================== Author: lujun9972 Date: 2013-03-08 22:29:20 CST Table of Contents == ...

最新文章

  1. Java基础-OOP特性之封装、继承、多态、抽象
  2. 关于编码、unicode、utf-8的讨论
  3. rabbitMQ第一篇:rabbitMQ的安装和配置
  4. 动态添加综合布局---动态添加控件及将某XML动态加入到Activity显示(续)
  5. boost::graph::page_rank用法的测试程序
  6. Effective Java之EnumMap代替序数索引(三十三)
  7. 【C#】ADO .Net Entities Framework使用查询语句时遇到的错误
  8. Java:实验四第6题
  9. Paxos—以选美比赛为例PPT
  10. js表单提交enter触发提交
  11. AXURE RP 9 ——【中继器】
  12. 服务器显示504,帮您解决win7系统访问nginx服务器提示504 Gateway Time-out错误的修复技巧...
  13. python红楼梦人物词频统计_用 Python 分析《红楼梦》
  14. 增强现实中的光学透射式头盔显示器的标定初步
  15. PHP Include文件
  16. 强化学习 - Deep RL开源项目总结
  17. 小林:采访Vue作者随想
  18. 震惊!这个链接里面竟然有
  19. 摩拜OFO单车哪家强,看他们的网站似乎发现了点什么
  20. 算法7:迪杰斯特拉算法

热门文章

  1. Android动态加载进阶 代理Activity模式
  2. android游戏加载,Android 游戏引擎libgdx 资源加载进度百分比显示案例分析
  3. python 人气高的项目_给大家推荐:五个Python小项目,Github上的人气很高的
  4. iis7+php_5.5,IIS7+php5.5+fastcgi
  5. 笔记本x31搭建家用win服务器系统,Thinkpad X31怎么硬盘安装win7系统
  6. mysql alter算法_MySQL ALTER命令_mysql alter_添加_删除_修改
  7. Hadoop详解(八):MapReduce深度分析
  8. ubuntu14安装mysql5.6_ubuntu14.04安装mysql5.6.37
  9. layui遍历json数组_shell脚本:json格式化与字段抓取(下)
  10. Django学习笔记(10)——Book单表的增删改查页面