ClickHouse 默认监听 localhost,需修改 config.xml 中 listen_host 为 0.0.0.0 并重启服务;同时在 users.xml 中为 default 用户配置 networks 和密码,并放行防火墙 9000 端口,Navicat 连接时须选 Native(TCP) 协议。
ClickHouse 默认只监听 localhost
装完 clickhouse 后,navicat 从局域网另一台机器连不上,十有八九是服务端根本没对外暴露 tcp 端口。clickhouse-server 默认配置里 listen_host 是 127.0.0.1,意味着只接受本机连接。
- 检查配置文件:
/etc/clickhouse-server/config.xml或/etc/clickhouse-server/users.xml - 找到
<listen_host>127.0.0.1</listen_host>这一行,改成<listen_host>0.0.0.0</listen_host>(或指定局域网 IP,如192.168.1.100) - 改完必须重启服务:
sudo systemctl restart clickhouse-server - 验证是否生效:
sudo ss -tlnp | grep :9000—— 如果看到0.0.0.0:9000或对应 IP,说明监听已放开
用户没有远程登录权限(default 用户被锁死)
即使监听开了,Navicat 用 default 用户连,大概率报错 Code: 192. DB::Exception: Authentication failed 或直接拒绝连接。这是因为 ClickHouse 的 default 用户默认禁用密码、且 networks 限制为仅本地。
- 编辑
/etc/clickhouse-server/users.xml - 定位到
<user><name>default</name>...</user>块,在<networks></networks>下加一行:<ip>::/0</ip>(允许所有 IPv6/IPv4),或更安全地写成<ip>192.168.1.0/24</ip> - 确保
<password></password>存在且非空(支持明文或 SHA256 哈希);如果用明文,字段名是<password>your_pass</password> - 别忘了同步修改
<profile>default</profile>对应的权限配置,确保没被<readonly>1</readonly>锁死
防火墙或 SELinux 拦住了 9000 端口
配置全对,ss 也显示监听了,但 Navicat 还是连不上 —— 很可能是系统层拦截。ClickHouse 默认用 9000 端口通信(TCP),不是 HTTP 的 8123。
- 查防火墙状态:
sudo ufw status(Ubuntu)或sudo firewall-cmd --state(CentOS/RHEL) - 放行端口:
sudo ufw allow 9000或sudo firewall-cmd --add-port=9000/tcp --permanent && sudo firewall-cmd --reload - SELinux 若启用,临时关掉测试:
sudo setenforce 0;确认是它拦的,再用sudo semanage port -a -t clickhouse_port_t -p tcp 9000加规则 - 注意:Navicat 连接时「端口」填
9000,不是8123;协议选「Native (TCP)」,不是 HTTP
Navicat 驱动版本不兼容 ClickHouse 新版协议
用的是较老版本 Navicat(比如 15.x 或更早),连 ClickHouse 22.8+ 会卡在握手阶段,日志可能显示 Unknown packet from client 或直接断连。
- Navicat 16.0.15 及以上才完整支持 ClickHouse 22.x+ 的 Native 协议升级
- 如果无法升级 Navicat,可临时降级服务端协议:在
config.xml的<tcp_port></tcp_port>段加<enable_http_compression>0</enable_http_compression>并重启(治标不治本) - 更稳的替代方案:用 DBeaver + 官方
clickhouse-jdbc驱动(推荐 0.4.6+),兼容性好得多
真正卡住人的地方,往往不是某一个配置错了,而是监听、用户网络白名单、防火墙、客户端驱动这四层里至少漏掉一层。尤其容易忽略的是:改了 config.xml 忘了重启服务,或者改了 users.xml 却没确认 default 用户实际加载的是哪个 profile 文件。










