使用ZeroMQ在Python中实现远程TCP连接

5
我有一个Python客户端需要与我管理的远程服务器通信。他们使用zeromq进行通信。当我在本地测试客户端/服务器时,一切正常。但现在我已经将客户端和服务器部署在云上,每个都使用不同的提供商。我的问题是,最简单的(安全)连接方式是什么?我假设我不能传递密码,即使我可以,我猜测还有更安全的替代方案。
我知道如何使用ssh-keygen设置无密码的ssh连接。那会起作用吗?客户端是否需要在发送tcp请求之前与服务器建立ssh连接?如果有一个Python库可以帮助解决这个问题,那将是很大的帮助。
谢谢!
更新: 超过24小时过去了,没有人回复/回答。我认为我正在接近解决这个问题,但还没有完全解决。我将客户端的密钥添加到服务器的.ssh / authorized_key中,现在我可以从客户端ssh到服务器而无需密码。接下来,我按照此帖子关于“使用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()

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

2个回答

13

的确,ZMQ的方法是使用SSH隧道连接。您的示例正是需要完成的内容,只是应该使用connecttunnel_connection中的一个,而不是两个都使用。

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

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,请确保在参数中设置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(出于安全考虑)。非常感谢! - user247866
谢谢。注意 - 我认为您甚至可以删除 "import pexpect",因为这是 zsh.ssh 在任何情况下都会自行执行的操作。您只需要确保已安装 pexpect。 - Tim

1
我发现即使使用paramiko和fabric库,Python中的ssh也可能存在问题,因此为了调试,您可以尝试单独设置隧道,以查看是否是连接中断的问题。
例如:
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,但我发现这可能会令人困惑,并且经常与同一服务的本地副本冲突。


2
我尝试了一下 zeromq 指南中的一个非常简单的客户端/服务器。当我在同一台计算机上运行时,它可以工作,但是当我尝试通过互联网连接时就不行了。我认为你的解决方案是正确的,它应该可以工作,可能是我的服务器配置有问题。感谢您详细的回答。 - user247866

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接