Python写的Socks5协议代理服务器

直接上代码:

#!/usr/bin/python
# Filename s5.py
# Python Dynamic Socks5 Proxy
# Usage: python s5.py 1080
# Background Run: nohup python s5.py 1080 & 

import socket, sys, select, SocketServer, struct, time 

class ThreadingTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer): pass
class Socks5Server(SocketServer.StreamRequestHandler):
  def handle_tcp(self, sock, remote):
    fdset = [sock, remote]
    while True:
      r, w, e = select.select(fdset, [], [])
      if sock in r:
        if remote.send(sock.recv(4096)) <= 0: break
      if remote in r:
        if sock.send(remote.recv(4096)) <= 0: break
  def handle(self):
    try:
      pass # print 'from ', self.client_address nothing to do.
      sock = self.connection
      # 1. Version
      sock.recv(262)
      sock.send("\x05\x00");
      # 2. Request
      data = self.rfile.read(4)
      mode = ord(data[1])
      addrtype = ord(data[3])
      if addrtype == 1:    # IPv4
        addr = socket.inet_ntoa(self.rfile.read(4))
      elif addrtype == 3:   # Domain name
        addr = self.rfile.read(ord(sock.recv(1)[0]))
      port = struct.unpack('>H', self.rfile.read(2))
      reply = "\x05\x00\x00\x01"
      try:
        if mode == 1: # 1. Tcp connect
          remote = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
          remote.connect((addr, port[0]))
          pass # print 'To', addr, port[0] nothing do to.
        else:
          reply = "\x05\x07\x00\x01" # Command not supported
        local = remote.getsockname()
        reply += socket.inet_aton(local[0]) + struct.pack(">H", local[1])
      except socket.error:
        # Connection refused
        reply = '\x05\x05\x00\x01\x00\x00\x00\x00\x00\x00'
      sock.send(reply)
      # 3. Transfering
      if reply[1] == '\x00': # Success
        if mode == 1:  # 1. Tcp connect
          self.handle_tcp(sock, remote)
    except socket.error:
      pass #print 'error' nothing to do .
    except IndexError:
      pass
def main():
  filename = sys.argv[0];
  if len(sys.argv)<2:
    print 'usage: ' + filename + ' port'
    sys.exit()
  socks_port = int(sys.argv[1]);
  server = ThreadingTCPServer(('', socks_port), Socks5Server)
  print 'bind port: %d' % socks_port + ' ok!'
  server.serve_forever()
if __name__ == '__main__':
  main()
(0)

