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的Tornado框架实现异步非阻塞访问数据库的示例
Jun 30 Python
Python 读取指定文件夹下的所有图像方法
Apr 27 Python
详谈套接字中SO_REUSEPORT和SO_REUSEADDR的区别
Apr 28 Python
python开发准备工作之配置虚拟环境(非常重要)
Feb 11 Python
PyCharm搭建Spark开发环境实现第一个pyspark程序
Jun 13 Python
Python实现制度转换(货币,温度,长度)
Jul 14 Python
解决pycharm中opencv-python导入cv2后无法自动补全的问题(不用作任何文件上的修改)
Mar 05 Python
django 解决扩展自带User表遇到的问题
May 14 Python
python dict乱码如何解决
Jun 07 Python
Keras - GPU ID 和显存占用设定步骤
Jun 22 Python
Python判断字符串是否为合法标示符操作
Sep 03 Python
pytorch中的numel函数用法说明
May 13 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树形菜单代码
2014/11/19 PHP
利用PHP命令行模式采集股票趋势信息
2016/08/09 PHP
利用phpexcel对数据库数据的导入excel(excel筛选)、导出excel
2017/04/27 PHP
php实现查询功能(数据访问)
2017/05/23 PHP
PHP实现QQ、微信和支付宝三合一收款码实例代码
2018/02/19 PHP
thinkPHP框架中layer.js的封装与使用方法示例
2019/01/18 PHP
PHP开启目录引索+fancyindex漂亮目录浏览带搜索功能
2019/09/23 PHP
理解JavaScript中的事件
2006/09/23 Javascript
Jquery截取中文字符串的实现代码
2010/12/22 Javascript
jquery中的 $(&quot;#jb51&quot;)与document.getElementById(&quot;jb51&quot;) 的区别
2011/07/26 Javascript
js文件包含的几种方式介绍
2014/09/28 Javascript
jQuery中prependTo()方法用法实例
2015/01/08 Javascript
初识Javascript小结
2015/07/16 Javascript
JS实现自定义简单网页软键盘效果代码
2015/11/05 Javascript
javascript事件绑定学习要点
2016/03/09 Javascript
JQuery插件Marquee.js实现无缝滚动效果
2016/04/26 Javascript
Javascript仿京东放大镜的效果
2017/03/01 Javascript
node版本管理工具n包使用教程详解
2018/11/09 Javascript
JavaScript实现简单随机点名器
2019/11/21 Javascript
Vue——解决报错 Computed property &quot;****&quot; was assigned to but it has no setter.
2020/12/19 Vue.js
[04:11]DOTA2亚洲邀请赛小组赛第一日 TOP10精彩集锦
2015/01/30 DOTA
使用PDB模式调试Python程序介绍
2015/04/05 Python
利用Python实现网络测试的脚本分享
2017/05/26 Python
Python3实战之爬虫抓取网易云音乐的热门评论
2017/10/09 Python
Python无损音乐搜索引擎实现代码
2018/02/02 Python
Python爬虫爬取ts碎片视频+验证码登录功能
2021/02/22 Python
Roxy俄罗斯官方网站:冲浪和滑雪板的一切
2020/06/20 全球购物
医学院毕业生自荐信
2013/11/08 职场文书
体育教育毕业生自荐信
2014/06/29 职场文书
信用卡工资证明格式
2014/09/13 职场文书
授权委托书怎么写
2014/09/25 职场文书
教师求职自荐信范文
2015/03/04 职场文书
行政处罚事先告知书
2015/07/01 职场文书
2019年年中职场激励人心语录30条
2019/08/07 职场文书
Vue中Object.assign清空数据报错的解决方案
2022/03/03 Vue.js
Python pyecharts绘制条形图详解
2022/04/02 Python