没有公网 IP 也想远程连 PostgreSQL?从本地数据库到固定 TCP 地址完整配置

前言

数据库装在家里的服务器、测试机或者公司内网里,真正麻烦的往往不是 PostgreSQL 本身,而是"离开这个局域网以后怎么连"。我更习惯先把问题拆开:数据库先在内网里跑通,账号、监听地址和访问规则先验证正常,再去解决公网入口。这样如果远程连接失败,至少能快速判断是 PostgreSQL 配置出了问题,还是外部网络入口没打通,而不是两层一起猜。尤其数据库和普通网页不一样,页面打不开还能慢慢查,数据库连不上时,配置、认证、监听地址、端口和网络入口任何一层都可能是原因,所以我不太喜欢一上来就把所有设置一起改。

这次我在 CentOS 7 上安装 PostgreSQL 14,修改管理员密码、pg_hba.conf 和监听地址,新建 mydb 数据库,再从另一台服务器通过 192.168.42.140:5432 做一次局域网连接验证。确认数据库本身可以远程访问后,再安装 cpolar,把 192.168.42.140:5432 映射成 TCP 公网地址,先用随机地址 2.tcp.vip.cpolar.cn:11084 测试,最后换成固定的 8.tcp.vip.cpolar.cn:13299。整条链的重点不是"把数据库直接暴露出去",而是按本地数据库、局域网连接、公网 TCP 三层逐步确认。这样后面无论是同事远程调试、临时演示,还是自己从外网连接,都能更清楚地知道问题究竟出在哪一层。

1. 先在 CentOS 7 上安装 PostgreSQL

先从 PostgreSQL 官网选择 Linux、对应版本和平台,按页面生成的 yum 安装方式执行。

当前安装命令如下:

shell 复制代码
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
sudo yum install -y postgresql14-server
sudo /usr/pgsql-14/bin/postgresql-14-setup initdb
sudo systemctl enable postgresql-14
sudo systemctl start postgresql-14

这里完成的是 PostgreSQL 14 的仓库配置、服务端安装、初始化、开机启动和服务启动。

2. 修改 postgres 管理员密码

继续切换到 postgres 用户,并进入 SQL 模式修改密码:

shell 复制代码
su postgres
// 切换SQL模式
psql
// 修改密码
alter user postgres with password 'postgres123';

当前示例中的密码是:

postgres123

后面远程连接时继续使用 postgres 用户。

3. 配置 PostgreSQL 允许远程访问

先修改 pg_hba.conf

shell 复制代码
sudo vim /var/lib/pgsql/14/data/pg_hba.conf

新增:

shell 复制代码
host    all     all    0.0.0.0/0    scram-sha-256

当前规则允许所有地址通过 scram-sha-256 方式进行连接验证。

接着修改 PostgreSQL 的监听地址。

当前使用的配置文件路径是:

shell 复制代码
vi /var/lib/pgsql/15/data/postgresql.conf

把监听地址改为:

shell 复制代码
listen_addresses = '*'

这样 PostgreSQL 就不再只监听本机地址。

4. 重启 PostgreSQL

配置修改完成后执行:

shell 复制代码
systemctl restart postgresql-14

让当前配置重新生效。

5. 新建 mydb 数据库

切换到 postgres 用户并创建数据库:

shell 复制代码
su postgres
create database mydb;

这次使用的数据库名称是:

mydb

6. 先在局域网里做一次远程连接

公网访问之前,我更愿意先证明 PostgreSQL 自己已经可以被其他机器连接。

从另一台服务器执行:

shell 复制代码
psql -h 192.168.42.140 -p 5432 -U postgres -d mydb

连接成功后,可以确认:

PostgreSQL → 192.168.42.140:5432 → postgres 用户 → mydb

这条局域网链路已经成立。

如果这一步还没通,就没必要急着配置公网 TCP,因为 cpolar 只是把一个已经可用的本地服务提供到外部网络。

7. 安装 cpolar

在 PostgreSQL 所在环境安装 cpolar:

shell 复制代码
sudo curl https://get.cpolar.sh | sh

安装完成后检查服务状态:

shell 复制代码
sudo systemctl status cpolar

服务正常以后,通过主机 IP + 9200 进入 cpolar Web 管理页面。

当前页面显示地址为:

http://192.168.42.101:9200

同时链接目标写成:

http://localhost:9200/

实际访问时,以当前设备真正能够打开的管理地址为准。

8. 给 PostgreSQL 创建随机 TCP 公网入口

这里真正需要映射的是 PostgreSQL 的 TCP 服务,不是 Web 页面。

创建隧道时使用:

  • 隧道名称:postgres
  • 协议:tcp
  • 本地地址:192.168.42.140:5432
  • 端口类型:随机临时 TCP 端口
  • 地区:China Vip