相关推荐

  • 浅析Python中的多进程与多线程的使用

    在批评Python的讨论中,常常说起Python多线程是多么的难用.还有人对 global interpreter lock(也被亲切的称为"GIL")指指点点,说它阻碍了Python的多线程程序同时运行.因此,如果你是从其他语言(比如C++或Java)转过来的话,Python线程模块并不会像你想象的那样去运行.必须要说明的是,我们还是可以用Python写出能并发或并行的代码,并且能带来性能的显著提升,只要你能顾及到一些事情.如果你还没看过的话,我建议你看看Eqbal Quran的文章

  • Python中的并发编程实例

    一.简介 我们将一个正在运行的程序称为进程.每个进程都有它自己的系统状态,包含内存状态.打开文件列表.追踪指令执行情况的程序指针以及一个保存局部变量的调用栈.通常情况下,一个进程依照一个单序列控制流顺序执行,这个控制流被称为该进程的主线程.在任何给定的时刻,一个程序只做一件事情. 一个程序可以通过Python库函数中的os或subprocess模块创建新进程(例如os.fork()或是subprocess.Popen()).然而,这些被称为子进程的进程却是独立运行的,它们有各自独立的系统状态以及

  • python多线程threading.Lock锁用法实例

    本文实例讲述了python多线程threading.Lock锁的用法实例,分享给大家供大家参考.具体分析如下: python的锁可以独立提取出来 复制代码 代码如下: mutex = threading.Lock() #锁的使用 #创建锁 mutex = threading.Lock() #锁定 mutex.acquire([timeout]) #释放 mutex.release() 锁定方法acquire可以有一个超时时间的可选参数timeout.如果设定了timeout,则在超时后通过返回值

  • python thread 并发且顺序运行示例

    复制代码 代码如下: #-*- coding:utf-8 -*- import threading import time def fun(name, ls_name, front_thread = None): ''''' 线程启动函数 通过front_thread来使用线程有序的运行 ''' time.clock() time.sleep(2) # 如果front_thread存在,则在front_thread运行完成后,才运行当前线程 if front_thread != None: fr

  • Python使用代理抓取网站图片(多线程)

    一.功能说明:1. 多线程方式抓取代理服务器,并多线程验证代理服务器ps 代理服务器是从http://www.cnproxy.com/ (测试只选择了8个页面)抓取2. 抓取一个网站的图片地址,多线程随机取一个代理服务器下载图片二.实现代码 复制代码 代码如下: #!/usr/bin/env python#coding:utf-8 import urllib2import reimport threadingimport timeimport random rawProxyList = []ch

  • 在python中的socket模块使用代理实例

    说socket代理之前,先来说说http代理,python的urllib2是自带http代理功能的,可以用如下代码实现: 复制代码 代码如下: proxy_handler = urllib2.ProxyHandler({'http' : 'http://地址:端口'})opener = urllib2.build_opener(proxy_handler, urllib2.HTTPHandler)urllib2.install_opener(opener) 如此,接下来用urllib2来urlo

  • Python代理抓取并验证使用多线程实现

    没有使用队列,也没有线程池还在学习只是多线程 复制代码 代码如下: #coding:utf8 import urllib2,sys,re import threading,os import time,datetime ''''' 这里没有使用队列 只是采用多线程分发对代理量不大的网页还行但是几百几千性能就很差了 ''' def get_proxy_page(url): '''''解析代理页面 获取所有代理地址''' proxy_list = [] p = re.compile(r'''''<d

  • Python3实现并发检验代理池地址的方法

    本文实例讲述了Python3实现并发检验代理池地址的方法.分享给大家供大家参考,具体如下: #encoding=utf-8 #author: walker #date: 2016-04-14 #summary: 用协程/线程池并发检验代理有效性 import os, sys, time import requests from concurrent import futures cur_dir_fullpath = os.path.dirname(os.path.abspath(__file__

  • python多线程编程中的join函数使用心得

    今天去辛集买箱包,下午挺晚才回来,又是恶心又是头痛.恶心是因为早上吃坏东西+晕车+回来时看到车祸现场,头痛大概是烈日和空调混合刺激而成.没有时间没有精神没有力气学习了,这篇博客就说说python中一个小小函数. 由于坑爹的学校坑爷的专业,多线程编程老师从来没教过,多线程的概念也是教的稀里糊涂,本人python也是菜鸟级别,所以遇到多线程的编程就傻眼了,别人用的顺手的join函数我却偏偏理解不来.早上在去辛集的路上想这个问题想到恶心,回来后继续写代码测试,终于有些理解了(python官方的英文解释

  • python实现代理服务功能实例

    代理服务原理很简单,就拿浏览器与web服务器来说.无非是A浏览器发request给B代理,B代理再把request把送给C web服务,然后C的reponse->B->A.要写web代理服务就要先了解下http协议,当然并不要多深入,除非要实现强大的功能:修改XX信息.负载均衡等.http请求由三部分组成:请求行.消息报头.请求正文:详细的网上有,想了解可以看看.下面是一个正常的GET请求头(Cookie部分本人没截屏,使用的系统w7): 可以看到首行:GET是请求方法, /是路径,在后面是协

  • python实现简单的TCP代理服务器

    本文实例讲述了python实现简单的TCP代理服务器的方法,分享给大家供大家参考. 具体实现代码如下: # -*- coding: utf-8 -*- ''' filename:rtcp.py @desc: 利用python的socket端口转发,用于远程维护 如果连接不到远程,会sleep 36s,最多尝试200(即两小时) @usage: ./rtcp.py stream1 stream2 stream为:l:port或c:host:port l:port表示监听指定的本地端口 c:host

  • Python多进程并发(multiprocessing)用法实例详解

    本文实例讲述了Python多进程并发(multiprocessing)用法.分享给大家供大家参考.具体分析如下: 由于Python设计的限制(我说的是咱们常用的CPython).最多只能用满1个CPU核心. Python提供了非常好用的多进程包multiprocessing,你只需要定义一个函数,Python会替你完成其他所有事情.借助这个包,可以轻松完成从单进程到并发执行的转换. 1.新建单一进程 如果我们新建少量进程,可以如下: import multiprocessing import t

随机推荐