当我使用常规UDP套接字时,我从recvfrom()获取远程客户端的地址。 当我使用常规TCP套接字时,我获取远程客户端的地址作为调用accept()的一部分。 但是,在ZeroMQ中,似乎没有获得远程客户端地址的好方法。 如果我想使用它来接受来自互联网上通常不受信任的第三方的请求,则这非常不方便,因为例如我无法过滤允许在特定发布者套接字上订阅哪些远程节点。
我错过了什么? ZMQ是否真的适合在受防火墙保护的LAN / VLAN上使用?例如,每条消息上的一个简单的“源地址”元数据字段非常有用,就像注册允许或禁止绑定套接字上的连接的“网守”一样。
请注意,套接字上的“IDENTITY”选项无法解决此问题,因为任何来源都可以轻易地进行欺骗。相反,源IP /端口是不可欺骗的,如果远程实体想要响应任何数据包。
答案 0 :(得分:0)
旧问题,但由于我也遇到过这个问题,因此请允许我提供意见。
我的客户通过其CURVE密钥进行身份验证(和加密)。但是,似乎将客户端的公钥添加到服务器(zmq.AuthCurveAdd)后,一切都在幕后完成并向开发人员隐藏。意思是,我知道我的客户已获得服务器的授权(因为他们拥有服务器信任的密钥对),但我不知道谁是谁。如上所述,身份存在相同的问题。我必须相信我的客户就是他们所说的。
我维护密钥身份验证/加密以及身份,但是添加另一层以便进行更好的身份验证(将给定消息绑定到特定客户端):客户端将其身份存储在配置文件中,服务器将其身份存储在配置文件中SQL表旁边是密码哈希。客户端(当然)会随每条消息一起发送其标识,以及其密码的哈希值。很简单,但是有效。
现在我需要做的是使用HMAC /类似的东西,这样我不仅依赖哈希来进行身份验证。但是您可以看到我的想法(我必须在ZMQ之上设计自己的解决方案)。