求助:Azure APIM IP策略适配Azure Front Door动态IP的解决方案
我们使用Azure APIM管理各客户端的API调用,并通过IP限制策略仅允许特定IP地址访问API。主应用(网站)部署在Azure VM上,请求通过Azure Front Door进行路由,但启用IP策略后,请求被Azure APIM拦截。
此前我们将网站的IP地址添加到IP策略XML中,但发现当承载网站的VM重启或停止后,Azure Front Door的IP地址会发生变化,每日手动更新IP范围的操作难度极大。
当前使用的IP策略配置如下:
<!-- Add policies as children to the <inbound>, <outbound>, <backend>, and <on-error> elements --> <policies> <!-- Throttle, authorize, validate, cache, or transform the requests --> <inbound> <base /> <cors allow-credentials="false"> <allowed-origins> <origin>*</origin> </allowed-origins> <allowed-methods> <method>*</method> </allowed-methods> ......................................... <ip-filter action="allow"> <address-range from="xx.xx.xx.xx" to="xxxx:xxx:bdf:0:0:0:0:xx" /> <address-range from="xx.xx.xx.xx" to="xxxx:1ec:bdf::xx" /> <address>xx.xx.xx.xx</address> <address>xx.xx.xx.xx</address> <address>xx.xx.xx.xx</address> <address>xx.xx.xx.xx</address> </ip-filter>
以下是无需额外增加Application Gateway成本的可行解决方案:
基于X-Forwarded-For头验证原始VM IP
APIM会保留Front Door转发的原始客户端IP在X-Forwarded-For请求头中。如果给VM配置静态公网IP,可修改IP过滤策略,直接验证该头中的原始IP(即VM的静态IP),而非Front Door的动态出口IP。
实现思路:先用set-variable提取X-Forwarded-For的第一个IP值,再通过ip-filter或choose策略对该IP进行校验。用APIM命名值+自动化脚本管理IP列表
将允许的IP/IP范围存储到APIM的**命名值(Named Values)**中,策略里直接引用命名值(如{{AllowedVMIPs}})。若VM是动态IP,可编写Azure Automation脚本,定期获取VM的公网IP并自动更新命名值,完全替代手动操作。替换为Azure AD身份验证
若业务场景允许,给Front Door配置Azure AD身份验证,仅让经过认证的请求到达APIM。APIM可验证Front Door传递的身份令牌,确保请求来自可信的Front Door实例,彻底摆脱IP依赖的限制。使用Front Door静态IP前缀(预览功能)
Azure Front Door提供静态IP前缀预览服务,申请后可获得固定的IP范围,将这些前缀添加到APIM的IP过滤策略中即可,无需担心IP动态变化。该功能无需额外成本,适合不想调整架构的场景。
内容的提问来源于stack exchange,提问作者sbapi81

