你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

如何控制应用服务环境的入站流量

重要

本文介绍应用服务环境 v1。 应用服务环境 v1 将于 2024 年 8 月 31 日停用。 应用服务环境有新版本,此版本更易于使用并在更强大的基础结构上运行。 若要详细了解该新版本,请先参阅应用服务环境简介。 如果你当前正在使用应用服务环境 v1,请按照本文中的步骤迁移到新版本。

从 2024 年 1 月 29 日起,无法再使用任何可用方法(包括 ARM/Bicep 模板、Azure 门户、Azure CLI 和 REST API)创建新的应用服务环境 v1 资源。 你必须在 2024 年 8 月 31 日之前迁移到应用服务环境 v3,以防止资源删除和数据丢失。

概述

可以在 Azure 资源管理器虚拟网络或经典部署模型虚拟网络中创建应用服务环境。 创建应用服务环境时,可以定义新的虚拟网络和新的子网。 或者,可以在预先存在的虚拟网络和预先存在的子网中创建应用服务环境。 自 2016 年 6 月起,也可以将 ASE 部署到使用公用地址范围或 RFC1918 地址空间(专用地址)的虚拟网络。 有关详细信息,请参阅如何根据模板创建 ASEv1

始终在子网中创建应用服务环境。 子网提供网络边界,可用于锁定上游设备和服务后的入站流量。 此设置仅允许特定上游 IP 地址接受 HTTP 和 HTTPS 流量。

使用网络安全组可以控制子网上的入站和出站网络流量。 要控制入站流量,请在网络安全组中创建网络安全规则。 然后,将网络安全组分配给包含应用服务环境的子网。

将网络安全组分配给子网后,根据网络安全组中定义的允许和拒绝规则,允许或阻止应用服务环境中应用程序的入站流量。

注意

尽管本文中指的是 Web 应用,但内容同样适用于 API 应用和移动应用。

应用服务环境中使用的入站网络端口

使用网络安全组锁定入站网络流量之前,要知道应用服务环境所用的必需和可选网络端口集。 意外关闭发往某些端口的流量可能会在应用服务环境中导致功能丢失。

以下列表包含应用服务环境使用的端口。 所有端口都是 TCP,除非另有明确的说明:

  • 454:“必需端口”,Azure 基础结构使用此端口通过 TLS 管理和维护应用服务环境。 不要阻止发往此端口的流量。 此端口始终绑定到 ASE 的公共 VIP。
  • 455:“必需端口”,Azure 基础结构使用此端口通过 TLS 管理和维护应用服务环境。 不要阻止发往此端口的流量。 此端口始终绑定到 ASE 的公共 VIP。
  • 80:用于将入站 HTTP 流量发往应用服务环境的应用服务计划中运行的应用的默认端口。 在启用 ILB 的 ASE 中,此端口绑定到 ASE 的 ILB 地址。
  • 443: 默认端口,用于将入站 TLS 流量发往在应用服务环境的应用服务计划中运行的应用。 在启用 ILB 的 ASE 中,此端口绑定到 ASE 的 ILB 地址。
  • 21:FTP 的控制通道。 如果未使用 FTP,则可以安全地阻止此端口。 在启用 ILB 的 ASE 中,此端口可以绑定到 ASE 的 ILB 地址。
  • 990:FTPS 的控制通道。 如果未使用 FTPS,则可以安全地阻止此端口。 在启用 ILB 的 ASE 中,此端口可以绑定到 ASE 的 ILB 地址。
  • 10001-10020:FTP 的数据通道。 和控制通道一样,如果未使用 FTP,则可以放心地阻止这些端口。 在启用 ILB 的 ASE 中,此端口可以绑定到 ASE 的 ILB 地址。
  • 4016:用于 Visual Studio 2012 的远程调试。 如果未使用该功能,则可以安全地阻止此端口。 在启用 ILB 的 ASE 中,此端口绑定到 ASE 的 ILB 地址。
  • 4018:用于 Visual Studio 2013 的远程调试。 如果未使用该功能,则可以安全地阻止此端口。 在启用 ILB 的 ASE 中,此端口绑定到 ASE 的 ILB 地址。
  • 4020:用于 Visual Studio 2015 的远程调试。 如果未使用该功能,则可以安全地阻止此端口。 在启用 ILB 的 ASE 中,此端口绑定到 ASE 的 ILB 地址。
  • 4022:用于 Visual Studio 2017 的远程调试。 如果未使用该功能,则可以安全地阻止此端口。 在启用 ILB 的 ASE 中,此端口绑定到 ASE 的 ILB 地址。
  • 4024:用于 Visual Studio 2019 的远程调试。 如果未使用该功能,则可以安全地阻止此端口。 在启用 ILB 的 ASE 中,此端口绑定到 ASE 的 ILB 地址。
  • 4026:用于 Visual Studio 2022 的远程调试。 如果未使用该功能,则可以安全地阻止此端口。 在启用 ILB 的 ASE 中,此端口绑定到 ASE 的 ILB 地址。

