排查虚拟网络与Azure 应用服务的集成问题

本文介绍可用于排查与虚拟网络集成的Azure 应用服务中的连接问题的工具。

注意

App 服务 中的 Docker Compose 方案不支持虚拟网络集成。 如果存在专用终结点,则忽略访问限制策略。

验证虚拟网络集成

若要排查连接问题,必须首先验证虚拟网络集成配置是否正确,以及是否将专用 IP 分配给App 服务计划的所有实例。

为此,请使用以下方法之一:

在 Kudu 调试控制台中检查专用 IP

若要访问 Kudu 控制台,请在Azure 门户中选择应用服务,转到“开发工具”,选择“高级工具”,然后选择“转到”。 在 Kudu 服务页中,选择 “工具>调试控制台>CMD”。

显示如何在Azure 门户中打开 Kudu 服务页的屏幕截图。

还可以直接通过 URL [sitename].scm.azurewebsites.net/DebugConsole转到 Kudu 调试控制台。

在调试控制台中,运行以下命令之一:

基于 Windows OS 的应用

SET WEBSITE_PRIVATE_IP

如果已成功分配专用 IP,你将获得以下输出:

WEBSITE_PRIVATE_IP=<IP address>

基于 Linux OS 的应用

set| egrep --color 'WEBSITE_PRIVATE_IP'

检查 Kudu 环境中的专用 IP

转到 的 Kudu 环境 [sitename].scm.azurewebsites.net/Env 并搜索 WEBSITE_PRIVATE_IP

成功配置虚拟网络集成后,可以继续执行连接测试。

排查 Windows 应用上的出站连接问题

在本机 Windows 应用中,由于安全约束, pingnslookuptracert 工具在自定义 Windows 容器 () 中工作,因此无法使用控制台。

直接 [sitename].scm.azurewebsites.net/DebugConsole转到 的 Kudu 控制台。

若要测试 DNS 功能,可以使用 nameresolver.exe。 语法是:

nameresolver.exe hostname [optional:DNS Server]

可以使用 nameresolver 检查应用依赖的主机名。 这样,可以测试 DNS 是否配置错误,或者是否无权访问 DNS 服务器。 可以通过查看环境变量WEBSITE_DNS_SERVER和WEBSITE_DNS_ALT_SERVER来查看应用在控制台中使用的 DNS 服务器。

注意

nameresolver.exe 工具目前在自定义 Windows 容器中不起作用。

若要测试与主机和端口组合的 TCP 连接,可以使用 tcpping。 语法为 。

tcpping.exe hostname [optional: port]

tcpping 实用工具会告知你是否可以访问特定的主机和端口。 仅当应用程序在主机和端口组合中侦听,并且有从应用到指定主机和端口的网络访问时,它才能显示成功。

排查 Linux 应用上的出站连接问题

直接转到 的 [sitename].scm.azurewebsites.netKudu。 在 Kudu 服务页中,选择 “工具>调试控制台>CMD”。

若要测试 DNS 功能,可以使用命令 nslookup。 语法是:

nslookup hostname [optional:DNS Server]

根据上述结果,如果 DNS 服务器上配置错误,可以检查。

注意

nameresolver.exe 工具目前在 Linux 应用中不起作用。

若要测试连接性,可以使用 Curl 命令。 语法是:

curl -v https://hostname
curl hostname:[port]

调试对虚拟网络托管资源的访问

许多因素可能会阻止应用访问特定的主机和端口。 大多数情况下,它是以下其中一种:

  • 防火墙处于阻碍中。 如果有防火墙,则会达到 TCP 超时。 在这种情况下,TCP 超时为 21 秒。 使用 tcpping 工具测试连接性。 TCP 超时可能由防火墙之外的许多因素引起,但从那里开始。
  • 无法访问 DNS。 每个 DNS 服务器的 DNS 超时为 3 秒。 如果有两个 DNS 服务器,则超时为 6 秒。 使用 nameresolver 查看 DNS 是否正常工作。 无法使用 nslookup,因为该 nslookup 不使用配置虚拟网络时使用的 DNS。 如果无法访问,则可能有防火墙或 NSG 阻止对 DNS 的访问,或者它可能已关闭。 某些使用自定义 DNS 服务器的 DNS 体系结构可能比较复杂,有时可能会遇到超时。 若要确定是否是这种情况,可以设置环境变量 WEBSITE_DNS_ATTEMPTS 。 有关应用服务中的 DNS 的详细信息,请参阅名称解析 (App 服务 中的 DNS)

如果这些项目不能解决你的问题,请首先查找以下内容:

区域虚拟网络集成

  • 目标是否为非RFC1918地址,并且未启用 “全部路由 ”?
  • 是否存在 NSG 阻止集成子网的出口?
  • 如果要通过 Azure ExpressRoute 或 VPN,本地网关是否配置为将流量路由回 Azure? 如果可以访问虚拟网络中的终结点,但不能访问本地终结点,检查路由。
  • 是否有足够的权限在集成子网上设置委派? 在区域虚拟网络集成配置期间,集成子网将委托给 Microsoft.Web/serverFarms。 VNet 集成 UI 自动将子网委托给 Microsoft.Web/serverFarms。 如果帐户没有足够的网络权限来设置委派,则需要可以在集成子网上设置属性的人员来委托子网。 若要手动委托集成子网,请转到 Azure 虚拟网络子网 UI,并为 Microsoft.Web/serverFarms 设置委派。

