无法添加Azure DB防火墙规则以允许构建服务器运行测试。

6
我们使用Visual Studio Online托管的构建服务器来自动化我们的构建过程。作为其中的一部分,我正在研究将单元测试和集成测试添加到此过程中。
这些测试需要访问我们的SQL Azure数据库(其中有2个,都在同一个服务器上),这又需要通过DB服务器的防火墙进行访问。
我有一个PowerShell脚本,使用New-AzureRmSqlServerFirewallRule向DB服务器添加IP地址,这些防火墙规则在Azure门户中成功显示。
具体而言,该脚本会为以下内容添加防火墙规则:
  • 构建服务器上的所有IPv4地址*(由Get-NetIPAddress返回)
  • 构建服务器的外部IP地址(由https://api.ipify.org返回)
同时,预定义的AllowAllAzureIPsAllowAllWindowsAzureIps规则会自动添加。
然而,测试随后失败,并出现异常:
System.Data.SqlClient.SqlException: System.Data.SqlClient.SqlException: 在建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。找不到服务器或无法访问。请验证实例名称是否正确,并且 SQL Server 配置为允许远程连接。(提供程序: Named Pipes Provider, 错误: 40 - 无法打开到 SQL Server 的连接)
我不确定为什么构建服务器无法连接到数据库服务器- 是否是测试进程的主机使用了不同的 IP 地址? 更新
正如所指出的,异常消息提到了“Named Pipes Provider”,这表明DB连接使用的是命名管道而不是IP/TCP连接。为了测试这一点,我将本地app.config更改为包含一个未知/随机/不可访问的IP,并在本地运行测试(否则测试在本地成功运行):我收到了完全相同的异常消息,提到“Named Pipes Provider”。也许在某个级别上ReliableSqlConnection类会解析为命名管道,但我的观点是,通过在我的DB连接字符串中更改为未知或不可访问的IP地址,我可以引发完全相同的异常。

此外,DB连接字符串以tcp:开头,根据this blog post,明确告诉连接要使用TCP/IP,而不是命名管道。

我还修改了防火墙规则以允许所有IP地址(0.0.0.0到255.255.255.255),但仍然出现相同的异常。这表明SQL Azure防火墙规则不是“阻塞”的原因。
因此,我的怀疑转向被阻止的网络访问(尽管白名单可能存在以允许构建服务器访问代码库)。我在构建过程的开头添加了一个非常简单的PowerShell脚本:
Test-Connection "172.217.18.100" #resolves to www.google.com

这导致

连接到计算机“172.217.18.100”的测试失败:由于资源不足而出现错误

构建服务器禁用了ping / ICMP或所有出站流量都被阻止吗?

*该脚本仅考虑IPv4地址,因为我在传递IPv6地址给New-AzureRmSqlServerFirewallRule时没有成功。


当您通过Azure Powershell cmdlets添加防火墙规则时,它们会立即出现在Azure门户中,无需等待5分钟。除非您知道我不知道的事情-是否有延迟才能实施新规则? - awj
你提出的第一点是正确的 - 而这是否是实际真相,我希望有人能告诉我。至于第二点,如我在原贴中所说,我可以在Azure门户中检查并确认防火墙规则已被添加,因此该连接肯定没有被阻止。 - awj
你确定在防火墙中打开的IP地址是你正在运行测试的那个吗?(你已经排除了测试端的连接问题吗?) - Dan Rediske
@DanRediske-MSFT - 不,这就是我回复mikalai的内容,我希望能找到答案。我正在为在构建服务器上检测到的所有IPv4地址添加规则,但我没有关于测试运行位置的更多信息,无论是在构建服务器上还是其他地方。我希望这篇SO文章能促使了解此类事情的人阐明这个话题,但到目前为止,只有两个人问了我这个问题。 - awj
你建议我改变什么(在哪里)? - awj
显示剩余9条评论
3个回答

1
我们终于解决了问题。问题与防火墙无关。问题在于我们单元测试中的app.config文件没有像我们的web.config文件一样经过转换步骤。因此,所有设置都来自我们的本地开发,因此是错误的。
更多信息请参见:
在Visual Studio Online构建/测试任务中连接外部服务

我们是说不需要特定的防火墙规则吗?这是否意味着任何 VSTS 主机都可以访问 Azure SQL 服务器?还是仅适用于已关联到该 VSTS 实例的 Azure 实例? - Kevin
不,我们在错误的角落寻找。VSTS主机可以访问Azure SQL。 - Remy

0
如果您正在使用TCP连接,那么为什么您的错误消息会显示“命名管道”?
(提供程序:命名管道提供程序,错误:40-无法打开到SQL Server的连接)
我建议您首先调查这个悖论。防火墙测试非常简单,允许0.0.0.0255.255.255.2550.0.0.0/0,然后重新测试。我认为会出现相同的错误消息。

0
你使用的是什么连接字符串?你的错误似乎表明这不是真正的防火墙问题,而是尝试连接到一个不存在的服务器。

Firewall error example

我目前的 * 不正确 * 假设是您的连接字符串仅包含服务器名称,没有 .database.windows.net 后缀,这会导致客户端驱动程序在本地网络上查找服务器。出现的错误似乎与防火墙无关。

(已编辑以反映作者的反馈。)


谢谢您的建议,但恐怕您的工作假设似乎是错误的:连接字符串以 connectionString="Server=tcp:MY_DATABASE_NAME.database.windows.net,1433;... 开头。 - awj
你能把整个连接字符串以及提供程序名称一起发布吗? - Luca Cappa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接