|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
先来说说我的需求把,最近在使用腾讯的云服务器,可是腾讯的蛋疼规定,只开放了少许的端口,并且这些端口还只开放了他们自定义的包头的包,于是我想自己搭一个tunnel,具体的方案是这样的
如上图所见,我想在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 这边收不到返回的包,想看看大家有木有什么好方法,指导我一下,下面是部分代码
- def server(dock_socket,server_socket):
- client_socket = dock_socket.accept()[0]
- client_socket.settimeout(60)
- forward(client_socket,server_socket)
- def forward(client_socket,server_socket):
- t1 = threading.Thread(target=trans, args=('from',client_socket, server_socket))
- t2 = threading.Thread(target=trans, args=('to', server_socket,client_socket))
- t1.start()
- t2.start()
- t1.join()
- t2.join()
- client_socket.close()
- def trans(flag,client,server):
- while True:
- print flag + " loading.."
- try:
- ts = client.recv(4096)
- print "ts:" + ts
- if not ts:
- print "out..."
- break
- server.sendall(ts)
- except socket.timeout:
- print "time out."
- break
复制代码
然后就是rsync的问题了,rsync是多通道的服务,当你去连接一个rsync的时候,服务器端的rsync会重启一个连接来回连你,这样问题就来了,我怎么样让回来的连接也走我的tunnel啊,不然回不来啊,TX server是封了所有出去的连接的。
所以各位,求指导求鞭策啊!
@小甲鱼
|
|