调试网络问题是一项挑战,因为你无法查看阻止对特定 host:port 组合的访问的原因。 一些原因包括:

  • 主机上有一个防火墙,用于阻止从点到站点 IP 范围访问应用程序端口。 跨子网通常需要公共访问权限。
  • 目标主机已关闭。
  • 应用程序已关闭。
  • 你的 IP 或主机名不正确。
  • 应用程序正在侦听与预期不同的端口。 可以使用终结点主机上的“netstat -aon”将进程 ID 与侦听端口匹配。
  • 网络安全组的配置方式是阻止从点到站点 IP 范围访问应用程序主机和端口。

你不知道你的应用实际使用的地址。 它可以是集成子网或点到站点地址范围中的任何地址,因此需要允许从整个地址范围进行访问。

更多调试步骤包括:

  • 连接到虚拟网络中的 VM,并尝试从该处访问资源 host:port。 若要测试 TCP 访问,请使用 PowerShell 命令 Test-NetConnection。 语法是:
Test-NetConnection hostname [optional: -Port]
  • 在 VM 上启动应用程序,并使用 tcpping 从控制台测试对该主机和端口的访问。

网络疑难解答

还可以使用网络疑难解答来排查App 服务中应用的连接问题。 若要打开网络疑难解答,请转到Azure 门户中的应用服务。 选择“ 诊断并解决问题”,然后搜索 “网络疑难解答”。

显示如何在Azure 门户中打开网络疑难解答的屏幕截图。

注意

连接问题方案尚不支持 Linux 或基于容器的应用。

连接问题 - 它将检查虚拟网络集成的状态,包括检查是否已将专用 IP 分配给App 服务计划的所有实例和 DNS 设置。 如果未配置自定义 DNS,将应用默认 Azure DNS。 还可以针对要测试连接的特定终结点运行测试。

显示连接问题的运行疑难解答的屏幕截图。

配置问题 - 如果子网对虚拟网络集成有效,此疑难解答将检查。

显示如何针对Azure 门户中的配置问题运行疑难解答的屏幕截图。

子网/VNet 删除问题 - 如果子网有任何锁定,并且子网有任何可能阻止删除 VNet/子网的未使用服务关联链接,此疑难解答将检查。

显示如何针对子网或虚拟网络删除问题运行疑难解答的屏幕截图。

收集网络跟踪

收集网络跟踪有助于分析问题。 在 Azure 应用 服务中,网络跟踪是从应用程序过程中获取的。 若要获取准确的信息,请在启动网络跟踪收集时重现问题。

注意

虚拟网络流量不会在网络跟踪中捕获。

Windows 应用服务

若要收集 Windows 应用服务的网络跟踪,请执行以下步骤:

  1. 在Azure 门户,导航到 Web 应用。
  2. 在左侧导航中,选择“ 诊断并解决问题”。
  3. 在搜索框中,键入 “收集网络跟踪 ”,然后选择“ 收集网络跟踪 ”以启动网络跟踪收集。

显示如何捕获网络跟踪的屏幕截图。

若要获取为 Web 应用提供服务的每个实例的跟踪文件,请在浏览器中转到 Web 应用的 Kudu 控制台 (https://<sitename>.scm.azurewebsites.net) 。 从 C:\home\LogFiles\networktraceD:\home\LogFiles\networktrace 文件夹下载跟踪文件。

Linux 应用服务

若要收集不使用自定义容器的 Linux 应用服务的网络跟踪,请执行以下步骤:

  1. tcpdump通过运行以下命令安装命令行实用工具:

    apt-get update
    apt install tcpdump
    
  2. 通过安全外壳协议 (SSH) 连接到容器。

  3. 通过运行以下命令来标识启动和运行的接口, (例如 eth0) :

    root@<hostname>:/home# tcpdump -D
    
    1.eth0 [Up, Running, Connected]
    2.any (Pseudo-device that captures on all interfaces) [Up, Running]
    3.lo [Up, Running, Loopback]
    4.bluetooth-monitor (Bluetooth Linux Monitor) [Wireless]
    5.nflog (Linux netfilter log (NFLOG) interface) [none]
    6.nfqueue (Linux netfilter queue (NFQUEUE) interface) [none]
    7.dbus-system (D-Bus system bus) [none]
    8.dbus-session (D-Bus session bus) [none]
    
  4. 运行以下命令启动网络跟踪收集:

    root@<hostname>:/home# tcpdump -i eth0 -w networktrace.pcap
    

    将 替换为 eth0 实际接口的名称。

若要下载跟踪文件,请通过 Kudu、FTP 或 Kudu API 请求等方法连接到 Web 应用。 下面是触发文件下载的请求示例:

https://<sitename>.scm.azurewebsites.net/api/vfs/<path to the trace file in the /home directory>/filename

第三方信息免责声明

本文中提到的第三方产品由 Microsoft 以外的其他公司提供。 Microsoft 不对这些产品的性能或可靠性提供任何明示或暗示性担保。

联系我们寻求帮助

如果你有任何疑问或需要帮助,请创建支持请求联系 Azure 社区支持。 还可以向 Azure 反馈社区提交产品反馈。