前段时间遇到一个小问题,后来发现这是个挺常见的坑,顺手整理一篇笔记。
前言
数据库装在家里的服务器、测试机或者公司内网里,真正麻烦的往往不是 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 安装方法执行。
当前安装命令如下:
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 模式修改密码:
su postgres
// 切换SQL模式
psql
// 修改密码
alter user postgres with password 'postgres123';
当前示例中的密码是:
postgres123
后面远程连接时继续用 postgres 用户。
3. 配置 PostgreSQL 允许远程访问
先修改 pg_hba.conf:
sudo vim /var/lib/pgsql/14/data/pg_hba.conf
新增:
host all all 0.0.0.0/0 scram-sha-256
当前规则允许所有地址通过 scram-sha-256 方法进行连接验证。
接着修改 PostgreSQL 的监听地址。
当前用的配置文件路径是:
vi /var/lib/pgsql/15/data/postgresql.conf
把监听地址改为:
listen_addresses = '*'
这样 PostgreSQL 就不再只监听本机地址。
4. 重启 PostgreSQL
配置修改完成后执行:
systemctl restart postgresql-14
让当前配置重新生效。
5. 新建 mydb 数据库
切换到 postgres 用户并创建数据库:
su postgres
create database mydb;
这次用的数据库名称是:
mydb
6. 先在局域网里做一次远程连接
公网访问之前,我更愿意先证明 PostgreSQL 自己已经可以被其他机器连接。
从另一台服务器执行:
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:
sudo curl https://get.cpolar.sh | sh
安装完成后检查服务状态:
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. 用随机公网地址真正连一次数据库
从其他主机执行:
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. 最终再验证固定地址
执行:
psql -h 8.tcp.vip.cpolar.cn -p 13299 -U postgres -d mydb
连接成功以后,说明固定 TCP 入口已经生效。
这时 PostgreSQL 的远程连接链路就从“临时可用”变成了“地址固定”。
总结
这次最重要的不是一句“没有公网 IP 也能连数据库”,而是把数据库本身和网络入口分开验证。
整条实际跑通的链路是:
CentOS 7 → PostgreSQL 14 → postgres 密码 → pg_hba.conf → listen_addresses = '*' → mydb → 192.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
暂时整理到这里。以上都是个人理解,可能有疏漏,欢迎指正。
评论 (0)
暂无评论