出站连接和 DNS 要求

若要让应用服务环境正常运行,还需具有对各个终结点的出站访问权限。 Network Configuration for ExpressRoute(ExpressRoute 的网络配置)一文的“所需的网络连接”部分中提供了 ASE 所用外部终结点的完整列表。

应用服务环境要求为虚拟网络配置有效 DNS 基础结构。 如果创建应用服务环境之后更改了 DNS 配置,开发人员可以强制应用服务环境选择新的 DNS 配置。 如果使用“重新启动”图标触发滚动环境重启,环境将选取新的 DNS 配置。 (“重新启动”图标位于应用服务环境管理边栏选项卡顶部的 Azure 门户中。)

此外,还建议事先在 VNet 上设置任何自定义 DNS 服务器,并创建应用服务环境。 如果在创建应用服务环境时更改虚拟网络的 DNS 配置,那么应用服务环境创建过程将会失败。 同样地,如果 VPN 网关的另一端的自定义 DNS 服务器无法连接或无法使用,则应用服务环境创建过程也会失败。

创建网络安全组

有关网络安全组工作原理的完整详情,请参阅以下信息。 以下 Azure 服务管理示例涉及网络安全组的要点。 该示例说明如何配置网络安全组并将其应用到包含应用服务环境的子网。

注意: 可以使用 Azure 门户或通过 Azure PowerShell 以图形方式配置网络安全组。

网络安全组最初创建为与订阅关联的独立实体。 由于网络安全组是在 Azure 区域中创建的,因此请确保在与应用服务环境相同的区域中创建网络安全组。

下列命令行演示了如何创建网络安全组:

New-AzureNetworkSecurityGroup -Name "testNSGexample" -Location "South Central US" -Label "Example network security group for an app service environment"

创建网络安全组后,将一个或多个网络安全规则添加到其中。 由于规则集会随时间推移而改变,因此应当对规则优先级使用单独的编号方案。 这种做法可以随时间推移轻松插入其他规则。

在以下示例中,规则显式授予 Azure 基础结构管理和维护应用服务环境所需的管理端口的访问权限。 所有管理流量流经 TLS,并受客户端证书的保护。 即使端口已打开,Azure 管理基础结构以外的任何实体也无法访问这些端口。

Get-AzureNetworkSecurityGroup -Name "testNSGexample" | Set-AzureNetworkSecurityRule -Name "ALLOW AzureMngmt" -Type Inbound -Priority 100 -Action Allow -SourceAddressPrefix 'INTERNET'  -SourcePortRange '*' -DestinationAddressPrefix '*' -DestinationPortRange '454-455' -Protocol TCP

锁定对端口 80 和 443 的访问以便“隐藏”上游设备或服务后面的应用服务环境时,请记住上游 IP 地址。 例如,如果你使用 web 应用程序防火墙 (WAF),那么 WAF 会有自己的 IP 地址。 WAF 在把流量代理到下游应用服务环境时使用地址。 你需要在网络安全规则的“SourceAddressPrefix”参数中使用此 IP 地址。

在以下示例中,显式允许来自特定上游 IP 地址的入站流量。 地址 1.2.3.4 用作上游 WAF 的 IP 地址占位符。 请更改此值,以便与上游设备或服务使用的地址匹配。

Get-AzureNetworkSecurityGroup -Name "testNSGexample" | Set-AzureNetworkSecurityRule -Name "RESTRICT HTTP" -Type Inbound -Priority 200 -Action Allow -SourceAddressPrefix '1.2.3.4/32'  -SourcePortRange '*' -DestinationAddressPrefix '*' -DestinationPortRange '80' -Protocol TCP
Get-AzureNetworkSecurityGroup -Name "testNSGexample" | Set-AzureNetworkSecurityRule -Name "RESTRICT HTTPS" -Type Inbound -Priority 300 -Action Allow -SourceAddressPrefix '1.2.3.4/32'  -SourcePortRange '*' -DestinationAddressPrefix '*' -DestinationPortRange '443' -Protocol TCP

如果需要 FTP 支持,使用以下规则作为模板,以授予对 FTP 控制端口和数据通道端口的访问权限。 由于 FTP 是有状态协议,也许无法通过传统 HTTP/HTTPS 防火墙或代理设备路由 FTP 流量。 在此情况下,需要将“SourceAddressPrefix”设为其他值,例如 FTP 客户端运行所在的开发人员或部署计算机的 IP 地址范围。

