利用asyncore.dispatcher写的端口转发器

创建三个继承类,PortForwarder用于监听本地,Receiver与PortForwarder套接字相连,用于接受本地请求,发给数据给远程主机,Sender与Receiver相互包含,用于接受远程主机数据和发送数据到本地。大致形成这样的关系:本地主机---PortForwarder---Receiver---Sender---远程主机

  1 #!/usr/bin/env python
  2 #-*- coding:utf-8 -*-
  3
  4 import argparse
  5 import asyncore
  6 import socket
  7
  8 LOCAL_SERVER_HOST = ‘localhost‘
  9 REMOTE_SERVER_HOST = ‘www.baidu.com‘
 10 BUFSIZE = 4096
 11 LOCAL_SERVER_PORT = 0
 12
 13 class PortForwarder(asyncore.dispatcher):#监听本地
 14     def __init__(self, ip, port, remoteip, remoteport, backlog=5):
 15         asyncore.dispatcher.__init__(self)
 16         self.remoteip = remoteip
 17         self.remoteport = remoteport
 18         self.create_socket(socket.AF_INET, socket.SOCK_STREAM)#创建一个套接字对象
 19         self.set_reuse_addr()#设置地址端口可重用
 20         self.bind((ip, port))#绑定本地ip与端口
 21         self.listen(backlog)#开始监听
 22
 23     def handle_accept(self):#处理接受
 24         conn, addr = self.accept()#等待接受
 25         print "Connected to:", addr
 26         Sender(Receiver(conn), self.remoteip, self.remoteport)
 27
 28 class Receiver(asyncore.dispatcher):#接受本地请求数据,发送给远程主机
 29     def __init__(self, conn):
 30         asyncore.dispatcher.__init__(self, conn)
 31         #self被初始化为该连接客户端socket
 32         #getpeername函数用于获取与某个套接字关联的外地协议地址
 33         self.from_remote_buffer = ‘‘#保存来自远程主机数据
 34         self.to_remote_buffer = ‘‘    #保存本地请求数据
 35         self.sender = None
 36
 37     def handle_connect(self):
 38         pass
 39
 40     def handle_read(self):#接受本地请求
 41         read = self.recv(BUFSIZE)
 42         self.to_remote_buffer += read;
 43         print "receiver read", self.to_remote_buffer
 44
 45     def writable(self):#判断是否有来自远程主机的数据,如果有,调用handle_write
 46         return (len(self.from_remote_buffer) > 0)
 47
 48     def handle_write(self):#发送来自远程主机的数据给本地主机
 49         sent = self.send(self.from_remote_buffer)
 50         print "receiver sent", sent
 51         self.from_remote_buffer = self.from_remote_buffer[sent:]#发送完成后清空数据
 52
 53     def handle_close(self):
 54         self.close()
 55         if self.sender:
 56             self.sender.close()
 57
 58 class Sender(asyncore.dispatcher):#接受远程主机数据,发送本地请求数据
 59     def __init__(self, receiver, remoteaddr, remoteport):
 60         asyncore.dispatcher.__init__(self)
 61         self.receiver = receiver#建立Sender与Receiver之间联系
 62         receiver.sender = self    #建立Sender与Receiver之间联系
 63         self.create_socket(socket.AF_INET, socket.SOCK_STREAM)#创建套接字
 64         self.connect((remoteaddr, remoteport))#连接远程主机
 65
 66     def handle_connect(self):
 67         pass
 68
 69     def handle_read(self):#接受来自远程主机的数据
 70         read = self.recv(BUFSIZE)
 71         self.receiver.from_remote_buffer += read
 72         print "sender read", self.receiver.from_remote_buffer
 73
 74     def writable(self):#判断是否有本地请求要发送,如果有,调用handle_write
 75         if len(self.receiver.to_remote_buffer) > 0:
 76             self.receiver.to_remote_buffer = self.receiver.to_remote_buffer.replace 77                 (LOCAL_SERVER_HOST + ‘:‘ + str(LOCAL_SERVER_PORT), REMOTE_SERVER_HOST)
 78             #修改本地请求数据,将本地主机中host改为远程主机地址
 79         return (len(self.receiver.to_remote_buffer) > 0)
 80
 81     def handle_write(self):#发送本地请求数据
 82         sent = self.send(self.receiver.to_remote_buffer)
 83         print "sender write",sent
 84         self.receiver.to_remote_buffer = self.receiver.to_remote_buffer[sent:]
 85
 86     def handle_close(self):
 87         self.close()
 88         self.receiver.close()
 89
 90 if __name__ == ‘__main__‘:
 91     parser = argparse.ArgumentParser(description="stackless socket server example")
 92     parser.add_argument(‘--localhost‘, action="store", dest="local_host", default=LOCAL_SERVER_HOST)
 93     parser.add_argument(‘--local-port‘, action="store", dest="local_port", type=int, required=True)
 94     parser.add_argument(‘--romote-port‘, action="store", dest="remote_host",default=REMOTE_SERVER_HOST)
 95     parser.add_argument(‘--remot-port‘, action="store", dest="remote_port", type=int, default=80)
 96     given_args = parser.parse_args()
 97     local_host, remote_host = given_args.local_host, given_args.remote_host
 98     local_port, remote_port = given_args.local_port, given_args.remote_port
 99     LOCAL_SERVER_PORT = local_port
