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

时间:2017-11-13 15:30:25

标签: sockets networking ssh network-programming ssh-tunnel

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

理想情况下:

  1. 客户端C1创建到S的SSH反向隧道,转发C1的端口,因此可以在S上访问它自己的端口。
  2. 在C1上运行的客户端程序创建一个套接字并绑定到转发端口。
  3. 在S上运行的服务器程序创建一个套接字并绑定到转发端口。
  4. 客户端和服务器可以交换数据。
  5. 这样的事情可能吗?我尝试使用Python编写草稿但无济于事:

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

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

    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)。

    提前致谢。

1 个答案:

答案 0 :(得分:0)

Model::where('published', 1)->with('relationship') 没有做你认为它做的事情:它旨在让ssh-destination能够连接回发起者。但这会使原始方面成为服务器。

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

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

-L

现在在我的客户端计算机上,我在一个窗口中执行此操作(或者可以将其放在后台):

nc -l 9999

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

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

ssh -N -L 9999:bree:9999 bree

两个nc localhost 9999 实例已连接。