如何在 ActiveMQ 中使用防火墙?

How to use firewall with ActiveMQ?

我在 3 个虚拟机中配置了这个端口 运行 ZookeeperActiveMQ.

root@mom3:~# ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22                         ALLOW IN    Anywhere
2881                       ALLOW IN    Anywhere
2888                       ALLOW IN    Anywhere
3888                       ALLOW IN    Anywhere
61616                      ALLOW IN    Anywhere
61617                      ALLOW IN    Anywhere
22 (v6)                    ALLOW IN    Anywhere (v6)
2881 (v6)                  ALLOW IN    Anywhere (v6)
2888 (v6)                  ALLOW IN    Anywhere (v6)
3888 (v6)                  ALLOW IN    Anywhere (v6)
61616 (v6)                 ALLOW IN    Anywhere (v6)
61617 (v6)                 ALLOW IN    Anywhere (v6)

当我尝试启动 ActiveMQ 时,它会获得一个 随机端口 来使用它:

 INFO | Master started: tcp://mom1.company.com:37649
 WARN | Store update waiting on 1 replica(s) to catch up to log position 0. 
 WARN | Store update waiting on 1 replica(s) to catch up to log position 0. 
 WARN | Store update waiting on 1 replica(s) to catch up to log position 0. 

但是当我禁用我的防火墙时,ActiveMQ正常启动。

如何每次都使用同一个端口,以便在我的防火墙中创建新规则?

编辑 根据@Daniel 的建议,这是我对 activemq.xml 文件的配置。

<persistenceAdapter>
    <replicatedLevelDB
        directory="${activemq.data}/leveldb"
        replicas="3"
        bind="tcp://0.0.0.0:0:61616"
        zkAddress="mom1.company.com:2881,mom2.company.com:2881,mom3.company.com:2881"
        zkPassword="password"
        zkPath="/activemq/leveldb-stores"
        hostname="mom3.company"
    />
</persistenceAdapter>

...
<transportConnectors>
    <!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
    <transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
    <transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
    <transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
    <transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
    <transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
    <transportConnector name="ssl" uri="ssl://0.0.0.0:61617?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
</transportConnectors>

因为你写的是关于动物园管理员的文章,我模糊地记得我在使用 master/slave 复制的 levelDB 设置时的这条日志行,我将继续并假设你也在使用一个。如果确实是这种情况,那么您看到的端口就是主机启动的 "bind" 端口,供客户端连接并开始复制数据。可以使用 replicatedLevelDB 部分中的绑定参数在代理 XML 配置中轻松配置此端口,例如

<broker brokerName="broker" ... >
  ...
  <persistenceAdapter>
    <replicatedLevelDB
      directory="activemq-data"
      replicas="3"
      bind="tcp://0.0.0.0:<myDesiredPort>"
      zkAddress="zoo1.example.org:2181,zoo2.example.org:2181,zoo3.example.org:2181"
      zkPassword="password"
      zkPath="/activemq/leveldb-stores"
      hostname="broker1.example.org"
      />
  </persistenceAdapter>
  ...
</broker>

将始终使用 "myDesiredPort" 作为绑定端口。由于通常 61619 是默认端口,当这个参数根本没有设置时,你可能已经配置了这个元素,但是 bind="tcp://0.0.0.0:0" 动态选择一个。有关复制的 levelDB 的更多解释和可用参数的完整列表,请参阅 documentation

希望这能解决您的问题,如果这不是您的设置,请将您的 Broker 配置添加到您的问题中,这样可以更轻松地找到真正的罪魁祸首而无需猜测。