我有一个需要与我管理的远程服务器通信的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和第3行。 4我猜我在那里做错了什么。此外,我的服务器(托管在linode上)有一个“默认网关”IP和一个“公共IP” - 在隧道连接中我只指定了公共IP,这也是我用来ssh到机器的ip。
答案 0 :(得分:10)
确实,ZMQ方式是 - 与SSH的隧道连接。您的示例正是需要完成的任务,除了应该使用connect
或tunnel_connection
,而不是两者。
此外,在指定要连接的服务器时,请确保定义SSH端口,而不是ZMQ REP套接字端口。也就是说,您可以尝试myuser@remote-server-ip:5555
或myuser@remote-server-ip
而不是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,请确保在paramiko=True
参数中设置tunnel_connection
。
答案 1 :(得分:1)
我发现Python中的ssh最好是iffy,即使使用paramiko
和fabric
库,所以要进行调试,你可以尝试单独设置隧道,只是为了看看是不是问题连接断了。
例如:
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。 / p>
你可以在上面的ssh命令中使用5555:localhost:5555
,但我发现这可能会造成混淆,并且经常与同一服务的本地副本冲突。