HBase是一个分布式的、面向列的开源数据库,它构建在HDFS之上,依赖ZooKeeper做协调服务,集群内部节点之间的网络交互非常频繁。在生产环境中,服务器出于安全规范通常都会开启iptables防火墙,如果只开放了部分端口,就很容易出现RegionServer反复下线、客户端连接超时、集群启动卡住等问题。这篇文章就来详细讲讲HBase场景下iptables规则应该怎么设计,需要放行哪些端口,以及配置过程中有哪些容易踩的坑。

一、HBase集群涉及哪些网络端口
在动手写iptables规则之前,首先要搞清楚HBase集群内部到底有哪些组件在通信。只有明确了通信路径和端口,规则才不会漏。HBase本身的核心端口主要有三个:Master的RPC端口默认是16000,Master的Web UI端口默认是16010,RegionServer的RPC端口默认是16020,RegionServer的Web UI端口默认是16030。这些端口可以在hbase-site.xml中通过hbase.master.port和hbase.regionserver.port参数修改。
除了HBase自身的端口,它依赖的组件也必须放行。ZooKeeper默认使用2181端口提供客户端连接,另外还有2888和3888端口用于ZooKeeper集群内部的选举和同步。底层的HDFS更是重头戏:NameNode的RPC端口默认是8020(或9000,取决于配置),NameNode的HTTP端口是50070,DataNode的数据传输端口是50010,DataNode的IPC端口是50020,HTTP端口是50075。如果这些端口没有放行,即使HBase端口全开了,集群照样起不来,因为HBase写入数据最终要落到HDFS上。
还需要注意的是,HBase的RPC通信使用了动态端口。客户端与RegionServer之间的长连接、RegionServer之间互相通信时,部分场景下会使用临时端口范围。临时端口范围可以通过cat /proc/sys/net/ipv4/ip_local_port_range查看,通常是32768到60999。这也是很多新手配了规则却依然报Connection Refused的原因之一。
二、iptables规则的具体配置方法
明确了端口之后,配置规则一般有两种思路。第一种是精确放行,即逐条添加ACCEPT规则;第二种是内网信任,即对整个集群网段直接放行。生产环境如果所有节点都在同一个内网网段,推荐第二种方式,规则简单且不容易遗漏。
先看精确放行的写法,假设集群网段为192.168.1.0/24,需要放行HBase、ZooKeeper和HDFS的端口:
# 放行HBase Master端口(RPC和Web UI) iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 16000 -j ACCEPT iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 16010 -j ACCEPT # 放行RegionServer端口(RPC和Web UI) iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 16020 -j ACCEPT iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 16030 -j ACCEPT # 放行ZooKeeper端口 iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 2181 -j ACCEPT iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 2888 -j ACCEPT iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 3888 -j ACCEPT # 放行HDFS相关端口 iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 8020 -j ACCEPT iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 50010 -j ACCEPT iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 50020 -j ACCEPT iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 50070 -j ACCEPT iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 50075 -j ACCEPT
如果采用内网信任策略,一条规则就够了:
# 对整个内网网段直接放行,简化集群内部通信 iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT # 管理员机器如果跨网段,单独放行SSH和Web UI访问 iptables -A INPUT -s 10.0.0.5/32 -p tcp --dport 22 -j ACCEPT iptables -A INPUT -s 10.0.0.5/32 -p tcp --dport 16010 -j ACCEPT
这里有一个非常关键的细节:规则的顺序。iptables是从上往下逐条匹配的,一旦命中就不再往下走。如果INPUT链里已经存在一条类似-A INPUT -j REJECT --reject-with icmp-host-prohibited的拒绝规则,那么你后来用-A追加的ACCEPT规则永远不会被匹配到。此时应该用-I INPUT 1把放行规则插入到链的头部,或者先删除拒绝规则再重新编排。这是实际运维中最高频的故障原因,务必用iptables -L INPUT --line-numbers检查规则的顺序和命中计数。
三、规则持久化与集群环境的注意事项
通过命令行添加的iptables规则只存在于内存中,机器重启后就会丢失。CentOS或RHEL系统可以使用service iptables save把规则写入/etc/sysconfig/iptables文件,或者手动编辑该文件后执行service iptables restart使其生效。如果系统使用的是firewalld,则需要通过firewall-cmd来管理,例如firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 accept',然后执行firewall-cmd --reload。建议在所有节点上统一持久化方式,避免有的节点重启后规则丢失导致集群状态异常。
# 保存规则使其重启后仍然生效 service iptables save # 查看当前规则及每条规则的命中计数 iptables -L INPUT -n -v --line-numbers
集群环境的另一个注意事项是规则要覆盖双向通信。iptables的INPUT链过滤的是进入本机的流量,而HBase的Master与RegionServer之间、RegionServer互相之间、客户端与集群之间都是双向请求。换句话说,每台服务器上都要配置同样的放行规则,只在一台节点上配置是没用的。建议把规则写成脚本,配合Ansible之类的工具批量下发到所有节点,保证策略一致。
四、常见问题排查思路
配置完规则后如果集群仍然不正常,可以按以下步骤排查。第一步确认端口是否真的在监听,用netstat -tlnp | grep 16020查看RegionServer端口,用netstat -tlnp | grep 2181确认ZooKeeper正常。第二步用telnet或者nc测试连通性,例如在客户端机器上执行telnet 192.168.1.101 2181,如果连接被拒绝且端口确实在监听,那基本可以断定是防火墙拦截。第三步在服务端临时观察规则命中情况,执行iptables -L INPUT -n -v看对应规则的pkts计数是否增长,这是最直接的证据。
还有一个隐蔽的问题是DNS和主机名解析。HBase强烈依赖正向和反向DNS解析,如果防火墙规则没问题但节点仍然无法互相识别,要检查/etc/hosts配置是否在所有节点上保持一致,主机名是否都指向正确的内网IP。实践中建议同时放行DNS用的53端口(如果内网有DNS服务器),并保证hosts文件优先级正确。另外,临时调试时可以执行service iptables stop快速验证问题是否出在防火墙,确认后一定要记得恢复规则,不要让集群裸奔在公网环境。
总结一下,HBase集群的iptables配置核心在于:理清Master、RegionServer、ZooKeeper、HDFS四类端口,优先采用内网网段信任策略简化管理,注意规则顺序优先于默认拒绝规则,最后做好持久化和所有节点的统一下发。做到这几点,防火墙开启状态下HBase集群也能稳定运行。
HBase iptablesHBase端口HBase防火墙配置修改时间:2026-09-07 15:12:45