如何不暴露数据库端口连接远程服务器上的PostgreSQL到Grafana?
跨服务器Grafana对接PostgreSQL(不暴露公网端口)实现方案
你最初考虑的SSH隧道思路完全可行,Grafana UI本身确实没有内置SSH隧道配置项,隧道逻辑不需要在UI层配置,直接在操作系统层实现即可,以下是经过生产验证的几种落地方案,按部署成本从低到高排序:
方案1:Grafana宿主机本地持久化SSH隧道(最快落地)
不需要调整数据库服务器的PostgreSQL配置,也不需要给数据库开公网入站规则,只要Grafana服务器能通过SSH登录到数据库服务器即可。- 在Grafana所在服务器安装
autossh(相比原生ssh命令支持断网自动重连,避免隧道意外失效) - 执行端口转发命令,将Grafana本地端口映射到数据库服务器的PostgreSQL端口:
参数说明:autossh -M 5678 -N \ -o "ServerAliveInterval=30" \ -o "ServerAliveCountMax=3" \ -L 127.0.0.1:5433:127.0.0.1:5432 \ 数据库SSH登录账号@数据库服务器公网IP \ -i /path/to/your/ssh/private/key-L后的配置是把Grafana本机127.0.0.1的5433端口,通过SSH隧道转发到数据库服务器本地127.0.0.1的5432(PostgreSQL默认端口),转发端口仅对Grafana本机开放,不会对外暴露。 - 在Grafana添加PostgreSQL数据源时,主机地址直接填
127.0.0.1:5433,其余数据库名、账号、密码参数按实际值填写即可正常连通。 - 建议把上述autossh命令配置为systemd系统服务,配置开机自启,避免服务器重启后隧道失效。参考配置如下:
配置完成后执行# /etc/systemd/system/pg-grafana-tunnel.service [Unit] Description=PG to Grafana SSH Tunnel After=network.target [Service] User=nobody ExecStart=/usr/bin/autossh -M 5678 -N -o "ServerAliveInterval=30" -o "ServerAliveCountMax=3" -L 127.0.0.1:5433:127.0.0.1:5432 数据库SSH登录账号@数据库服务器公网IP -i /path/to/your/ssh/private/key Restart=always RestartSec=10 [Install] WantedBy=multi-user.targetsystemctl daemon-reload && systemctl enable --now pg-grafana-tunnel即可生效。
- 在Grafana所在服务器安装
方案2:私有内网直连(性能最优)
如果两台服务器在同一云厂商VPC内,直接给两台服务器分配内网IP,在数据库服务器的安全组/防火墙中,仅允许Grafana服务器的内网IP访问5432端口,PostgreSQL的pg_hba.conf中添加对应IP的访问权限即可,全程数据库端口不对公网开放,没有隧道转发的性能损耗。
如果两台服务器跨云/跨机房,可以部署WireGuard搭建点对点虚拟内网,PostgreSQL仅监听WireGuard虚拟网卡地址,同样只放通Grafana服务器的虚拟IP访问权限,安全性和性能都优于SSH隧道。避坑提示
- 配置SSH隧道时转发地址务必绑定
127.0.0.1,不要绑定0.0.0.0,避免Grafana服务器上的转发端口对外暴露带来安全风险 - 用于建隧道的SSH账号建议配置最小权限,仅开放端口转发权限,禁止登录服务器shell操作
- 不要尝试在个人本地电脑建隧道给Grafana用,本地电脑关机/断网后Grafana会直接失去数据库连接
- 配置SSH隧道时转发地址务必绑定
内容的提问来源于stack exchange,提问作者Etienne Faviere
相关产品推荐
相关产品推荐

