3. 子网与网络安全组基础

在 Azure 虚拟网络中,子网解决的是“地址如何划分”,而网络安全组(Network Security Group,NSG)解决的是“流量是否被允许”。NSG 是一组有序的安全规则,可以关联到子网或网卡(NIC),对入站和出站流量分别进行过滤。理解 NSG 的关键,不是记住某一条规则,而是理解它的匹配顺序、默认规则兜底逻辑,以及服务标签和应用安全组如何让规则更易维护。

一、NSG 的规则结构与优先级

每条 NSG 规则包含若干核心属性:名称、优先级(100~4096)、方向(Inbound/Outbound)、协议(TCP/UDP/ICMP/Any)、源、源端口、目标、目标端口、动作(Allow/Deny)。其中优先级数字越小,规则越先被评估。NSG 对每个方向的流量按优先级从低到高逐条匹配,一旦命中某条规则,就立即执行该规则的动作,不再继续向下匹配。

这意味着 NSG 规则不是“叠加生效”,而是“先命中先决定”。例如,优先级 100 的 Deny 规则会阻断流量,即使后面存在优先级 200 的 Allow 规则也不会被评估。因此,在规划规则时,应把更具体、更严格、更关键的规则放在较低优先级数字,把宽泛的允许规则放在较高优先级数字。

示例:某子网需要允许来自 Internet 的 HTTPS,但拒绝来自 Internet 的 SSH。可以设计:

  • 优先级 100:Inbound,源=Internet,目标端口=22,协议=TCP,动作=Deny
  • 优先级 200:Inbound,源=Internet,目标端口=443,协议=TCP,动作=Allow

这样 SSH 流量在 100 处被拒绝,HTTPS 流量在 100 处不匹配后继续到 200 被允许。

二、入站与出站规则的方向约定

NSG 的入站规则作用于“进入子网或网卡”的流量,出站规则作用于“离开子网或网卡”的流量。方向的定义以 NSG 所关联的对象为参照:入站是外部到内部,出站是内部到外部。对于同一台虚拟机,入站规则控制谁可以访问它,出站规则控制它可以访问谁。

实际配置中,出站规则常被忽略,但它在限制横向移动、控制对外访问方面同样重要。例如,可以默认允许出站到 VirtualNetwork,但拒绝出站到 Internet,只对特定服务标签放行。需要注意的是,NSG 是有状态的:如果一条入站流量被允许,其返回流量会自动被允许,不需要额外配置出站规则;反之亦然。因此,不要为“请求的响应”单独写出站规则,除非该响应本身是新的连接发起。

三、服务标签:用逻辑名称代替 IP 地址

服务标签(Service Tag)是 Azure 维护的一组 IP 地址前缀集合,代表特定 Azure 服务或类别。常见服务标签包括 Internet、VirtualNetwork、AzureLoadBalancer、Storage、Sql、AzureCloud 等。使用服务标签的好处是:不需要手动维护 IP 列表,Azure 会在后端地址变化时自动更新。

例如,要允许子网内虚拟机访问 Azure SQL 数据库,可以写出站规则:目标=Sql,目标端口=1433,协议=TCP,动作=Allow。要允许 Azure 负载均衡器探测流量进入后端虚拟机,可以写入站规则:源=AzureLoadBalancer,目标端口=任意,动作=Allow。服务标签让规则更简洁,也减少了因 IP 变化导致的规则失效。

四、应用安全组:按角色分组,而不是按 IP 分组

应用安全组(Application Security Group,ASG)是 NSG 规则中的一种源或目标引用方式。它把虚拟机按应用角色分组,例如 Web 层、App 层、DB 层。规则中可以直接写“源=ASG-Web,目标=ASG-App,端口=8080”,而不需要关心具体虚拟机的 IP 地址。

ASG 的价值在于解耦:当新增一台 Web 虚拟机时,只要把它加入 ASG-Web,它自动获得相应规则,无需修改 NSG。ASG 必须与 NSG 配合使用,且同一 ASG 中的网卡应位于同一虚拟网络内。对于多层应用,ASG 能显著降低规则数量和运维复杂度。

五、默认规则与自定义规则的关系

每个 NSG 都包含一组默认规则,优先级为 65000、65001、65002 等,不可删除,但可以被更高优先级的自定义规则覆盖。默认规则大致包括:允许 VirtualNetwork 入站和出站、允许 AzureLoadBalancer 入站、拒绝所有其他入站、允许所有出站到 Internet(具体以 Azure 当前文档为准)。

默认规则提供了“最小可用”的兜底:虚拟网络内部默认互通,Internet 入站默认拒绝,出站默认允许。自定义规则的作用是在此基础上做精细化控制。例如,默认允许 VirtualNetwork 入站,但如果希望限制子网之间互访,就需要添加更高优先级的 Deny 规则来覆盖它。

注意:默认规则中的“允许 VirtualNetwork 入站”范围较宽,可能包含同一虚拟网络内其他子网的流量。如果业务要求子网隔离,应显式添加 Deny 规则,而不是依赖默认行为。

六、实践:为三层应用设计 NSG 规则

假设有一个虚拟网络 10.0.0.0/16,包含三个子网:Web 子网 10.0.1.0/24、App 子网 10.0.2.0/24、DB 子网 10.0.3.0/24。创建三个 ASG:ASG-Web、ASG-App、ASG-DB,并分别关联对应虚拟机网卡。目标:Internet 只能访问 Web 的 443;Web 只能访问 App 的 8080;App 只能访问 DB 的 1433;其余入站拒绝。

可以在 Web 子网 NSG 上配置入站规则:优先级 100,源=Internet,目标=ASG-Web,端口=443,Allow;优先级 200,源=VirtualNetwork,目标=ASG-Web,端口=22,Allow(用于管理);优先级 4000,源=Any,目标=Any,端口=Any,Deny。在 App 子网 NSG 上配置入站规则:优先级 100,源=ASG-Web,目标=ASG-App,端口=8080,Allow;优先级 4000,Deny。在 DB 子网 NSG 上配置入站规则:优先级 100,源=ASG-App,目标=ASG-DB,端口=1433,Allow;优先级 4000,Deny。

配置完成后,验证方法是:从 Internet 访问 Web 的 443 应成功,访问 22 应失败;从 Web 访问 App 的 8080 应成功,访问 DB 的 1433 应失败;从 App 访问 DB 的 1433 应成功。若结果不符,可使用 Azure 网络观察程序的“IP 流验证”功能,指定源 IP、目标 IP、端口和协议,查看是哪条规则允许或拒绝了流量。

三层应用 NSG 规则与流量路径示意 Internet 外部用户 Web 子网 10.0.1.0/24 ASG-Web · 端口 443 App 子网 10.0.2.0/24 ASG-App · 端口 8080 DB 子网 10.0.3.0/24 ASG-DB · 1433 443 Allow 8080 Allow 1433 Allow 22 Deny 1433 Deny NSG 规则优先级与匹配顺序(示例) 优先级 方向 源 目标 端口 动作 说明 100 Inbound Internet ASG-Web 22 Deny 拒绝 SSH 200 Inbound Internet ASG-Web 443 Allow 允许 HTTPS 300 Inbound ASG-Web ASG-App 8080 Allow Web→App 4000 Inbound Any Any Any Deny 兜底拒绝

通过上述实践可以看到,NSG 的核心逻辑是“优先级决定顺序,方向决定作用面,服务标签和 ASG 决定可维护性,默认规则提供兜底”。掌握这四点后,无论是排查连通性问题,还是设计多层级安全边界,都能有清晰的判断依据。