已启用TLS但未强制校验的Consul集群如何识别使用TLS的客户端节点?
可行方案
你可以通过以下4种方法识别客户端的TLS连接状态:
方法1:查看服务端日志
Consul服务端会记录每个客户端连接的TLS握手状态,不需要重启服务即可操作:
- 执行命令临时拉取服务端DEBUG级别日志(不会持久化存储,不会打满磁盘):
consul monitor -log-level debug
- 筛选日志关键词:出现
TLS handshake completed的条目对应使用TLS的客户端IP,出现non-TLS connection的条目对应未使用TLS的客户端IP。
如果服务端已经开启了持久化日志,可直接在历史日志文件中搜索上述关键词批量统计。
方法2:服务端抓包分析
在服务端节点抓包直接区分明文连接和TLS连接:
- 执行抓包命令筛选Consul相关端口的流量:
tcpdump -i any port 8300 or port 8500 or port 8501 -nn
- 流量规则判断:
- 出现TLS 1.x Client/Server Hello握手包、目标端口为8300/8501的流量对应使用TLS的客户端
- 目标端口为8500、无TLS握手的明文流量对应未使用TLS的客户端
- 也可以直接过滤TLS包拿到所有启用TLS的客户端源IP:
tcpdump -i any 'tcp[((tcp[12] & 0xf0) >> 2)] = 0x16' and port 8300 -nn
方法3:通过Telemetry指标统计
如果你的环境已经配置了Consul指标采集,可直接通过指标查询:
- 确认Consul配置中已开启
telemetry功能,查询consul_agent_rpc_connection_tls指标,该指标会带有客户端源IP标签,返回的所有IP均为已使用TLS连接的客户端 - 将上述IP列表和
consul members返回的所有存活客户端IP做比对,差集即为未配置TLS的节点
方法4:批量遍历客户端配置
写简单脚本批量拉取所有客户端的配置判断TLS开启状态:
- 先获取所有存活的客户端节点IP:
consul members -format json | jq -r '.[] | select(.Status == "alive" and .Tags.role != "consul-server") | .Address | split(":")[0]'
- 遍历每个IP,请求客户端的Agent配置接口判断TLS状态:
# 如返回200则说明客户端已配置TLS监听 curl -k -s -o /dev/null -w "%{http_code}" https://<客户端IP>:8501/v1/agent/self
- 将返回200的IP和全量客户端IP比对,即可得到未配置TLS的节点列表
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

