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 相关文章推荐
pyqt和pyside开发图形化界面
Jan 22 Python
Python实现周期性抓取网页内容的方法
Nov 04 Python
python实现网站的模拟登录
Jan 04 Python
Python产生Gnuplot绘图数据的方法
Nov 09 Python
对python判断是否回文数的实例详解
Feb 08 Python
Python从文件中读取数据的方法讲解
Feb 14 Python
了解不常见但是实用的Python技巧
May 23 Python
Django MEDIA的配置及用法详解
Jul 25 Python
详解Python中的format格式化函数的使用方法
Nov 20 Python
Python 读取 YUV(NV12) 视频文件实例
Dec 09 Python
浅谈Python线程的同步互斥与死锁
Mar 22 Python
在Windows下安装配置CPU版的PyTorch的方法
Apr 02 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中的(伪)多线程与多进程
2013/07/01 PHP
php MessagePack介绍
2013/10/06 PHP
如何直接访问php实例对象中的private属性详解
2017/10/12 PHP
TP5框架请求响应参数实例分析
2019/10/17 PHP
PHP 计算至少是其他数字两倍的最大数的实现代码
2020/05/26 PHP
jQuery 源码分析笔记(7) Queue
2011/06/19 Javascript
根据IP的地址,区分不同的地区,查看不同的网站页面的js代码
2013/02/26 Javascript
禁止ajax缓存获取程序最新数据的方法
2013/11/19 Javascript
基于NodeJS的前后端分离的思考与实践(四)安全问题解决方案
2014/09/26 NodeJs
让JavaScript和其它资源并发下载的方法
2014/10/16 Javascript
javascript实现简单的进度条
2015/07/02 Javascript
jQuery事件对象总结
2016/10/17 Javascript
微信小程序之仿微信漂流瓶实例
2016/12/09 Javascript
Express+Nodejs 下的登录拦截实现代码
2017/07/01 NodeJs
Vue页面骨架屏的实现方法
2018/05/22 Javascript
JavaScript中call和apply方法的区别实例分析
2018/08/03 Javascript
怎样在vue项目下添加ESLint的方法
2019/05/16 Javascript
通过实例了解JS 连续赋值
2019/09/24 Javascript
vue 更改连接后台的api示例
2019/11/11 Javascript
Angular value与ngValue区别详解
2019/11/27 Javascript
深入解析Python中的WSGI接口
2015/05/11 Python
django rest framework之请求与响应(详解)
2017/11/06 Python
python @property的用法及含义全面解析
2018/02/01 Python
python utc datetime转换为时间戳的方法
2019/01/15 Python
python抓取多种类型的页面方法实例
2019/11/20 Python
python爬虫爬取监控教务系统的思路详解
2020/01/08 Python
Python request使用方法及问题总结
2020/04/26 Python
pip/anaconda修改镜像源,加快python模块安装速度的操作
2021/03/04 Python
送给他或她的礼物:FUN.com
2018/08/17 全球购物
main 主函数执行完毕后,是否可能会再执行一段代码,给出说明
2012/12/05 面试题
南京某软件公司的.net面试题
2015/11/30 面试题
上海天奕面试题笔试题
2015/04/19 面试题
财务会计专业推荐信
2013/11/30 职场文书
2015年学校安全工作总结
2015/04/22 职场文书
MySQL中distinct和count(*)的使用方法比较
2021/05/26 MySQL
Android studio 简单计算器的编写
2022/05/20 Java/Android