不能。SSH ProxyJump 仅建立加密 TCP 隧道,不解析 ClickHouse 协议;需配合 LocalForward 将本地端口映射至内网 ClickHouse 端口,再由客户端连本地端口完成协议通信。
SSH ProxyJump 能不能直接连 ClickHouse?
不能。ssh 本身不理解 clickhouse 协议,ssh -j 建立的是加密 tcp 隧道,不是数据库连接——它只负责把你的本地端口“转到”目标机器的某个端口上,后续还得靠客户端(如 clickhouse-client 或驱动)真正发起 clickhouse 协议通信。
怎么用 SSH 跳板机安全访问内网 ClickHouse?
核心是「端口转发」:先用 ProxyJump 连通跳板链路,再把本地一个端口映射到内网 ClickHouse 的 9000(或自定义端口),最后让 ClickHouse 客户端连这个本地端口。整个过程数据全程加密,ClickHouse 服务本身无需暴露在公网或跳板机上。
- 确保跳板机(
jump-host)能直连目标 ClickHouse 服务器(ch-server)的9000端口(用telnet ch-server 9000验证) - 本地 SSH 配置中为
ch-server添加ProxyJump和端口转发:Host ch-tunnel<br> HostName ch-server.internal<br> User clickhouse<br> IdentityFile ~/.ssh/id_rsa_ch<br> ProxyJump jump-host<br> LocalForward 9001 127.0.0.1:9000
- 运行
ssh -fN ch-tunnel后台建立隧道,再执行clickhouse-client --port 9001 --host 127.0.0.1
为什么不用 ProxyCommand 或直接 ssh -L?
ProxyJump 是更干净的链式抽象,尤其在多跳场景下(比如 jump1 → jump2 → ch-server),它自动复用已建通道;而 ssh -L 手动写容易漏掉 -N(无远程命令)导致连接卡住,ProxyCommand 则需自己拼 ssh -W,出错时调试路径长、报错信息模糊(常见 Connection refused 实际是中间跳板机没通)。
-
ProxyJump要求 OpenSSH ≥ 7.3,Ubuntu 22.04 / CentOS 8+ 默认满足,老系统需升级openssh-client - 若跳板机禁用了
AllowTcpForwarding yes(安全加固常见操作),端口转发会静默失败——必须确认跳板机/etc/ssh/sshd_config中此项为yes并重启sshd - ClickHouse 默认绑定
127.0.0.1,如果只改了listen_host但没配user.default.networks白名单,即使隧道打通也会被拒绝连接
密钥和权限最容易被忽略的三处
免密不是“生成一次就完事”,每层都要验证实际可用性。最常卡在:本地连不上跳板机、跳板机能连 ClickHouse 但用的是另一个用户、ClickHouse 用户没开网络访问权限。
- 本地私钥权限必须是
600:chmod 600 ~/.ssh/id_rsa_ch,否则 SSH 直接拒绝加载 - 跳板机上的
~/.ssh/authorized_keys必须包含你本地公钥,且该行末尾不能有多余空格或换行符 - ClickHouse 的
users.xml中对应用户的<networks></networks>需允许跳板机 IP 或::1(IPv6 localhost),例如:<networks><br> <ip>127.0.0.1</ip><br> <ip>192.168.10.5</ip> <!-- jump-host IP --><br></networks>
ClickHouse 不像 MySQL 有 GRANT 语句,它的网络控制全靠 XML 配置,改完必须 sudo systemctl reload clickhouse-server,reload 失败时日志在 /var/log/clickhouse-server/clickhouse-server.err.log 里。

















