我在 Azure 中有以下设置:
- 公共 IP 地址 (IPv4)
- Azure 应用程序网关(标准 V2)
- 具有一个子网的 V-NET。AGW 已部署到该子网,并且已禁用“添加 IPv6 地址空间”复选框
- AppServices 和 Functions 作为后端
如果这很重要的话,一切都位于西欧地区。
我正在排查一个问题,我注意到 AGW 健康探测不包含原始 IPv4 地址。我期望健康探测请求源自 AGW 子网。事实上,在具有类似设置的其他环境中,情况也是如此。
我有一个简单的Azure 函数X-Forwarded-From
我用它来测试,它在header中记录了一个 IP 地址列表。其实没什么特别的:
if (request.Headers.TryGetValues("X-Forwarded-For", out var values)){
foreach(var val in values) log.LogInformation($"IP:{val}");
}
- 当我直接调用此函数时,我可以在那里看到一个 IP 地址(我的电脑的 IP)。
- 当我呼叫 AGW 时,我可以看到三个 IP(我的电脑、Cloudflare 和一个未知的 IPv6(???))。
- 当 AGW 执行健康探测时,我只能看到一个 IPv6 条目(与上面相同)
这个 IPv6(fde4:8dba:1200:xxxx:xxxx:xxx:xxxx:x
在我看来像 ULA)地址来自哪里?为什么我在子网范围内看不到 IPv4 地址?我如何才能强制 IPv4 地址存在?
这种情况违反了我的 IIS IP 限制规则。
我知道我也可以将 IPv6 列入白名单:
<add ipAddress="2001:4898:2a:5:c4ad:9291:22b1:c870" subnetMask="ffff:ffff::" allowed="true" />
但这并不能解开谜团。
答案1
确保未在应用程序网关的子网中启用 Microsoft.Web 服务终结点。这将导致通过该 IPv6 终结点(而不是从应用程序网关的公共 IP 地址)发送至应用服务的流量。