通过ssh隧道使用套接字进行双向通信



我有一个服务器主机(S)和一堆客户端(C1、C2、C3…)。我想分别打开S和C1、C2和C3之间的连接以进行双向通信。理想情况下使用插座。首选用于授权目的的SSH。

理想情况下:

  1. 客户端C1创建到S的SSH反向隧道,转发C1的端口,使其可以作为自己的端口在S上访问
  2. 在C1上运行的客户端程序创建一个套接字并绑定到转发端口
  3. 在S上运行的服务器程序创建一个套接字并绑定到转发端口
  4. 客户端和服务器可以交换数据

这样的事情可能吗?我试着用Python编写一个草稿,但没有用:

首先,我在C1:ssh -N -R 9999:localhost:15432 root@example.com-OK 上运行

其次,在服务器上我运行:

import socket
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.bind(('localhost', 9999))
serversocket.listen(5)
while True:
connection, address = serversocket.accept()
buf = connection.recv(64)
if len(buf) > 0:
print buf
break

第三,在客户端上我运行:

import socket
clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
clientsocket.connect(('localhost', 15432))
clientsocket.send('hello')

但我正在客户端上获取socket.error: [Errno 111] Connection refused。另外,如果我先设置隧道,然后启动服务器程序,我会得到[Errno 98] Address already in use。只有当我第一次启动程序,然后设置隧道时,它才有效。

如果前面提到的概念没有意义,你建议创建一种同步工具,让任何客户端都能侦听来自服务器的查询并用数据进行响应?(最好在Python中)。

提前谢谢。

-N并没有做你认为它会做的事情:它旨在让ssh目的地能够连接回发起方。但这将使发起方成为服务器。

听起来应该使用-L来简单地创建从客户端通过ssh隧道到服务器的连接。

演示:我有一个名为"bree"的本地服务器。在那台机器上,我执行(这也可能是你的python服务器在监听9999端口):

nc -l 9999

现在在我的客户端机器上,我在一个窗口中执行这个操作(或者可以把它放在后台):

ssh -N -L 9999:bree:9999 bree

这意味着:在本地(客户端)机器上侦听9999端口,当连接到它时,通过隧道转发请求,并连接到bree上的9999端口。

现在,在客户端机器上的第二个窗口中,我执行:

nc localhost 9999

两个nc实例已连接。

最新更新