python dns 服务器

import socketserver
import struct

# DNS Query
class SinDNSQuery:
    def __init__(self, data):
        i = 1
        self.name = ‘‘
        while True:
            d = data[i]
            if d == 0:
                break;
            if d < 32:
                self.name = self.name + ‘.‘
            else:
                self.name = self.name + chr(d)
            i = i + 1
        self.querybytes = data[0:i + 1]
        (self.type, self.classify) = struct.unpack(‘>HH‘, data[i + 1:i + 5])
        self.len = i + 5
    def getbytes(self):
        return self.querybytes + struct.pack(‘>HH‘, self.type, self.classify)

# DNS Answer RRS
# this class is also can be use as Authority RRS or Additional RRS
class SinDNSAnswer:
    def __init__(self, ip):
        self.name = 49164
        self.type = 1
        self.classify = 1
        self.timetolive = 190
        self.datalength = 4
        self.ip = ip
    def getbytes(self):
        res = struct.pack(‘>HHHLH‘, self.name, self.type, self.classify, self.timetolive, self.datalength)
        s = self.ip.split(‘.‘)
        res = res + struct.pack(‘BBBB‘, int(s[0]), int(s[1]), int(s[2]), int(s[3]))
        return res

# DNS frame
# must initialized by a DNS query frame
class SinDNSFrame:
    def __init__(self, data):
        (self.id, self.flags, self.quests, self.answers, self.author, self.addition) = struct.unpack(‘>HHHHHH‘, data[0:12])
        self.query = SinDNSQuery(data[12:])
    def getname(self):
        return self.query.name
    def setip(self, ip):
        self.answer = SinDNSAnswer(ip)
        self.answers = 1
        self.flags = 33152
    def getbytes(self):
        res = struct.pack(‘>HHHHHH‘, self.id, self.flags, self.quests, self.answers, self.author, self.addition)
        res = res + self.query.getbytes()
        if self.answers != 0:
            res = res + self.answer.getbytes()
        return res
# A UDPHandler to handle DNS query
class SinDNSUDPHandler(socketserver.BaseRequestHandler):
    def handle(self):
        data = self.request[0].strip()
        print (data)
        dns = SinDNSFrame(data)
        socket = self.request[1]
        namemap = SinDNSServer.namemap
    w
        if(dns.query.type==1):
            # If this is query a A record, then response it

            name = dns.getname();
            if namemap.__contains__(name):
                # If have record, response it
                dns.setip(namemap[name])
                socket.sendto(dns.getbytes(), self.client_address)
            elif namemap.__contains__(‘*‘):
                # Response default address
                dns.setip(namemap[‘*‘])
                socket.sendto(dns.getbytes(), self.client_address)
            else:
                # ignore it
                socket.sendto(data, self.client_address)
        else:
            # If this is not query a A record, ignore it
            socket.sendto(data, self.client_address)

# DNS Server
# It only support A record query
# user it, U can create a simple DNS server
class SinDNSServer:
    def __init__(self, port=53):
        SinDNSServer.namemap = {}
        self.port = port
    def addname(self, name, ip):
        SinDNSServer.namemap[name] = ip
    def start(self):
        HOST, PORT = "192.168.4.231", self.port
        server = socketserver.UDPServer((HOST, PORT), SinDNSUDPHandler)
        server.serve_forever()

# Now, test it
if __name__ == "__main__":
    sev = SinDNSServer()
    sev.addname(‘www.aa.com‘, ‘192.168.0.1‘)    # add a A record
    sev.addname(‘www.bb.com‘, ‘192.168.0.2‘)    # add a A record
    sev.addname(‘*‘, ‘192.168.216.194‘) # default address
    sev.start() # start DNS server

# Now, U can use "nslookup" command to test it
# Such as "nslookup www.aa.com"
时间: 2024-11-11 12:37:45

python dns 服务器的相关文章

用python自建一个DNS服务器

