![无法通过点到站点 VPN 连接到 Azure SQL 服务器](https://linux22.com/image/753490/%E6%97%A0%E6%B3%95%E9%80%9A%E8%BF%87%E7%82%B9%E5%88%B0%E7%AB%99%E7%82%B9%20VPN%20%E8%BF%9E%E6%8E%A5%E5%88%B0%20Azure%20SQL%20%E6%9C%8D%E5%8A%A1%E5%99%A8.png)
是否有可能通过 Azure 的 P2S VPN 客户端连接到 Azure SQL 服务器?
更具体地说,我想强制通过 Azure 的 S2P VPN 客户端连接的客户端使用 VPN 连接到数据库服务器。原因之一是客户端的 IP 地址经常更改,需要创建大量(临时)防火墙规则来授予这些客户端访问权限。假设全球有几位 IP 地址不断变化的员工需要直接访问数据库。
问题在于,当访问数据库服务器时,Azure 需要使用 SQL 服务器的 FQDN 进行连接,否则(即仅通过 IP 地址)将会失败。(参见 [1])
这是当前配置:
- 具有 10.5.0.0/16 地址空间的虚拟网络
- 连接到同一子网中 SQL 服务器的专用终结点的网络接口
- 虚拟网络网关,也是 VPN 端点(基于路由的 VPN)
- 通过 Azure 的 P2S VPN 客户端连接的客户端获取 172.16.0.0/24 空间的地址
我在这里看到三个选项:
- 当 Azure VPN 客户端连接时,使 FQDN 解析为 SQL 服务器的 VN 接口 IP 地址。
- 通过 VPN 路由连接并使用 VPN 网关的公共 IP 地址连接到 SQL 服务器。
- 为 SQL 服务器的私有/VN IP 地址创建 DNS 别名
当我手动在客户端的 hosts 文件中放入一条规则以将 SQL 服务器的 FQDN 解析为其 VN 私有 IP 地址时,第一个解决方案有效。考虑到相当多的客户端正在连接,出于显而易见的原因,这不是一个解决方案。有没有办法通过 Azure 的 VPN 传播这样的 DNS 规则?我需要在哪里配置名称解析(某个 Azure DNS 服务器?)和传播(通过 VPN 传播此 DNS 服务器)?可以通过在客户端的配置 XML 文件中添加 DNS 服务器来配置通过 VPN 客户端的 DNS 传播(参见 [6])。问题是我没有用于 Azure 中虚拟网络的 DNS 服务器,私有 DNS 区域应该用于此,但它们没有 DNS IP 地址。
关于第二个想法,我设法设置了手动路由,如下所述:[2] 通过 VPN 将流量路由到 SQL 服务器。连接显然是通过 VPN 建立的(正如我在 Wireshark 上看到的),但它最终到达 SQL 服务器时使用的是客户端的公共 IP 地址 - 这最终没有任何区别。当通过 VPN 建立连接时,公共 IP 地址似乎被封装了。据我所知,似乎不可能通过 Azure VPN 路由所有或部分互联网流量。但是,有没有办法配置路由,使连接到 VPN 客户端的客户端最终使用任何静态 IP 或范围,这些 IP 或范围可以在 SQL 服务器的防火墙上进行过滤?我是否必须设置某种虚拟网络 NAT(如下所述 [3])但这将是一个非常奇怪的设置。
我也尝试设置私有 DNS 区域来覆盖 mydatabase.database.windows.net 的公共 DNS 条目(不是 privatelink.database.windows.net!)请参阅 [4]、[5]。但是,这些私有 DNS 记录不会以任何方式通过 VPN 客户端传播。
[2]https://docs.microsoft.com/en-us/azure/vpn-gateway/vpn-gateway-p2s-advertise-custom-routes
[3]https://docs.microsoft.com/en-us/azure/virtual-network/nat-overview
[4]https://docs.microsoft.com/en-us/azure/azure-sql/database/dns-alias-overview
答案1
对于可能遇到此问题的其他任何人,我想强调 OP 的“第一个解决方案”(“当 Azure VPN 客户端连接时,使 FQDN 解析为 SQL 服务器的 VN 接口 IP 地址。“)并观察到“当我在客户端手动添加规则时,第一个解决方案有效主办方文件将 SQL 服务器的 FQDN 解析为其 VN 私有 IP 地址。“
最后,为了成功建立与 Azure SQL Server 的点到站点连接,您需要将 Azure SQL Server 的完全限定域名 (FQDN) 解析为正确的私有 IP 地址用于 Azure 私有端点。当然,您与 Azure 的 VPN 连接必须处于活动状态。
由于我发现下面的步骤不太明显,因此这里对要执行的操作进行了细分。
首先,获取 Azure SQL Server 实例的 FQDN。您可以从 Azure 门户中服务器的“属性”页面获取此信息:
我们假设 Azure SQL DB 服务器的 FQDN 是myowndbserver.database.windows.net
。
接下来,您需要已经创建的 Azure 专用端点的专用 IP 地址。要获取此地址,请在 Azure 门户中导航到专用端点的“DNS 配置”页面:
在此示例中,私有 IP 地址为
10.22.0.4
。
从命令提示符 ( cmd.exe
),您可以 ping SQL Server 的 FQDN 以查看它解析为哪个 IP 地址。它很可能(最初)解析为服务器的公共 IP 地址:ping myowndbserver.database.windows.net
。(您也可以使用nslookup -q=A -recurse myowndbserver.database.windows.net 8.8.8.8
获取 DNS 名称解析的详细信息。)
如果myowndbserver.database.windows.net
解析为10.22.0.4
(并且您的 VPN 处于活动状态),则您的 SQL 数据库连接应该可以正常工作。如果它解析为公共 IP 地址,则强制其解析为所需私有 IP 地址的最简单方法是向计算机的文件hosts
(位于C:\Windows\System32\drivers\etc\hosts
(或%windir%\System32\drivers\etc\hosts
)中添加一个条目,例如:
10.22.0.4 myowndbserver.database.windows.net
当然,必须为每台使用 VPN 连接的计算机配置此项。如果您使用hosts
,则无论 VPN 连接是否处于活动状态,名称都会解析为私有 IP 地址。
OP 想要一种仅在 VPN 连接处于活动状态时将名称解析为私有 IP 地址的方法。以下是来自 serverfault.com 的方法。基本上,这种方法会动态修改用户的hosts
文件,因此它只是自动执行了上述手动步骤。而且它也需要对每台将使用 VPN 连接的计算机进行配置,因此对于许多用户来说,部署起来很麻烦。
答案2
最简单的解决方案是使用服务端点。让您的用户连接到 VPN,通过虚拟网络路由流量,然后在 SQL 服务器上打开服务端点,以仅允许来自该虚拟网络的流量。