端口转发器

需要安装python2.5以上及twisted开发包
程序中的参数配置的函意是:126邮箱的中转服务器

  1. #!/usr/bin/env python
  2. # encoding: utf-8
  3. #
  4. # ################################################################
  5. #
  6. # 作者:黄江斌 (hjbcn@126.com)
  7. #
  8. # 版本:v1.0.0
  9. #
  10. # 来源:http://blog.csdn.net/zerodspace
  11. #
  12. # 工作模型
  13. #
  14. #         客户端             目标主机
  15. #            ^                  ^
  16. #            |                  |
  17. #            v                  v
  18. #         接收器  <--------> 转发器
  19. #
  20. # 映射表结构
  21. #
  22. #       ( "客户端IP", 本地端口, "目标主机IP", 目标主机端口 )
  23. #
  24. # ################################################################
  25. from twisted.internet import protocol
  26. from twisted.internet import reactor
  27. TCPPortRedirectMap = [
  28.     ( "*"28"smtp.126.com"25 ),
  29.     ( "*"29"pop.126.com"110 ),
  30. ]
  31. class TCPPortRedirectorProtocol( protocol.Protocol ):
  32.     def dataReceived( self, data ):
  33.         # 所有接收到的数据都转发到“接收器”
  34.         self.factory.recver.transport.write( data )
  35.         print data
  36.     def connectionLost( self, reason ):
  37.         # 目标主机关闭连接后
  38.         # 通知“接收器”关闭连接
  39.         self.factory.recver.transport.loseConnection()
  40.         
  41. class TCPPortRedirectorFactory( protocol.ClientFactory ):
  42.     protocol = TCPPortRedirectorProtocol
  43.     def __init__( self, recver ):
  44.         # 保存“接收器”对象
  45.         self.recver = recver
  46.         self.connector = None
  47.         
  48.     def startedConnecting( self, connector ):
  49.         # 保存“目标主机”与“转发器”的“连接对象”
  50.         # 供外部使用
  51.         self.connector = connector
  52.     
  53. class TCPPortRedirectProtocol( protocol.Protocol ):
  54.     def connectionMade( self ):
  55.         # 获取连接信息
  56.         #
  57.         # 远程主机IP
  58.         # 本地端口
  59.         remote = self.transport.getPeer().host
  60.         localhostPort = self.transport.getHost().port
  61.         # 查找映射表
  62.         # 确定转发目的地
  63.         redirectMap = None
  64.         for map in TCPPortRedirectMap:
  65.             if ( map[0] == remote or map[0] == "*" ) and map[1] == localhostPort:
  66.                 redirectMap = map
  67.                 break
  68.         # 如果没有找到转发关系
  69.         # 关闭连接
  70.         if not redirectMap:
  71.             self.transport.loseConnection()
  72.         # 建立转发器
  73.         self.redirector = TCPPortRedirectorFactory( self )
  74.         reactor.connectTCP( redirectMap[2], redirectMap[3], self.redirector )
  75.         
  76.     def dataReceived( self, data ):
  77.         self.redirector.connector.transport.write( data )
  78.         print data
  79.     def connectionLost( self, reason ):
  80.         self.redirector.connector.transport.loseConnection()
  81.         
  82.         
  83. class TCPPortRedirectFactory( protocol.Factory ):
  84.     protocol = TCPPortRedirectProtocol
  85. def TCPPortRedirectStart():
  86.     ports = []
  87.     for map in TCPPortRedirectMap:
  88.         if map[1not in ports:
  89.             ports.append( map[1] )
  90.     for port in ports:
  91.         reactor.listenTCP( port, TCPPortRedirectFactory() )
  92.     reactor.run()
  93. if __name__ == "__main__":
  94.     TCPPortRedirectStart()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值