鱼C论坛

 找回密码
 立即注册
查看: 2821|回复: 0

[技术交流] 关于使用Python来构建tunnel的方法

[复制链接]
发表于 2014-11-17 15:05:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
先来说说我的需求把,最近在使用腾讯的云服务器,可是腾讯的蛋疼规定,只开放了少许的端口,并且这些端口还只开放了他们自定义的包头的包,于是我想自己搭一个tunnel,具体的方案是这样的 无标题.png

如上图所见,我想在local server和TX server之间建立一个长连接的tunnel,然后local server本地监听一些应用端口,这些应用连接相应的端口时,tunnel就会转发到TX server相应的端口上,这样就可以绕过包头的限制了。


我现在的做法是,在local server上写了一个tunnel_local.py,首先建立socket连接TX server端tunnel_tx.py监听的8001端口,然后发一个腾讯要求的包头过去,以此建立长连接,然后再本地监听9001端口,提供给rsync服务使用,9002端口提供给ftp服务使用等等。


现在ftp的基本功能其实已经实现了,只是在socket如何判断监听包已发送这点有点问题,在本机TX server那边能接到ftp login之类的指令,可是我local server 这边收不到返回的包,想看看大家有木有什么好方法,指导我一下,下面是部分代码
  1. def server(dock_socket,server_socket):
  2.     client_socket = dock_socket.accept()[0]
  3.     client_socket.settimeout(60)
  4.     forward(client_socket,server_socket)

  5. def forward(client_socket,server_socket):
  6.     t1 = threading.Thread(target=trans, args=('from',client_socket, server_socket))
  7.     t2 = threading.Thread(target=trans, args=('to', server_socket,client_socket))
  8.     t1.start()
  9.     t2.start()
  10.     t1.join()
  11.     t2.join()
  12.     client_socket.close()

  13. def trans(flag,client,server):
  14.     while True:
  15.         print flag + " loading.."
  16.         try:
  17.             ts = client.recv(4096)
  18.             print "ts:" + ts
  19.             if not ts:
  20.                 print "out..."
  21.                 break
  22.             server.sendall(ts)
  23.         except socket.timeout:
  24.             print "time out."
  25.             break
复制代码

然后就是rsync的问题了,rsync是多通道的服务,当你去连接一个rsync的时候,服务器端的rsync会重启一个连接来回连你,这样问题就来了,我怎么样让回来的连接也走我的tunnel啊,不然回不来啊,TX server是封了所有出去的连接的。



所以各位,求指导求鞭策啊!
@小甲鱼

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-8 00:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表