【问题标题】:Remote tcp connection in python with zeromqpython中的远程tcp连接与zeromq
【发布时间】:2014-04-14 06:08:09
【问题描述】:

我有一个需要与我管理的远程服务器通信的 python 客户端。他们使用 zeromq 进行通信。当我在本地测试客户端/服务器时,一切正常。但现在我将客户端和服务器部署在云上,每个都使用不同的提供商。我的问题是,建立连接的最简单方法(即安全)是什么?我假设我无法传递密码,即使可以,我猜还有更安全的选择。

我知道如何使用 ssh-keygen 设置没有密码的 ssh 连接。那行得通吗?客户端是否需要在发送 tcp req 之前与服务器建立 ssh 连接?如果有一个 python 库可以帮助解决这个问题,那将是一个很大的帮助。

谢谢!

更新: 所以超过 24 小时过去了,没有人回复/回答。我想我离解决这个问题越来越近了,但还没有完全解决。我将客户端的密钥添加到服务器上的 .ssh/authorized_key 中,现在我可以在没有密码的情况下从客户端 ssh 到服务器。接下来,我关注了这个post 关于“使用 SSH 建立 PyZMQ 连接”。这是我的客户端代码中的内容:

1    context = zmq.Context()
2    socket = context.socket(zmq.REQ)
3    socket.connect("tcp://localhost:5555")
4    ssh.tunnel_connection(socket, "tcp://locahost:5555", "myuser@remote-server-ip:5555")
5    socket.send_string(some_string)
6    reply = socket.recv()

这不起作用。我不太了解第 3 行和第 4 行,我认为我在那里做错了什么。此外,我的服务器(托管在 linode 上)有一个“默认网关”IP 和一个“公共 IP”——在隧道连接中,我只指定公共 ip,这也是我用来 ssh 到机器的 ip。

【问题讨论】:

    标签: python tcp client-server zeromq


    【解决方案1】:

    确实,ZMQ 的方式是——通过 SSH 建立隧道连接。您的示例正是需要做的,除了应该使用connecttunnel_connection,而不是两者。

    另外,在指定要连接的服务器时,请确保定义 SSH 端口,而不是 ZMQ REP 套接字端口。也就是说,您可以尝试使用myuser@remote-server-ipmyuser@remote-server-ip:22,而不是myuser@remote-server-ip:22

    import zmq
    import zmq.ssh
    context = zmq.Context()
    socket = context.socket(zmq.REQ)
    zmq.ssh.tunnel_connection(socket, "tcp://locahost:5555", "myuser@remote-server-ip")
    socket.send(b"Hello")
    reply = socket.recv()
    

    最后,确保您已安装 pexpect 或 paramiko - 他们会实际执行隧道。请注意,如果您使用的是 Windows,paramiko 是唯一可行的解​​决方案 - pexpect openssh 隧道在 Windows 上不起作用。

    如果您使用 paramiko 而不是 pexpect,请确保在 tunnel_connection 参数中设置 paramiko=True

    【讨论】:

    • 成功了!!你是男人 :) 我添加了“import pexpect”(之前只有“from zmq import ssh”)并更改了服务器连接以指定 ssh 端口号。并且还删除了 socket.connect 线。这是我正在使用的实际线路:(您可能想要更新您的答案)ssh.tunnel_connection(socket, "tcp://localhost:5555", "users@server-ip-address:ssh-port")。在我的情况下,ssh 端口不是默认的 22(出于安全目的)。非常感谢!
    • 谢谢。请注意 - 我认为您甚至可以删除“import pexpect”行,因为无论如何这都是 zsh.ssh 自己所做的。您只需要确保已安装 pexpect。
    【解决方案2】:

    我发现 Python 中的 ssh 充其量是不确定的,即使使用 paramikofabric 库,所以要调试,您可以尝试单独设置一个隧道,看看这是否是连接断开的问题.

    例如:

    ssh myuser@remote-server-ip -L 5050:localhost:5555 -N
    

    这表示:连接到myuser@remote-server-ip,并且每当我在我的机器上请求到localhost:5050 的连接时,通过ssh 连接转发它,以便remote-server-ip 的服务器认为它正在接收来自localhost:5555 的连接。

    -L 构建隧道,-N 表示在连接上不做任何其他事情。

    当它在另一个 shell 中运行时,例如,另一个终端窗口,在您的本地开发机器上,尝试连接到位于 localhost:5050 的 zeromq 服务器,这实际上是在远程服务器上运行的 zeromq。

    可以在上面的 ssh 命令中使用5555:localhost:5555,但我发现这可能会造成混淆,并且经常与同一服务的本地副本发生冲突。

    【讨论】:

    • 我用 zeromq 指南中的一个非常简单的客户端/服务器尝试了这个。它在我在同一台计算机上运行时有效,但在我通过互联网尝试时无效。我认为您的解决方案是正确的,它应该可以工作,我的服务器可能存在配置问题。感谢您的详细回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 2020-08-03
    • 1970-01-01
    • 2017-11-01
    • 2019-10-17
    • 2010-10-17
    • 1970-01-01
    相关资源
    最近更新 更多