Mac远程连接虚拟机中PostgreSQL失败,求解决方案
我之前折腾过类似的跨平台VMware远程PostgreSQL连接问题,看你已经做了核心的PostgreSQL配置、重启服务、关闭主机防火墙,而且本地和同VM内的虚拟机能正常连接,Nmap扫端口也显示开放,那问题大概率出在跨平台的网络链路转发或者VMware的网络配置细节上,给你几个具体的排查方向:
检查VMware的网络模式与端口转发设置
如果你的Ubuntu虚拟机用的是NAT模式,Windows主机的IP并不会直接映射到虚拟机的5432端口,得手动配置端口转发:- 打开VMware Workstation,找到目标Ubuntu虚拟机的「设置」→「网络适配器」→「NAT设置」
- 添加端口转发规则:主机端口设为5432,虚拟机IP填Ubuntu的内网IP(比如
192.168.x.x),虚拟机端口5432,协议选TCP - 保存后重启虚拟机的PostgreSQL服务,再用Mac尝试连接
确认Windows主机的实际可用IP
你报错里的169.254.121.2是Windows的自动私有IP(APIPA),说明主机可能没获取到有效的局域网IP,或者你填错了IP。可以在Windows主机的命令行执行ipconfig,找到当前联网网卡(无线/有线)的IPv4地址,用这个真实的局域网IP替换报错里的地址再试。检查Mac端的防火墙拦截
你关闭了Windows主机的防火墙,但Mac本身的防火墙可能拦截了出站的5432端口请求:- 打开Mac的「系统设置」→「网络」→「防火墙」
- 确认防火墙是否开启,如果开启,检查是否允许终端(Terminal)的网络访问,或者临时关闭防火墙测试连接
验证PostgreSQL是否真的监听了所有地址
在Ubuntu虚拟机里执行以下命令,确认PostgreSQL确实在监听0.0.0.0:5432:ss -tulpn | grep 5432如果输出里显示的是
127.0.0.1:5432,说明postgresql.conf的修改没生效——可能是你编辑了错误的配置文件(比如PostgreSQL多版本共存时,配置文件路径不同),可以用ps aux | grep postgres找到进程对应的配置文件路径。检查Windows主机的IP转发功能
有时候Windows默认没开启IP转发,导致外部流量无法转发到虚拟机:- 以管理员身份打开Windows命令行,执行
netsh interface ipv4 show interfaces找到VMware的虚拟网卡(通常是VMnet8) - 执行
netsh interface ipv4 set interface "VMnet8" forwarding=enabled开启IP转发 - 重启Windows主机的网络服务后再测试
- 以管理员身份打开Windows命令行,执行
尝试直接连接Ubuntu虚拟机的局域网IP
如果Windows主机和Mac在同一个局域网,且Ubuntu虚拟机用的是桥接模式,你可以直接获取Ubuntu的内网IP(执行ifconfig或ip addr),然后在Mac终端用这个IP连接:psql -U postgres -h 192.168.x.x这样能绕开Windows主机的转发,直接测试虚拟机的网络可达性。
如果以上方案都不行,可以补充这些信息:VMware虚拟机的网络模式(NAT/桥接/仅主机)、Windows主机的局域网IP、Ubuntu虚拟机的内网IP,还有Mac和Windows主机是否在同一个局域网内。
内容的提问来源于stack exchange,提问作者Janton Zeng

