将本地端口转发到远程主机

#coding:utf-8
__author__ = ‘similarface‘
import argparse
import asyncore,socket
LOCAL_SERVER_HOST=‘localhost‘
REMOTE_SERVER_HOST=‘www.23mofang.com‘
BUFSIZE = 4096

class PortForwarder(asyncore.dispatcher):
    def __init__(self,ip,port,remoteip,remoteport,backlog=5):
        ‘‘‘
        :param ip: IP
        :param port: 端口
        :param remoteip:远程IP
        :param remoteport: 远程端口
        :param backlog: 等待连接队列的最大长度。
        :return:
        ‘‘‘
        asyncore.dispatcher.__init__(self)
        self.remoteip=remoteip
        self.remoteport=remoteport
        self.create_socket(socket.AF_INET,socket.SOCK_STREAM)
        self.set_reuse_addr()
        self.bind((ip,port))
        self.listen(backlog)

    def handle_accept(self):
        conn,addr=self.accept()
        print("连接到:",addr)
        Sender(Receiver(conn),self.remoteip,self.remoteport)

class Receiver(asyncore.dispatcher):
    ‘‘‘接收类处理传入的客户端请求‘‘‘
    def __init__(self,conn):
        asyncore.dispatcher.__init__(self,conn)
        self.from_remote_buffer=‘‘
        self.to_remote_buffer=‘‘
        self.sender=None
    def handle_connect(self):
           pass
    def handle_read(self):
           read = self.recv(BUFSIZE)
           self.from_remote_buffer += read
    def writable(self):
           return (len(self.to_remote_buffer) > 0)
    def handle_write(self):
           sent = self.send(self.to_remote_buffer)
           self.to_remote_buffer = self.to_remote_buffer[sent:]
    def handle_close(self):
           self.close()
           if self.sender:
               self.sender.close()

class Sender(asyncore.dispatcher):
    ‘‘‘发送类接收 接收类并处理向客户发送数据‘‘‘
    def __init__(self, receiver, remoteaddr,remoteport):
        asyncore.dispatcher.__init__(self)
        #
        self.receiver=receiver
        receiver.sender=self
        self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
        self.connect((remoteaddr, remoteport))
    def handle_connect(self):
        pass
    def handle_read(self):
        read = self.recv(BUFSIZE)
        self.receiver.to_remote_buffer += read
    def writable(self):
        return (len(self.receiver.from_remote_buffer) > 0)
    def handle_write(self):
        sent = self.send(self.receiver.from_remote_buffer)
        self.receiver.from_remote_buffer = self.receiver.from_remote_buffer[sent:]
    def handle_close(self):
        self.close()
        self.receiver.close()
if __name__ == "__main__":
    parser = argparse.ArgumentParser(description=‘Port forwarding example‘)
    parser.add_argument(‘--local-host‘, action="store", dest="local_host", default=LOCAL_SERVER_HOST)
    parser.add_argument(‘--local-port‘, action="store", dest="local_port", type=int, required=True)
    parser.add_argument(‘--remote-host‘, action="store", dest="remote_host",  default=REMOTE_SERVER_HOST)
    parser.add_argument(‘--remote-port‘, action="store", dest="remote_port", type=int, default=80)
    given_args = parser.parse_args()
    local_host, remote_host = given_args.local_host, given_args.remote_host
    local_port, remote_port = given_args.local_port, given_args.remote_port
    print "Starting port forwarding local %s:%s => remote %s:%s" %(local_host, local_port, remote_host, remote_port)
    PortForwarder(local_host, local_port, remote_host, remote_port)
    asyncore.loop()

  浏览器访问:http://localhost:8800 --> 会跳转到:http://www.23mofang.com

时间: 2024-11-20 02:18:59

将本地端口转发到远程主机的相关文章

SSH 本地端口转发

有时,绑定本地端口还不够,还必须指定数据传送的目标主机,从而形成点对点的"端口转发".为了区别后文的"远程端口转发",我们把这种情况称为"本地端口转发"(Local forwarding). 假定host1是本地主机,host2是远程主机.由于种种原因,这两台主机之间无法连通.但是,另外还有一台host3,可以同时连通前面两台主机.因此,很自然的想法就是,通过host3,将host1连上host2. 我们在host1执行下面的命令: $ ssh

ssh命令:隧道代理+本地端口转发+远程端口转发

