1. Cassandra 集群防火墙端口配置概述
在配置 Cassandra 集群的防火墙端口时,需要确保集群内部节点之间以及与外部客户端之间的通信通道是安全且可用的。Cassandra 主要依赖以下端口进行通信:
– 7000:节点间通信端口,用于数据节点之间的 Gossip 协议。
– 7001:节点间通信端口,用于数据节点之间的轻量级 RPC(远程过程调用)。
– 7199:JMX 端口,用于监控和管理 Cassandra 集群。
– 9042:CQL 端口,用于通过 CQL 客户端访问 Cassandra 数据。
– 9160:Kafka 端口,如果使用 Kafka 作为日志存储或流处理中间件。
正确配置这些端口是确保集群稳定运行的关键步骤。以下将详细介绍每个端口的配置方法和注意事项。
2. 节点间通信端口配置
节点间通信是 Cassandra 高可用性的基础,因此 7000 和 7001 端口需要被集群内部的所有节点允许互访。以下是具体操作步骤:
首先,确保每个 Cassandra 节点的防火墙规则允许来自其他节点的访问。以 Linux 服务器为例,可以使用 `iptables` 或 `firewalld` 进行配置。
sudo iptables -A INPUT -p tcp --dport 7000 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 7001 -j ACCEPT
如果使用 `firewalld`,则可以通过以下命令开放端口:
sudo firewall-cmd --permanent --add-port=7000/tcp
sudo firewall-cmd --permanent --add-port=7001/tcp
sudo firewall-cmd --reload
此外,需要在 Cassandra 的配置文件 `cassandra.yaml` 中确保 `seed_host` 列表中的节点可以访问到当前节点。通常情况下,这些配置会自动完成,但建议检查 `cassandra.yaml` 文件中的 `listen_address` 和 `broadcast_address` 设置是否正确。
3. JMX 端口配置
JMX 端口(7199)用于通过 JMX 工具(如 JConsole)监控 Cassandra 集群。如果计划使用 JMX 进行监控,需要确保防火墙允许该端口访问。
sudo iptables -A INPUT -p tcp --dport 7199 -j ACCEPT
sudo firewall-cmd --permanent --add-port=7199/tcp
sudo firewall-cmd --reload
在配置 JMX 访问时,还需要在 `cassandra.yaml` 文件中设置 `jmx_remote_access` 相关参数,例如:
jmx_remote_access_enabled: true
jmx_remote_access_host: 0.0.0.0
jmx_remote_access_port: 7199
注意,`jmx_remote_access_host` 设置为 `0.0.0.0` 表示允许所有 IP 访问 JMX 端口,生产环境中建议限制为特定的 IP 地址以提高安全性。
4. CQL 端口配置
CQL 端口(9042)是 Cassandra 的主要客户端访问接口。如果计划使用 CQLsh 或其他 CQL 客户端连接集群,需要开放该端口。
sudo iptables -A INPUT -p tcp --dport 9042 -j ACCEPT
sudo firewall-cmd --permanent --add-port=9042/tcp
sudo firewall-cmd --reload
在配置 CQL 访问时,还需要确保 Cassandra 的 `cassandra.yaml` 文件中 `cql_port` 设置正确:
cql_port: 9042
此外,如果需要从外部网络访问 CQL 端口,建议使用 VPN 或 SSH隧道来增加安全性。
5. Kafka 端口配置
如果使用 Kafka 作为 Cassandra 的日志存储或流处理中间件,需要开放 Kafka 的默认端口(9160)。
sudo iptables -A INPUT -p tcp --dport 9160 -j ACCEPT
sudo firewall-cmd --permanent --add-port=9160/tcp
sudo firewall-cmd --reload
在配置 Kafka 时,需要在 Cassandra 的 `cassandra.yaml` 文件中设置 `kafka_broker_list` 参数,指定 Kafka 服务器地址:
kafka_broker_list: ["kafka1:9092", "kafka2:9092"]
确保 Kafka 服务器也允许 Cassandra 节点访问其 9092 端口。
6. 防火墙规则持久化
在 Linux 系统中,`iptables` 规则默认不会在系统重启后保留。因此,需要将规则保存到持久化配置中。以 `iptables` 为例,可以使用以下命令保存规则:
sudo iptables-save > /etc/iptables/rules.v4
对于 `firewalld`,规则默认是持久的,但建议在修改后重新加载防火墙配置:
sudo firewall-cmd --reload
确保在所有 Cassandra 节点上重复上述步骤,以避免端口访问问题。
7. 如何验证端口配置
配置完成后,可以通过以下方式验证端口是否正确开放:
– 使用 `telnet` 或 `nc` 命令测试端口是否可访问:
telnet 7000
nc -zv 7001
– 使用 `cqlsh` 连接 CQL 端口:
cqlsh :9042
– 使用 JConsole 连接 JMX 端口:
jconsole :7199
如果连接成功,则表示端口配置正确。如果失败,检查防火墙规则和 Cassandra 配置文件。
8. 安全注意事项
开放防火墙端口时,应遵循最小权限原则,仅开放必要的端口。对于 CQL 和 JMX 端口,建议限制访问特定 IP 地址,避免未授权访问。例如,在 `firewalld` 中可以这样配置:
sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port=9042 protocol=tcp accept'
此外,定期检查防火墙规则和访问日志,确保没有异常流量。
9. 常见问题解答
Q1: 为什么 Cassandra 节点之间无法通信?
A1: 首先检查防火墙规则是否允许 7000 和 7001 端口的双向通信。其次,确认 `cassandra.yaml` 中的 `listen_address` 和 `broadcast_address` 设置正确,且 `seed_host` 列表包含所有节点。
Q2: 如何安全地开放 CQL 端口给外部客户端?
A2: 建议使用 VPN 或 SSH 隧道将 CQL 端口转发到内部网络。例如,可以通过 SSH 隧道访问:
ssh -L 9042:your_cassandra_node:9042 user@your_vpn_server
这样,外部客户端可以通过 9042 端口访问到内部 Cassandra 节点的 9042 端口。
Q3: JMX 端口被攻击怎么办?
A3: 立即关闭 JMX 公开访问,改为仅允许特定 IP 访问。在 `cassandra.yaml` 中修改 `jmx_remote_access_host`,例如:
jmx_remote_access_host: "192.168.1.100"
同时,检查防火墙规则,确保只有该 IP 可以访问 7199 端口。此外,考虑使用更安全的监控方式,如 Prometheus + JMX Exporter。