1

我正在尝试在 Windows Azure 中设置一个虚拟网络并使用它来避免在我的(自定义)SQL Server 虚拟机上打开一个公共端点。但是,我不断收到与网络相关的错误,指出当尝试通过云服务的 URL 访问我的 Web 应用程序时,SQL Server 不会及时回复。

我在网上到处寻找教程,这些教程展示了如何连接到自己的自定义创建的 VM,而不是 Windows Azure 的预配置虚拟机之一,但发现几乎没有用处。我发现的所有建议我都试过了。

我在 Windows 7 中工作,使用安装了 Windows Azure SDK SP1 的 Visual Studio 2010。
以下是我试图做的一些无济于事的细节。

我有:

  • 创建了虚拟网络
    • 自己的亲和组
    • 单个子网
  • 将虚拟机添加到其中
    • 确保将其与我为 VNet 创建的关联组放在同一个关联组中
  • 安装的 SQL Server
  • 按照本教程配置 SQL Server
  • 添加了我的数据库,并且我已验证的登录名可以访问该数据库
  • 两个都:
    1. 将现有的 Asp.NET 网站转换为 Web 应用程序并添加了 Azure 部署包,请参阅此处了解我遵循的教程
      • 我使用r-click->Publish to Azure/Publish了这个,配置为使用我已经部署在 VNet 中的现有云服务和 SQL VM,并确保它与 VM 在同一个子网中。
      • 还值得注意的是,此应用程序通过在端口 1433 上打开公共端点并使用公共 IP 地址连接到虚拟网络(仍在 Azure)外部,确实连接到了类似的 VM。
    2. 在按照本教程配置的全新 Azure 云服务项目中使用转换后的 Web 应用程序代码(我提到的第一个)
      • 我尝试通过以下方式发布:
        • r-click->Publish to Azure/Publish
        • r-click->Package并将其上传到 Azure 门户
      • 在这两种情况下
        • VNet(和子网)中的现有云服务
        • 以及在 VNet(和子网)中创建的全新云服务,并在创建期间上传包或在启动后立即发布到服务。
  • 仔细检查我经历过的所有云服务和虚拟机都在 VNet 中,并且在同一个子网中。

    • My Cloud 服务通常位于内部 IP 10.4.2.5,VM 位于 10.4.2.4。我的连接字符串与我提到的第一个教程相同,只是使用了正确的身份验证并指定了我的 VM 的内部 IP。连接字符串如下:

      <add name="SQLServerinWAConnection"
      connectionString="Data Source=tcp:SQLVMInternalIPAddress;Initial Catalog=MyTableName;User ID=loginName;Password=thepassword;Encrypt=true;Trusted_Connection=false;TrustServerCertificate=true"
      providerName="System.Data.SqlClient" />
      
      • 我也尝试指定Trusted_Connection=true

无论我尝试什么,我都无法让该应用程序连接到该 VM 上的 SQL Server 实例。我什至在端口 1433 向 VM 添加了一个公共端点,并尝试使用其公共 IP 和私有 IP,但无济于事。那是我的后备力量,所以现在我损失惨重。

一些可能有也可能没有任何影响的实现细节:

  • SQL Server 实例是命名的,而不是默认的,因此在 SQL Server Management Studio 的对象资源管理器中,它不仅仅是“SQLServerVM”,而是“SQLServerVM\SQLServerDB”。
  • 我在 VM 的防火墙上为任何 IP 范围和任何用户打开了端口 1433

我会根据要求添加任何额外的细节(如果你不想阅读整个教程来弄清楚我做了什么)。

根本没有可用的清单来说明 Web 角色或网站能够连接到其虚拟网络中的虚拟机需要做的事情?这将大大简化故障排除。

任何建议将不胜感激。我非常希望能在一天结束时完成这项工作。

4

1 回答 1

1

就我而言,由于我们的客户端使用命名数据库实例在 VM 上安装了 SQL Server,因此托管我需要连接的实例的服务没有正确设置其 TCP 端口。所以我命名 SQL Server 实例的细节确实很重要。

如果您只是无法弄清楚为什么您的 Web 角色(云服务)没有连接到同一虚拟网络中的虚拟机,除了检查问题中的所有内容之外,请检查以下设置:

  1. 登录到虚拟机 (RDP)
  2. 打开SQL Server 配置管理器
  3. 展开左侧面板中的“SQL Server 网络配置”
  4. 单击左侧面板中的“{SQL Instance name here} 的协议” 。
  5. 右键单击右侧面板中的“TCP/IP”,转到“属性...”
  6. 仔细检查"Enabled"是否设置为"Yes"
  7. 切换到“IP 地址”选项卡。
  8. 此时,如果不是“IPALL”或其他一些,您应该看到至少域 IP 的“TCP 端口”应该是 1433(在我的情况下,“IP2”部分中的 10.4.2.4)。
    • 请注意,所有“IP{X}”部分的“TCP 端口”设置可能具有不同的值。

如果您没有看到此 SQL Server 实例正在侦听 1433(或您尝试配置的其他端口):

  1. 转到“IPALL”并将“TCP 端口”更改为 1433(或您喜欢的任何端口,1433 是默认发送到的端口)。
    • 这将允许在该端口上侦听从任何地方进入该服务器的地址。
    • 请注意,可能有一种更清洁的方法可以做到这一点,但这对我们来说效果很好。

这允许我从该 VNet 中的所有云服务访问 SQL Server 实例,仅使用 VM 的内部 IP 地址,而无需为我配置的端口 (1433) 打开公共端点。
以防万一,这是工作连接字符串:

<add name="ApplicationServices"
    connectionString="Data Source=tcp:{VM Internal IP}\{InstanceName},{port};Initial Catalog={Table};User ID={username};Password={passwd};Encrypt=true;Trusted_Connection=false;TrustServerCertificate=true" providerName="System.Data.SqlClient"/>

确保更换:

  • {VM Internal IP}使用您的内部 IP 地址
  • {InstanceName}\使用您的 SQL Server 实例的名称,或者如果您有默认实例,则将其和前面的内容完全保留。
  • {port}应该是 1433 或您在 VM 中为该 Sql Server 实例打开的任何端口。
  • {Table}默认情况下要使用的数据库表
  • {username}{passwd}与您的 SQL Server 用户一起使用。请注意,我在这里使用 SQL Server 身份验证。

还值得注意的是,这并没有将我的服务器打开到 Internet(如预期的那样),因为我仍然无法从外部世界访问它,因此它以这种方式在 VNet 中保持安全。

希望这将有助于将来的某人。

于 2013-10-01T20:33:04.550 回答