100     print "start port forwarding local %s:%s => remote %s:%s" % 101         (local_host, local_port, remote_host, remote_port)
102     PortForwarder(local_host, local_port, remote_host, remote_port)
103     asyncore.loop()
时间: 2024-10-05 07:00:41

利用asyncore.dispatcher写的端口转发器的相关文章

python Asyncore.dispatcher 理解

1.Asyncore是python的标准库.Asyncore.dispatcher 是这个库中的一个socket的框架,为socket添加了一些通用的回调方法,比如: def listen(self, num): def bind(self, addr): def connect(self, address): def accept(self): def send(self, data): def recv(self, buffer_size): def close(self): def han

如何利用JLINK烧写U-boot到NAND Flash中

原文:http://blog.csdn.net/yanghao23/article/details/7689534  很多同学使用笔记本作为自己的ARM开发和学习的平台,绝大多数笔记本都没有并口,也就是无法使用JTag调试和烧写程序到Nand Flash中,幸好我们还有JLINK,用JLINK烧写U-boot到Nor Flash中很简单,大部分NOR Flash都已经被JLink的软件SEGGER所支持,而新手在学习的时候经常会实验各种各样的命令,最悲剧的莫过于将NAND Flash中原有的bo

python写的端口扫描脚本

今天看到群里哥们发了一个需求,如下: "如何批量检测一批主机的端口,是否存在,端口都是对外的",感觉不难,就用py写了个小脚本,有问题的地方,还望大家指出,谢谢! #!/usr/bin/env python import socket file = "C:\Users\Administrator\py_demo\ip.txt" port = 80 a = open(file, 'r') b = a.readlines() a.close() for i in b:

利用Java手写简单的httpserver

前言: 在看完尚学堂JAVA300中讲解如何实现一个最简单的httpserver部分的视频之后, 一.前置知识 1.HTTP协议 当前互联网网页访问主要采用了B/S的模式,既一个浏览器,一个服务器,浏览器向服务器请求资源,服务器回应请求,浏览器再将接收到的回应解析出来展现给用户.这一问一答的过程可以抽象成浏览器向服务器发送一个Request然后服务器返回一个Response的过程 其中Request和Reponse在HTTP中有有具体的格式要求 一个Request的例子 Method Path-

如何写绑定端口shellcode

前面<如何编写本地shellcode>一文介绍如何编写shellcode取得shell进行交互.本文介绍另一个例子,绑定端口的shellcode.攻击通过网络利用缓冲区溢出漏洞,注入该shellcode,那就可以能过shellcode打开的端口进行利用. Shellcode逻辑C代码 绑定端口shellcode的逻辑很简单:打开socket,然后绑定到端口,等待远程进行链接,链接到后将0/1/2描述符都复制该socket上,再启动一个shell. 代码如下: #include <unis

利用反射手写代码实现spring AOP

前言:上一篇博客自己动手编写spring IOC源码受到了大家的热情关注,在这里博客十分感谢.特别是给博主留言建议的@玛丽的竹子等等.本篇博客我们继续,还是在原有的基础上进行改造.下面请先欣赏一下博主画的一张aop简图(没有艺术天分,画的不好莫见怪) 解析:往往在我们的系统的多个核心流程中会有一部分与之关系不大的相同的横切流程,例如权限认证,事务管理.因此我们一般会抽象出这些相同的比较次要的交给spring aop的Handler来统一处理这些横切流程也就是上图中绿色部分.接下来我们看一下本例结

端口转发器

功能: 支持本机和远程ip端口tcp数据转发. 支持tcp短连接(http等)和长连接(基于tcp大容量(GiB以上)文件传输). 工作流程简述: 转发器建立监听端口p1,接收到新连接请求后,建立新连接s1,再建立与目标地址端口p2新连接s2,然后s1.s2组合为一条新转发线路.最后开始转发数据. 基于go语言开发,使用go默认net库.Go 语言层面采用阻塞+多协程模式,进行网络通信. 网络模型: 因为go的默认net库,底层基于非阻塞+多路复用模型(windows iocp.linux ep

网络安全系列之二 利用lcx实现内网端口转发

内网中的主机一般都是使用私有IP,在网络出口处经过NAT转换为公网IP之后,才能访问Internet.在这种网络结构下,通信双方之间实现的是单向访问,即只有内网中的主机可以主动访问Internet中的主机,反之则不行.如果在内网中架设了一台服务器,又需要允许Internet中的用户访问这台服务器,那么就必须在网络出口处进行端口映射.在网络攻防中,如果捕获了一台位于内网中的肉鸡,那么黑客是无法主动去连接这台肉鸡的,而且也不可能在人家的网络出口做端口映射,这时就可以用到lcx这个小工具了.下载地址:

如何利用apidoc来写接口文档

在开发后台接口的过程中,肯定要提供一份api接口文档给终端.一直用word写,太丑了..怎么才能做出一份漂亮的api文档呢?找了好久发现了今天的主角-apidoc. 官网地址:http://apidocjs.com 开放API已经成为当下主流平台的一个要素,特别对于社交.电商类的平台开放API更成为了竞争力的一种.开放API文档的完整性.可阅读性往往影响着接入方是否能顺利地.快速地接入到平台,一份好的.统一的API文档也是开放平台不可或缺的要素. apidoc是通过源码中的注释来生成API文档,