Twisted 编写的TCP转向连接程序

机房对外的系统安装的是Linux,内网有一台Windows机器,想找工作把3389端口转到Linux服务器上,每次临时启用。

安装了iptables,竟然提示缺少模块,配置也比较繁琐,所以就放弃了。

想到以前用过的twisted,于是自己写了一个小工具:


from twisted.internet.protocol import Protocol, ClientFactory, ServerFactory
from twisted.internet import reactor
import sys

class ForwardServer(Protocol):
def __init__(self, host, port):
self.host = host
self.port = port
self.data = ""
self._connected = False

def dataReceived(self, data):
#print "Received %d bytes from client\n" % len(data)
self.data += data
#print "%d bytes in buffer" % len(self.data)
if self._connected and (len(self.data) > 0):
self.connector.transport.write(self.data)
#print "Sent %d bytes to server" % len(self.data)
self.data = ""

def connectionMade(self):
self.connector = reactor.connectTCP(self.host, self.port, ForwardClientFactory(self))
print "Client connected"

def setConnected(self, flag):
if flag:
self.onConnected()
else:
self.transport.loseConnection()
self._connected = flag

def onConnected(self):
if len(self.data) > 0:
self.connector.transport.write(self.data)
self.data = ""

def connectionLost(self, reason):
self.connector.transport.loseConnection()
self._connected = False
print "Client disonnected"

class ForwardClient(Protocol):
def __init__(self, forward):
self.forward = forward

def dataReceived(self, data):
#print "Received %d bytes from server\n" % len(data)
self.forward.transport.write(data)

def connectionMade(self):
print "Connected to server"
self.forward.setConnected(True)

def connectionLost(self, reason):
self.forward.setConnected(False)
print "Disconnected from server"

class ForwardServerFactory(ServerFactory):
def __init__(self, host, port):
self.host = host
self.port = port

def buildProtocol(self, addr):
return ForwardServer(self.host, self.port)

class ForwardClientFactory(ClientFactory):
def __init__(self, forward):
self.forward = forward

def buildProtocol(self, addr):
return ForwardClient(self.forward)

def clientConnectionFailed(self, connector, reason):
self.forward.transport.loseConnection()


if __name__ == "__main__":
if len(sys.argv) != 4:
print "USAGE: %s <host> <port> <listen port>" % sys.argv[0]
sys.exit(1)
host, port, listen_port = sys.argv[1], int(sys.argv[2]), int(sys.argv[3])
server_factory = ForwardServerFactory(host, port)
reactor.listenTCP(listen_port, server_factory)
reactor.run()

运行:
python port_forward.py 192.168.0.10 3389 3389

就可以在本机上监听3389端口,有客户连接时就建立起到服务器的连接,并在2台机器间转发数据。

twisted是reactor架构,可以支持多个侦听器和连接器,也可以接受多个客户同时访问。作些修改,就可以改成简单的负载均衡服务器。twisted易用性、效率都是很不错的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值