没有公网 IP 怎么远程连 PostgreSQL?DBeaver + cpolar 安全连接完整教程
没有公网 IP 怎么远程连 PostgreSQLDBeaver cpolar 安全连接完整教程人在公司数据库在家里 NAS出差在外想用 DBeaver 看一眼本地 PostgreSQL路由器没有公网 IP端口转发也没法配。这类场景我见得太多了卡点不在 PostgreSQL 本身而在“远程这一步怎么安全打通”。这篇就做一条完整链路PostgreSQL 用 Docker 跑在本机或 NAS 上DBeaver 作为图形化客户端cpolar 负责把本地5432TCP 端口临时映射到公网。重点不是把数据库长期裸露出去而是在需要远程维护、临时排查、异地连接时有一套能复制、能验证、边界清楚的做法。1 什么是这套连接方案这套方案里每个工具只负责一件事PostgreSQL真正存放数据的数据库服务本文使用官方 Docker 镜像postgres:16。DBeaver本地电脑上的数据库客户端用来连接、浏览表、执行 SQL。cpolar TCP 隧道把内网里的 PostgreSQL5432端口映射成一个公网 TCP 地址。划重点这不是让你把 PostgreSQL 永久挂在公网。数据库端口天然敏感本文默认按“临时远程连接”来设计用完就关隧道需要长期使用时再上固定 TCP 地址、账号权限和访问控制。2 环境准备确认 Docker、DBeaver 和 cpolar这篇教程默认 PostgreSQL 跑在一台内网机器上比如家里的 Mac mini、Linux 小主机、NAS 或办公室服务器。远程连接端用 DBeaver安装在你手上的电脑上。需要准备一台能运行 Docker 的内网机器DBeaver Community 或其他 DBeaver 版本一个 cpolar 账号内网机器能访问http://127.0.0.1:9200先检查 Dockerdocker version能看到 Client 和 Server 信息就说明 Docker 引擎已经可用。这里别跳过检查后面 PostgreSQL 起不来时很多人会误以为是数据库配置问题其实是 Docker 服务没启动。DBeaver 直接从官网下载并安装即可。连接 PostgreSQL 时DBeaver 会按提示下载 PostgreSQL JDBC 驱动如果驱动下载失败先检查本机网络再回到连接窗口重新点一次“下载驱动文件”。3 使用 Docker 启动 PostgreSQL 16我们先把数据库跑起来。下面这条命令会启动一个 PostgreSQL 16 容器把容器内的5432映射到宿主机5432并创建一个示例数据库appdb。docker run -d \ --name pg16-demo \ -e POSTGRES_USERpostgres \ -e POSTGRES_PASSWORDPgRemote_2026!ChangeMe_9xK \ -e POSTGRES_DBappdb \ -p 5432:5432 \ -v pg16_demo_data:/var/lib/postgresql/data \ postgres:16这几个参数要看清楚POSTGRES_USERpostgres创建默认管理用户postgresPOSTGRES_PASSWORD给postgres设置密码生产环境不要沿用本文示例密码POSTGRES_DBappdb初始化一个名为appdb的数据库-p 5432:5432让宿主机的5432端口能访问容器里的 PostgreSQL-v pg16_demo_data:/var/lib/postgresql/data把数据放进 Docker volume容器删除后数据卷仍保留查看容器状态docker ps --filter namepg16-demo看到STATUS为Up并且PORTS里有0.0.0.0:5432-5432/tcp或同类映射就说明 PostgreSQL 已经在宿主机端口上监听。如果这里没起来先看日志docker logs pg16-demo常见问题是本机已经有 PostgreSQL 占用了5432。这时要么停掉原来的数据库要么把宿主机端口改成别的端口比如-p 15432:5432。本文后面按5432写方便你把链路一次跑通。4 创建只读用户并用 psql 验证本地连接远程连接数据库时不建议直接拿postgres管理员账号去连。更稳妥的做法是创建一个只读账号DBeaver 远程查看数据时就用它。进入容器执行 SQLdocker exec -it pg16-demo psql -U postgres -d appdb在psql里执行下面几条语句CREATE ROLE dbeaver_ro WITH LOGIN PASSWORD Dbeaver_ReadOnly_2026!9xK; GRANT CONNECT ON DATABASE appdb TO dbeaver_ro; GRANT USAGE ON SCHEMA public TO dbeaver_ro; GRANT SELECT ON ALL TABLES IN SCHEMA public TO dbeaver_ro; ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO dbeaver_ro;这一步不是为了显得“安全”而是把远程账号的权限先收住。以后 DBeaver 里误点了更新语句只读账号也不会改动业务数据。退出psql\q再用只读账号验证一次连接docker exec -it pg16-demo psql \ -U dbeaver_ro \ -d appdb \ -c SELECT current_database(), current_user;执行时会提示输入密码输入Dbeaver_ReadOnly_2026!9xK看到返回结果里有appdb和dbeaver_ro说明本地数据库、账号、权限都没问题。远程连接前先做这个验证很关键别把本地账号问题带到 cpolar 和 DBeaver 里一起排。5 安装并登录 cpolar启动 PostgreSQL TCP 隧道PostgreSQL 不是网页服务所以这里要用TCP 隧道不是 HTTP 隧道。Linux 或树莓派可用官方一键安装脚本curl -L https://www.cpolar.com/static/downloads/install-release-cpolar.sh | sudo bashmacOS 使用 Homebrew 安装brew tap probezy/core brew install cpolar安装后启动 cpolar 服务。macOS 可以执行sudo cpolar service install sudo cpolar service startLinux 安装脚本会配置 systemd 服务安装完成后可以检查版本和本地 Web UIcpolar version curl -s http://127.0.0.1:9200 || echo cpolar Web UI 未启动浏览器打开http://127.0.0.1:9200用 cpolar 账号登录。这里建议走 Web UI 登录流程因为很多桌面环境下登录后会自动完成账号绑定纯命令行环境再去 cpolar 后台“验证”页面复制 Authtoken用cpolar authtoken命令绑定。确认 cpolar 可用后启动 TCP 隧道cpolar tcp 5432命令行会输出一个公网 TCP 地址格式类似tcp://2.tcp.cpolar.top:14170这里的域名和端口以你终端实际输出为准。DBeaver 连接时不要填tcp://前缀只填域名和端口Host2.tcp.cpolar.topPort14170如果你更习惯 Web UI也可以在http://127.0.0.1:9200里创建隧道协议选tcp本地地址填5432创建后到“状态 → 在线隧道列表”查看公网地址。免费随机 TCP 地址会变化不适合写进长期脚本。需要长期稳定连接时使用保留 TCP 地址按照 cpolar 官方规则固定 TCP 地址需要专业套餐或以上。6 在 DBeaver 里连接 PostgreSQL打开 DBeaver新建数据库连接数据库类型选择PostgreSQL。如果是第一次连 PostgreSQLDBeaver 会提示下载驱动点确认下载。连接参数按下面填参数填写内容Hostcpolar 输出的 TCP 域名例如2.tcp.cpolar.topPortcpolar 输出的 TCP 端口例如14170DatabaseappdbUsernamedbeaver_roPasswordDbeaver_ReadOnly_2026!9xKSSL本文临时隧道测试选择关闭已给 PostgreSQL 配置服务端证书时选择require或团队指定模式DriverPostgreSQL JDBC Driver这里单独说一下 SSL。DBeaver 的 SSL 配置对应的是 PostgreSQL 自身的加密连接能力不是 cpolar 隧道按钮。本文的目标是把远程连接链路跑通所以先关闭 SSL 做验证如果你的数据库已经按公司规范启用了 PostgreSQL SSL就不要关掉它直接在 DBeaver 的 SSL 页签里选择对应模式并导入团队提供的证书文件。填完后先点“Test Connection”。如果提示连接成功说明链路已经打通DBeaver 连接的是 cpolar 公网 TCP 地址cpolar 再把流量转发到内网机器的 PostgreSQL5432。如果测试失败按这个顺序查内网机器上执行docker ps --filter namepg16-demo确认 PostgreSQL 容器还在运行。内网机器上执行docker exec -it pg16-demo psql -U dbeaver_ro -d appdb确认账号密码可用。确认cpolar tcp 5432的终端窗口没有关闭。确认 DBeaver 的 Host 没有带tcp://Port 填的是 cpolar 公网端口不是5432。如果用的是公司网络确认出口网络没有拦截非常规 TCP 端口。这一步做完后DBeaver 左侧会出现appdb连接。展开 Schemas、public就能看到表结构。新库里没有业务表是正常的你可以先建一张测试表验证读取权限。docker exec -it pg16-demo psql -U postgres -d appdb -c \ CREATE TABLE IF NOT EXISTS demo_notes (id serial PRIMARY KEY, title text NOT NULL); INSERT INTO demo_notes(title) VALUES (hello dbeaver);回到 DBeaver 刷新表列表能看到demo_notes再执行查询SELECT * FROM demo_notes;如果只读账号执行INSERT被拒绝说明权限边界也生效了。这是好事不是故障。7 安全边界数据库远程连接别裸奔数据库端口和普通网页不一样暴露之后要更克制。这里给一份我会按习惯检查的清单。7.1 强密码和只读账号要放在前面本文已经创建了dbeaver_ro只读账号。实际使用时把管理账号和远程查看账号分开不要把postgres密码发给每个需要看数据的人。密码长度、大小写、数字、符号都要有。示例密码只用于教程复现生产环境必须换成自己的强密码并放进团队认可的密码管理工具里。只读账号也建议按用途拆开。比如给 DBeaver 查看数据的账号只授予SELECT给报表脚本的账号只允许访问报表所需 schema不要一个账号到处复用。后面查审计日志时账号边界越清楚定位问题越快。7.2 隧道按需开启用完关闭临时排查时直接运行cpolar tcp 5432用完按Ctrl C结束隧道。不要把数据库 TCP 隧道当成长期默认入口。如果你已经把 cpolar 配成后台隧道排查结束后要在 Web UI 里停掉对应隧道或停止 cpolar 服务。长期连接场景再考虑保留 TCP 地址、专门账号、审计和网络侧限制。7.3 pg_hba.conf 和 listen_addresses 不要乱放大PostgreSQL 远程连接常见两个配置listen_addresses决定 PostgreSQL 监听哪些网卡地址pg_hba.conf决定哪些来源、哪些用户、哪些数据库允许连接以及认证方式Docker 官方 PostgreSQL 镜像在容器里对外监听配合-p 5432:5432已经能让宿主机访问。本文不需要你手动把listen_addresses改成*也不需要在pg_hba.conf里加0.0.0.0/0。如果你维护的是宿主机原生 PostgreSQL而不是 Docker 容器确实会碰到这两个配置。改之前先确认业务需要改完要 reload 或重启 PostgreSQL。不要为了省事直接放开全网段再长期运行。更推荐的做法是先让数据库只对可信内网地址开放再由 cpolar 这类隧道工具承担临时远程入口。这样排查时只需要关掉隧道数据库本身的监听范围不用跟着频繁改出问题时也更好回滚。8 总结现在这条链路已经跑通了PostgreSQL 在内网机器上提供5432服务cpolar 创建 TCP 隧道生成公网地址DBeaver 使用 cpolar 的 Host 和 Port 连接数据库。整个过程最容易错的地方不是 SQL而是端口、账号和隧道地址填混。这篇里最关键的几步是用 Docker 启动postgres:16并在本机先验证appdb能连通。创建dbeaver_ro只读账号远程查看数据时不直接使用管理员账号。用cpolar tcp 5432生成公网 TCP 地址DBeaver 里填写 cpolar 的域名和端口。后续如果你只是偶尔远程维护临时隧道已经够用如果要长期给团队使用就把固定 TCP 地址、账号权限、审计和停用流程一起设计好。数据库远程连接这件事能连上只是第一步真正省心的是“连得上也收得住”。你更想看 MySQL、Redis 还是 MongoDB 的远程连接教程评论区告诉我我下一篇按呼声最高的写。