Chinaunix首页 | 论坛 | 博客
  • 博客访问: 356743
  • 博文数量: 306
  • 博客积分: 3975
  • 博客等级: 中校
  • 技术积分: 3265
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-27 13:14
文章分类

全部博文(306)

文章存档

2017年(1)

2016年(3)

2015年(11)

2014年(15)

2013年(178)

2012年(41)

2011年(38)

2010年(9)

2009年(9)

2008年(1)

分类: LINUX

2013-09-04 17:50:56

#!/bin/env python
#-*- coding:utf-8 -*-

import socket
import os
import sys

def daemon():
    try:
    pid = os.fork()
    if pid > 0:
        sys.exit(0)
    except OSError, e:
    print 'fork #1 fail', e
    sys.exit(1)
    os.chdir('/')
    os.setsid()
    os.umask(022)

    try:
    pid = os.fork()
    if pid > 0:
        print 'daemon pid %d' %pid
        sys.exit(0)
    except OSError, e:
    print 'fork #2 fail', e
    sys.exit(1)

    sys.stdout.flush()
    sys.stderr.flush()
    nulldev = '/dev/null'
    stdin = file(nulldev, 'r')
    stdout = file(nulldev, 'a+')
    stderr = file(nulldev, 'a+', 0)
    os.dup2(stdin.fileno(), sys.stdin.fileno())
    os.dup2(stdin.fileno(), sys.stdout.fileno())
    os.dup2(stdin.fileno(), sys.stderr.fileno())

    return pid
        

def proxy(data):
    dnsList = [('192.168.4.88', 53), ('202.106.0.20', 53), ('8.8.8.8', 53)]
    for i in dnsList:
    dnsQuerySock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    try:
        dnsQuerySock.sendto(data, i)
        redata, ADDR = dnsQuerySock.recvfrom(1024)
        if not data or not dpkt.dns.DNS(data).an:
        continue
        else:
        break
    except:
        continue
    return redata
        

def work(host, port, bufsize):
    address = (host, port)
    udpSerSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    udpSerSock.bind(address)

    while True:
    data, addr = udpSerSock.recvfrom(bufsize)
    if not data:
        continue
    else:
        data = proxy(data)
        udpSerSock.sendto(data, addr)
    udpSerSock.close()

if __name__ == '__main__':
    daemon()
    work('0.0.0.0', 53, 1024)
阅读(1924) | 评论(0) | 转发(0) |
0

上一篇:webpy实现API接口

下一篇:sync 攻击

给主人留下些什么吧!~~