Python写的Socks5协议代理服务器


Posted in Python onAugust 06, 2014

直接上代码:

#!/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()
Python 相关文章推荐
Python中的各种装饰器详解
Apr 11 Python
使用Django的模版来配合字符串翻译工作
Jul 27 Python
Python的SimpleHTTPServer模块用处及使用方法简介
Jan 22 Python
python爬取哈尔滨天气信息
Jul 14 Python
python使用tcp实现局域网内文件传输
Mar 20 Python
Scrapy使用的基本流程与实例讲解
Oct 21 Python
Django unittest 设置跳过某些case的方法
Dec 26 Python
python数据分析:关键字提取方式
Feb 24 Python
Python使用xlrd实现读取合并单元格
Jul 09 Python
PyCharm配置anaconda环境的步骤详解
Jul 31 Python
Python Django 后台管理之后台模型属性详解
Apr 25 Python
Python连续赋值需要注意的一些问题
Jun 03 Python
Python写的PHPMyAdmin暴力破解工具代码
Aug 06 #Python
Python写的Discuz7.2版faq.php注入漏洞工具
Aug 06 #Python
Python常用列表数据结构小结
Aug 06 #Python
Python生成pdf文件的方法
Aug 04 #Python
Tornado Web服务器多进程启动的2个方法
Aug 04 #Python
Python通过解析网页实现看报程序的方法
Aug 04 #Python
基于Python实现的扫雷游戏实例代码
Aug 01 #Python
You might like
php常用Stream函数集介绍
2013/06/24 PHP
PHP常用的缓存技术汇总
2014/05/05 PHP
php获取一个变量的名字的方法
2014/09/05 PHP
Laravel框架控制器,视图及模型操作图文详解
2019/12/04 PHP
xml 与javascript结合的问题解决方法
2007/03/24 Javascript
jQuery使用empty()方法删除元素及其所有子元素的方法
2015/03/26 Javascript
JavaScript使用二分查找算法在数组中查找数据的方法
2015/04/07 Javascript
nodejs连接mysql数据库简单封装示例-mysql模块
2017/04/10 NodeJs
JS实现仿UC浏览器前进后退效果的实例代码
2017/07/17 Javascript
详解Vue.js使用Swiper.js在iOS
2018/09/10 Javascript
使用RN Animated做一个“添加购物车”动画的方法
2018/09/12 Javascript
使用layer.msg 时间设置不起作用的解决方法
2019/09/12 Javascript
[03:59]第二届DOTA2亚洲邀请赛选手传记-VGJ.rOtk
2017/04/03 DOTA
[53:10]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs VG 第一场
2018/04/11 DOTA
Python cookbook(数据结构与算法)实现查找两个字典相同点的方法
2018/02/18 Python
Python实现的读写json文件功能示例
2018/06/05 Python
Django学习之文件上传与下载
2019/10/06 Python
Python 静态方法和类方法实例分析
2019/11/21 Python
Python持续监听文件变化代码实例
2020/07/22 Python
记一次django内存异常排查及解决方法
2020/08/07 Python
python 如何将office文件转换为PDF
2020/09/22 Python
Python爬虫之Selenium实现窗口截图
2020/12/04 Python
意大利在线大学图书馆:Libreria universitaria
2019/07/16 全球购物
设计师大码女装:11 Honoré
2020/05/03 全球购物
排序都有哪几种方法?请列举。用JAVA实现一个快速排序
2014/02/16 面试题
财务会计专业毕业生自荐信
2013/10/19 职场文书
历史专业个人求职信分享
2013/12/20 职场文书
毕业生自荐信如何写
2014/03/24 职场文书
安全生产一岗双责责任书
2014/07/28 职场文书
酒店总经理岗位职责范本
2014/08/08 职场文书
大学生赌博检讨书
2014/09/22 职场文书
2015年公司新年寄语
2014/12/08 职场文书
开会通知
2015/04/20 职场文书
2015年车间安全管理工作总结
2015/05/13 职场文书
婚宴主持词
2015/06/30 职场文书
用python批量解压带密码的压缩包
2021/05/31 Python