创建完成以后,在线隧道列表里会出现公网 TCP 地址。

当前记录为:

  • 公网域名:2.tcp.vip.cpolar.cn

  • 公网端口:11084

这时 PostgreSQL 的连接入口就从内网地址变成了一个外部网络能够到达的 TCP 域名和端口。

9. 用随机公网地址真正连一次数据库

从其他主机执行:

shell 复制代码
psql -h 2.tcp.vip.cpolar.cn -p 11084 -U postgres -d mydb

能够进入 mydb 后,说明这条链已经跑通:

外部主机 → 2.tcp.vip.cpolar.cn:11084 → cpolar TCP 隧道 → 192.168.42.140:5432 → PostgreSQL → mydb

这一步比单纯看到"隧道在线"更重要,因为最后验证的是 PostgreSQL 客户端确实能通过公网入口完成连接。

10. 为什么还要保留固定 TCP 地址?

随机端口适合先验证,但如果数据库客户端、测试脚本或者同事的连接配置里一直写着随机域名和端口,地址变化后就得重新修改。

所以长期使用时,再换固定 TCP 地址更省事。

进入 TCP 地址预留页面。

当前选择地区:

China VIP

已保留记录中显示:

  • 地区:China VIP

  • 地址:8.tcp.vip.cpolar.cn:13299

11. 把 postgres 隧道切换到固定 TCP

回到 cpolar Web UI,进入【隧道管理 → 隧道列表】,找到:

postgres

点击编辑。

修改:

  • 端口类型:固定 TCP 端口
  • 预留的 TCP 地址:填写前面保留成功的地址

点击更新。

更新以后,在线隧道列表中的公网地址会切换成固定 TCP 地址。

12. 最后再验证固定地址

执行:

shell 复制代码
psql -h 8.tcp.vip.cpolar.cn -p 13299 -U postgres -d mydb

连接成功以后,说明固定 TCP 入口已经生效。

这时 PostgreSQL 的远程连接链路就从"临时可用"变成了"地址固定"。

总结

这次最重要的不是一句"没有公网 IP 也能连数据库",而是把数据库本身和网络入口分开验证。

整条实际跑通的链路是:

CentOS 7 → PostgreSQL 14 → postgres 密码 → pg_hba.conflisten_addresses = '*'mydb192.168.42.140:5432 局域网验证 → cpolar → 随机 TCP 2.tcp.vip.cpolar.cn:11084 → 固定 TCP 8.tcp.vip.cpolar.cn:13299

几个关键参数包括:

  • PostgreSQL:postgresql14-server
  • 数据库:mydb
  • 用户:postgres
  • PostgreSQL 端口:5432
  • 局域网地址:192.168.42.140
  • cpolar Web UI 主机示例:192.168.42.101:9200
  • 隧道名称:postgres
  • 协议:tcp
  • 随机公网地址:2.tcp.vip.cpolar.cn:11084
  • 固定公网地址:8.tcp.vip.cpolar.cn:13299
  • 地区记录:China Vip / China VIP

我更建议一直按这个顺序排查:先确认 PostgreSQL 在局域网能连,再确认随机公网 TCP 能连,最后才换固定地址。 数据库配置和网络入口分开以后,远程连接出了问题也不会一上来就把所有配置一起改一遍。

相关推荐
あ-1 小时前
postgres创建只读用户
postgresql
Raas1001 小时前
MAI Gateway(魔芋企业级AI网关)技术揭秘:AI网关支持DeepSeek吗?从原理到落地
大数据·人工智能·gateway·ai网关·mai gateway·魔芋·企业级产品
合米AI SOP系统1 小时前
新能源零部件|密封锁付装配工位,合米科技AI SOP视觉防错规避工艺遗漏带来的售后故障
大数据·人工智能·科技
得物技术2 小时前
指标平台:从语义底座到智能消费的实践路径|得物技术
数据库·人工智能·ai编程
StarRocks_labs2 小时前
当大模型调用进入执行引擎:StarRocks AI Function 全新能力解析
数据库·starrocks·sql·ai·pipeline·数据处理·join
TDengine (老段)2 小时前
TDengine 常见问题 TOP4
数据库·物联网·时序数据库·tdengine·涛思数据·升级·tdengine 问题
小蒜学长2 小时前
基于RFID技术的仓储管理系统设计(代码+数据库+LW)
java·数据库·spring boot·后端·rfid技术·仓储管理
梦影_2 小时前
Langchain简单快速上手教程(五)——聊天模型之流式传输
java·数据库·人工智能·python·langchain
数据狐(Datafox)3 小时前
1688商品列表API接口解析(附 JSON 样例)
java·开发语言·数据库·爬虫·json