前段日子一直在做公司的DNS调度程序,不过由于性能比较差,方案最终废弃掉了.两个半月心血,不想白白浪费掉,于是改了改,把商业秘密相关的部分去掉,变成了一个公共的DNS服务器.其实说的简单点,就是一个可以做DNS解析和应答的程序(废话,DNS服务器不就是干这个的).功能比较简单,只做了A地址和CNAME的解析,安全性不涉及,性能也没有测试过,因为本身是个玩具,测性能没有意义(理论上如果用pypy的话,水平一般的机器也能跑到1万以上的QPS).本程序多处借鉴了 isnowfy 同学的程序(相关博客:

[python网络编程]DNS服务器

在上一篇中,使用scrapy修改源IP发送请求的最后我们提到由于hosts文件不支持正则,会导致我们的随机域名DNS查询失败.使用DNS代理服务器可以解决这个问题, 下面是我用gevent写的小工具,很简单.我们只拦截匹配的A记录,然后发送DNS Response,如果不匹配,那么我们服务器就是一个DNS代理,转发请求. # -*- coding=utf-8 -*- import struct from cStringIO import StringIO from collections imp

VPN国内与国外网站转发至不同的DNS服务器解析,国内IP不经VPN

.title { text-align: center; margin-bottom: .2em } .subtitle { text-align: center; font-size: medium; font-weight: bold; margin-top: 0 } .todo { font-family: monospace; color: red } .done { font-family: monospace; color: green } .priority { font-fami

Python DNS 处理模块 dnspython

Python DNS 处理模块 dnspython 以下列举了DNSPython模块中常用方法,借鉴于书籍<Python 自动化运维:技术与最佳实践> dnspython提供大量关于DNS的处理方法,最常用的是域名查询.dnspython提供了一个DNS解析类resolver,使用它的query方法来实现域名的查询功能. query(self, qname, rdtype = 1, rdclass = 1, tcp = False, source = None, raise_on_no_ans

一步一步搭建主从DNS服务器

DNS服务作为基础的网络服务在互联网中到处存在,学习搭建DNS服务器是网络管理员的基本技能之一. 准备环境:vmware workstation 10 redhat 5.10 x86_64  虚拟机2台 主DNS:192.168.195.129  ns1.jwh5566.com 192.168.1.114  连外网   主要是客户端用来测试DNS是否递归查询的 从DNS:192.168.195.128    ns2.jwh5566.com 域名:jwh5566.com 代理的客户端:192.16

DNS之配置子域DNS服务器

写在前面:如果此文有幸被某位朋友看见并发现有错的地方,希望批评指正.如有不明白的地方,愿可一起探讨. 假设某个网段很大,你只想负责上层的DNS管理,下层的DNS希望直接交给各单位的负责人去管理,要怎么设置呢?子域授权DNS服务器可以解决这样的问题. 那么如何开放子域授权呢?以在"DNS之配置Master DNS服务器"博文中建立的Master DNS服务器为基础,假设有人想向你申请domain name,他要的domain是"ll.muluhe.com",那该如何处

Linux DNS服务器子域授权、转发器和转发域配置实例(三)

DNS子域授权: 这里我们只演示正向解析的子域授权   父域能够解析子域的A记录(不是权威的,因为不是自身解析的),  子域不能解析父域的A记录,如果非要解析父域中的地址过程是:先去找互联网的根域在层层到下查找.(但是我们可以在子域建立转发,使能够解析父域的A记录) 实例: 说明父域为:ning.com子域1为:ning1.ning.com 子域2为:ning2.ning.com  补充说明:父域和子域只要能通信即可,没有必要在同一网段,我们这里为了方便操作放在一个网段了..小伙伴们明白!  实

常用公共DNS服务器地址

DNS,全称Domain Name System,即域名解析系统,帮助用户在互联网上寻找路径,它在互联网的作用是把域名转换成为网络可以识别的IP地址.目前国内电信运营商通过使用DNS劫持和DNS污染的方法,干扰用户正常上网,使得用户无法访问众多国外常用服务,因此今天我介绍一些国内外的DNS服务器地址,供大家选择使用. 国外DNS服务器地址 Google Public DNS (8.8.8.8, 8.8.4.4) OpenDNS (208.67.222.222, 208.67.220.220) O

Linux下搭建DNS服务器

一.修改Linux主机名 1.hostname 主机名 [[email protected] named]# hostname ifs.com 2.vi /etc/hosts [[email protected] named]# vi /etc/hosts 127.0.0.1 ns.ifs.com ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6 ~ 3.vim /etc/sysconfi