Get-AzureNetworkSecurityGroup -Name "testNSGexample" | Set-AzureNetworkSecurityRule -Name "RESTRICT FTPCtrl" -Type Inbound -Priority 400 -Action Allow -SourceAddressPrefix '1.2.3.4/32'  -SourcePortRange '*' -DestinationAddressPrefix '*' -DestinationPortRange '21' -Protocol TCP
Get-AzureNetworkSecurityGroup -Name "testNSGexample" | Set-AzureNetworkSecurityRule -Name "RESTRICT FTPDataRange" -Type Inbound -Priority 500 -Action Allow -SourceAddressPrefix '1.2.3.4/32'  -SourcePortRange '*' -DestinationAddressPrefix '*' -DestinationPortRange '10001-10020' -Protocol TCP

(注意:数据通道端口范围在预览期可能会更改。)

以下规则演示了在使用 Visual Studio 远程调试时,如何授予访问权限。 由于每个支持的 Visual Studio 版本使用不同的端口进行远程调试,因此每个版本有不同的规则。 对于 FTP 访问,远程调试流量可能不会通过传统 WAF 或代理设备正确传送。 可以改为将 SourceAddressPrefix 设置成运行 Visual Studio 的开发人员计算机的 IP 地址范围。

Get-AzureNetworkSecurityGroup -Name "testNSGexample" | Set-AzureNetworkSecurityRule -Name "RESTRICT RemoteDebuggingVS2012" -Type Inbound -Priority 600 -Action Allow -SourceAddressPrefix '1.2.3.4/32'  -SourcePortRange '*' -DestinationAddressPrefix '*' -DestinationPortRange '4016' -Protocol TCP
Get-AzureNetworkSecurityGroup -Name "testNSGexample" | Set-AzureNetworkSecurityRule -Name "RESTRICT RemoteDebuggingVS2013" -Type Inbound -Priority 700 -Action Allow -SourceAddressPrefix '1.2.3.4/32'  -SourcePortRange '*' -DestinationAddressPrefix '*' -DestinationPortRange '4018' -Protocol TCP
Get-AzureNetworkSecurityGroup -Name "testNSGexample" | Set-AzureNetworkSecurityRule -Name "RESTRICT RemoteDebuggingVS2015" -Type Inbound -Priority 800 -Action Allow -SourceAddressPrefix '1.2.3.4/32'  -SourcePortRange '*' -DestinationAddressPrefix '*' -DestinationPortRange '4020' -Protocol TCP

将网络安全组分配给子网

网络安全组包含拒绝访问所有外部流量的默认安全规则。 将此规则与上述网络安全规则结合使用时,只有来自与“允许”操作关联的源地址范围的流量才能将流量发送到在应用服务环境中运行的应用。

在网络安全组中填充安全规则后,将该组分配给包含应用服务环境的子网。 分配命令将引用两个名称:应用服务环境所在的虚拟网络的名称,以及应用服务环境创建所在的子网的名称。

以下示例显示了要分配给子网和虚拟网络的网络安全组:

Get-AzureNetworkSecurityGroup -Name "testNSGexample" | Set-AzureNetworkSecurityGroupToSubnet -VirtualNetworkName 'testVNet' -SubnetName 'Subnet-test'

分配是一个长时间运行的操作,可能需要几分钟才能完成。 网络安全组分配成功后,只有符合“允许”规则的入站流量才能成功抵达应用服务环境中的应用。

出于完整性考虑,以下示例演示了如何从子网中删除网络安全组并取消它与子网之间的关联:

Get-AzureNetworkSecurityGroup -Name "testNSGexample" | Remove-AzureNetworkSecurityGroupFromSubnet -VirtualNetworkName 'testVNet' -SubnetName 'Subnet-test'

有关显式 IP-SSL 的特殊注意事项

如果使用显式 IP-SSL 地址配置应用(仅适用于具有公共 VIP 的 ASE)而不是使用应用服务环境的默认 IP 地址,则 HTTP 和 HTTPS 流量将通过非 80 和 443 的端口发往子网。

若要查找每个 IP-SSL 地址使用的单独端口对,请前往门户并查看应用服务环境的详细信息 UX 边栏选项卡。 选择“所有设置”>“IP 地址”。 “IP 地址”边栏选项卡显示应用服务环境的所有显式配置的 IP-SSL 地址表。 边栏选项卡还显示用于路由与每个 IP-SSL 地址关联的 HTTP 和 HTTPS 流量的特殊端口对。 在网络安全组中配置规则时,针对 DestinationPortRange 参数使用此端口对。

当 ASE 中的应用程序配置为使用 IP-SSL 时,外部客户将看不到也无需担心特殊的端口对映射。 发往应用程序的流量正常情况下将流向已配置的 IP-SSL 地址。 在将流量路由到包含 ASE 的子网的最后阶段,会在内部自动发生到特殊端口对的转换。

入门

若要开始使用应用服务环境,请参阅应用服务环境简介

有关详细信息,请参阅 从应用服务环境安全连接到后端资源

注意

如果您想要在注册 Azure 帐户之前开始使用 Azure 应用服务,请转到试用应用服务,您可以在应用服务中立即创建一个生存期较短的入门 Web 应用。 不需要使用信用卡,也不需要做出承诺。