linux - 如何区分 ZeroMQ 数据包和正常流量

标签 linux networking zeromq

我正在模拟以下场景:

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”开头的消息都会被订阅者捕获。

编辑: 我还在 AB 之间交换 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/

相关文章:

Java keytool - 非法选项 deststorepass :file

c - 在不同网络命名空间中的进程之间共享状态

git - 定期 git fetch 的副作用

c++ - 序列化可变状态并通过网络异步发送它,几乎是零拷贝(Cap'n Proto + ZeroMQ)

python - 具有真实请求数据的懒惰海盗模式

python - 如何在 Python 发布者和 C++ 订阅者之间实现简单的 ZeroMQ Pub-Sub 通信?

linux - 更改以编程方式调用 bash 的当前工作目录

linux - 缩短我的数据标签

linux - xargs 不保留格式中的前导空格

c - AF_UNIX 套接字开销?