macOS(M1芯片)下通过Azure AD认证的点到站点VPN连接Azure私有访问PostgreSQL弹性服务器时DNS解析失败
macOS(M1芯片)下通过Azure AD认证的点到站点VPN连接Azure私有访问PostgreSQL弹性服务器时DNS解析失败
问题描述
我正尝试通过配置在Azure虚拟网络网关、采用Azure AD而非证书认证的点到站点(P2S)VPN,连接Azure私有访问的PostgreSQL弹性服务器,但从我的M1芯片macOS Sonoma 14.6.1本地机器无法访问数据库。VPN能成功连接,但数据库的私有DNS无法解析。
我已经做了以下操作:
- 确认VPN已成功连接,并且从地址池(172.16.0.0/24)获取到了IP地址
- 尝试ping和nslookup数据库主机名,但DNS解析失败,提示NXDOMAIN
- 在macOS网络设置中手动配置DNS服务器为Azure VNet内部DNS(比如10.0.0.4),并刷新了DNS缓存
执行nslookup命令的结果如下:
nslookup timepiepstg.postgres.database.azure.com Server: 194.168.4.100 Address: 194.168.4.100#53 ** server can't find timepiepstg.postgres.database.azure.com: NXDOMAIN
排查与解决方案
针对M1 macOS下P2S VPN的DNS解析问题,我给你几个实用的排查方向和解决办法:
1. 确认VPN客户端的DNS配置优先级
Azure P2S VPN(尤其是AD认证类型)有时候不会自动把Azure VNet的DNS服务器推送给macOS客户端,就算你手动加了,也得确保它是优先被使用的:
- 打开「系统设置」→「网络」,选中已连接的VPN
- 点击「详细信息」→「DNS」标签,看看Azure VNet的内部DNS(比如10.0.0.4)是不是在列表最顶部
- 如果不是,拖拽它到第一位,让系统优先用这个DNS解析
2. 给数据库域名单独指定DNS服务器
有时候macOS会“固执”地用本地DNS解析所有域名,哪怕VPN连好了。你可以给PostgreSQL的私有域名单独设置DNS规则,让它走VPN的DNS:
- 打开终端,创建并编辑一个专属的DNS解析配置文件:
sudo nano /etc/resolver/postgres.database.azure.com - 在文件里输入以下内容(替换成你的Azure VNet内部DNS地址):
nameserver 10.0.0.4 domain postgres.database.azure.com search_order 1 - 保存退出(按Ctrl+O回车,再Ctrl+X),然后刷新DNS缓存:
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder
3. 检查Azure VPN网关的DNS设置
别忽略了云端的配置,确保你的虚拟网络网关已经指定了正确的DNS服务器:
- 登录Azure门户,找到你的虚拟网络网关
- 进入「配置」页面,确认「DNS服务器」已经设为Azure VNet的内部DNS(比如10.0.0.4),不是默认的Azure DNS
- 如果没设置,修改后重启网关,再重新连VPN试试
4. 用私有IP直接测试连通性
如果DNS还是不行,先跳过DNS,用PostgreSQL服务器的私有IP直接连接,看看是不是网络本身的问题:
- 去Azure门户找到你的PostgreSQL弹性服务器,查看它的私有IP
- 用psql命令直接连这个IP:
psql -h <你的私有IP> -U <用户名>@<服务器名> -d <数据库名>
要是能连上,那肯定是DNS的问题,继续盯着DNS解决就行;要是连不上,就得检查NSG规则或者路由表了。
5. 针对M1芯片的VPN客户端优化
M1 macOS对Azure P2S VPN的AD认证客户端偶尔会有兼容性问题,试试这两个办法:
- 把Azure VPN客户端更到最新版本(从App Store或者Azure门户下载都行)
- 换用系统内置的IKEv2 VPN连接:
- 在Azure门户导出P2S VPN的IKEv2配置文件
- 打开macOS「系统设置」→「网络」,添加新VPN,选「IKEv2」类型,导入配置文件
- 连接后再测试DNS解析
备注:内容来源于stack exchange,提问作者MertTheGreat
相关产品推荐
相关产品推荐

