我正在模拟以下场景:
There are two routers, A and B, both with Internet access and also connected to each other via an internal private network (an Ethernet cable between them, basically). They each serve N clients (each router as its own client-side network). The routers send each other keepalive-like messages through a ZeroMQ publisher-subscriber scheme through the private network.
Moreover, when A is congested, it must send its clients traffic to B (and vice-versa), which will forward that traffic to the Internet and thus "help" the congested router (temporarily).
考虑到两个路由器都是Linux,我想将A的默认网关更改为B的专用网络接口(interface)IP将足以将流量刺激到B(通过公共(public)内部专用网络)。
但是,当B接收来自A客户端的流量时,必须小心,不要将包含ZeroMQ应用程序之间交换的消息的包转发到互联网(外部网络)。
我的问题是:B如何在收到的数据包中知道并区分来自客户端数据包(来自A)的ZeroMQ消息?
使用 iptables/nfqueue 捕获数据包然后分析数据包?如果是这样,什么可以识别发往 ZeroMQ 应用程序的数据包?
这一切都考虑到B会将连接到专用网络的接口(interface)中收到的所有数据包转发到互联网(上行)。
注意:我不知道这是否与问题相关,但在订阅者应用程序中,过滤器会应用于收到的消息。每条以“network_zmq”开头的消息都会被订阅者捕获。
编辑: 我还在 A 和 B 之间交换 ICMP 数据包 (ping)(这是我的场景中的要求)。这意味着从 A 到 B 的 ICMP 请求也不得转发到 Internet。
最佳答案
Q : How to differentiate ZeroMQ packets from normal traffic?
回答一个简单的问题并不容易。 ZeroMQ 不仅仅是发送一些数据包。
ZeroMQ 数据包可能使用(如果穿过 L3+ 网络基础设施)多个不同的传输类{ tcp://| PGM://| EPGM://| vmci://}
如果有这样的需要,如果将其配置为设置 TOS
标签来主动声明此类标记,则可以引入此类数据包流量的应用程序端弱标签.setsockopt( ZMQ_TOS, aToS_VALUE )
<小时/>Sets the ToS fields (Differentiated services (DS) and Explicit Congestion Notification (ECN) field of the IP header
Q : how can B know and differentiate, in the received packets, the ZeroMQ messages from the client packets (from A)?
这部分比较难。如上所述,基于 ToS
的弱检测是可能的,数据包处理的其余部分取决于 L3+ ROUTER 软件功能,而不是按原样依赖 ZeroMQ。
如果来自 A 的某些客户端数据包具有与标记 ZeroMQ 发起的流量相同的 ToS 标签,则典型的 L3+ ROUTER 软件没有机会区分这种情况(它可能会构建一些启发式方法和“猜测”,但恕我直言,L3+ ROUTER 软件此后一直主要关注性能(在 I/F 之间尽可能快地移动数据包),而不是“完全可编程”-用户定义的嗅探器-平台也不是自适应策略执行平台)
构建 ZeroMQ 代理(中间人)可能会在注入(inject) MITM 节点不违反法律约束义务的情况下为您提供帮助。
关于linux - 如何区分 ZeroMQ 数据包和正常流量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58702896/