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的mysqldb安装步骤详解
Aug 14 Python
基于python中staticmethod和classmethod的区别(详解)
Oct 24 Python
python pandas 组内排序、单组排序、标号的实例
Apr 12 Python
Python实现按中文排序的方法示例
Apr 25 Python
解决python matplotlib imshow无法显示的问题
May 24 Python
Python登录系统界面实现详解
Jun 25 Python
python识别文字(基于tesseract)代码实例
Aug 24 Python
python实现拼图小游戏
Feb 22 Python
如何用Python 加密文件
Sep 10 Python
python闭包与引用以及需要注意的陷阱
Sep 18 Python
如何使用Python自动生成报表并以邮件发送
Oct 15 Python
编写python代码实现简单抽奖器
Oct 20 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
咖啡的传说和历史
2021/03/03 新手入门
PHP form 表单传参明细研究
2009/07/17 PHP
php多任务程序实例解析
2014/07/19 PHP
如何使用Gitblog和Markdown建自己的博客
2015/07/31 PHP
thinkPHP5 tablib标签库自定义方法详解
2017/05/10 PHP
浅析Javascript使用include/require
2013/11/13 Javascript
Javascript实现返回上一页面并刷新的小例子
2013/12/11 Javascript
jquery中get和post的简单实例
2014/02/04 Javascript
使用jQuery和Bootstrap实现多层、自适应模态窗口
2014/12/22 Javascript
尝试动手制作javascript放大镜效果
2015/12/25 Javascript
使用NodeJs 开发微信公众号(三)微信事件交互实例
2016/03/02 NodeJs
Bootstrap table分页问题汇总
2016/05/30 Javascript
vue发送ajax请求详解
2018/10/09 Javascript
vue中子组件传递数据给父组件的讲解
2019/01/27 Javascript
详解 微信小程序开发框架(MINA)
2019/05/17 Javascript
js实现开关灯效果
2020/03/30 Javascript
vue+element导航栏高亮显示的解决方式
2019/11/12 Javascript
微信小程序顶部导航栏可滑动并选中放大
2019/12/05 Javascript
jQuery+PHP+Ajax实现动态数字统计展示功能
2019/12/25 jQuery
node.js 微信开发之定时获取access_token
2020/02/07 Javascript
JS操作Fckeditor的一些常用方法(获取、插入等)
2020/02/19 Javascript
python通过字典dict判断指定键值是否存在的方法
2015/03/21 Python
在Django框架中伪造捕捉到的URLconf值的方法
2015/07/18 Python
Python实现线程状态监测简单示例
2018/03/28 Python
python多线程与多进程及其区别详解
2019/08/08 Python
基于django ManyToMany 使用的注意事项详解
2019/08/09 Python
澳大利亚天然护肤品、化妆品和健康产品一站式商店:Nourished Life
2018/12/02 全球购物
Allen Edmonds官方网站:一家美国优质男士鞋类及配饰制造商
2019/03/12 全球购物
JENNIFER BEHR官网:各种耳环和发饰
2020/06/07 全球购物
教师实习期自我鉴定
2013/10/06 职场文书
机电一体化毕业生自荐信
2014/06/19 职场文书
群众路线问题查摆对照检查材料
2014/10/04 职场文书
高中诗歌鉴赏教学反思
2016/02/16 职场文书
2019年暑期安全广播稿!
2019/07/03 职场文书
Python实战之实现简易的学生选课系统
2021/05/25 Python
从原生JavaScript到React深入理解
2022/07/23 Javascript