0.前言 nc是一个在网络连接两端的好工具,同时也是也个临时的端口转发的好工具.(永久的端口转发用什么?用iptables) ssh也是这方面的好工具,好处是加密可靠可复用在一端操作即可,代价是要有登录帐号. 我们知道,SSH 会自动加密和解密所有 SSH 客户端与服务端之间的网络数据.但是,SSH 还同时提供了一个非常有用的功能,这就是端口转发.它能够将其他 TCP 端口的网络数据通过 SSH 链接来转发,并且自动提供了相应的加密及解密服务. 1.隧道带理 典型应用:翻越中国高墙 需要条件:一

ssh本地端口转发

ssh连接是有方向的,通常是ssh客户端去连接ssh服务器端.而我们运行的应用也是有方向的,比如我们去登陆一个qq,或者用浏览器上网,都是应用程序的客户端(本地下载qq.浏览器软件)去连接远处的qq服务器.web服务器.当ssh的连接方向和应用连接的方向一致时,这就称为ssh本地转发. 假设现在有一个防火墙保护的网络,在这个网络中防火墙会过滤经过53端口以外的数据包,所以在内网中我们就无法通过常规手段上网了,比如内网中的主机1就无法访问外网的web服务器主机3,因为经过80端口的数据全被防火墙过

SSH原理与运用(二):远程操作与端口转发

本问转载自  http://www.ruanyifeng.com/blog/2011/12/ssh_port_forwarding.html SSH原理与运用(二):远程操作与端口转发 作者: 阮一峰 日期: 2011年12月23日 接着前一次的文章,继续介绍SSH的用法. ======================================= 作者:阮一峰 (Image credit: Tony Narlock) 七.远程操作 SSH不仅可以用于远程主机登录,还可以直接在远程主机上执行

SSH 内网端口转发实战

导读 大家都知道SSH是一种安全的传输协议,用在连接服务器上比较多.不过其实除了这个功能,它的隧道转发功能更是吸引人. 如果两个内网之间的linux服务器需要互相登录,或需要互相访问内网某个端口,担忧没有公网IP,可以使用的方法有ngrok(https://ngrok.com/),但并不方便,我们只需两条 SSH 命令即可. 先给出本文主角,两条SSH命令: 远程端口转发(由远程服务器某个端口转发到本地内网服务器端口) ssh   -CfNg  -R(命令行的关键)   2222(远程服务器端口

SSH 端口转发

SSH 端口转发功能能够将其他 TCP 端口的网络数据通过 SSH 链接来转发,并且自动提供了相应的加密及解密服务.其实这一技术就是我们常常听说的隧道(tunnel)技术,原因是 SSH 为其他 TCP 链接提供了一个安全的通道来进行传输.我们知道,FTP 协议是以明文来传递数据的.但是我们可以让 FTP 客户端和服务器通过 SSH 隧道传输数据,从而实现安全的 FTP 数据传输.更常见的情况是我们的应用经常被各种防火墙限制.常见的有禁止访问某些网站.禁用某类软件,同时你的所有网络行为都被监控并

SSH 远程端口转发

既然"本地端口转发"是指绑定本地端口的转发,那么"远程端口转发"(remote forwarding)当然是指绑定远程端口的转发. 还是接着看上面那个例子,host1与host2之间无法连通,必须借助host3转发.但是,特殊情况出现了,host3是一台内网机器,它可以连接外网的host1,但是反过来就不行,外网的host1连不上内网的host3.这时,"本地端口转发"就不能用了,怎么办? 解决办法是,既然host3可以连host1,那么就从ho

流量操控之SSH隧道与端口转发

目  录 第1章            概述... 3 1.1.         实现命令... 3 1.2.         SSH隧道类型... 3 第2章            SSH隧道... 4 2.1.         动态映射(Socks代理)... 4 2.1.1.   命令... 4 2.1.2.   相关参数说明... 4 2.1.3.   意义... 4 2.1.4.   运用场景... 4 2.1.5.   优点... 6 2.1.6.   缺点... 6 2.2.   

SSH端口转发的理解(精华)

之前一直在纠结什么是端口转发,现在写下自己的理解,并试验本地端口,远程端口转发 SSH(Secure Shell,安全外壳协议),在SSH的通道上传输数据都是通过加密的,每次连接SSH会执行指纹核对来确认用户连接到正确的远程主机上,如果在其它协议的数据通过SSH端口进行转发,SSH连接作为其它协议传输的通道(隧道),这种方式也叫做SSH端口转发或SSH隧道. 作用:加密数据传输.突破防火墙限制 分类:本地转发.远程转发.动态转发 一.本地端口转发 本地转发中的本地是指将本地的某个端口转发到其他主