Linux上Azure Timer Function出站地址不符,如何限制使用已发布出站地址?
我在Linux环境的定时器触发型Azure Function中,用代码里的_client向DEMO_URL发送Http GET请求。原本预期请求的X-Forwarded-For应该是已发布的出站地址(比如104.xxx.xxx.xxx)中的某一个,但实际显示为20.210.135.122。想问问有没有办法限制_client使用已发布的出站地址,方便我配置DEMO_URL服务器的防火墙?
代码如下:
public class MyFunctionApp { private HttpClient _client; public MyFunctionApp(IHttpClientFactory httpClientFactory) { _client = httpClientFactory.CreateClient(); } [FunctionName("MyFunction")] public async Task Run([TimerTrigger("%SCHEDULE%")] TimerInfo myTimer, ILogger log) { try { string url = Environment.GetEnvironmentVariable("DEMO_URL"); var response = await _client.GetAsync(url); string result = await response.Content.ReadAsStringAsync(); } catch (Exception) { } } }
升级计划+VNet绑定静态公网IP
如果你用的是Consumption计划,本身没法固定出站IP——流量会走Azure数据中心的共享出口(就是你看到的20.210.135.122这类)。升级到Premium或Dedicated计划后,把Function App加入虚拟网络,再给这个VNet关联静态公共IP/IP前缀,所有出站流量就会通过指定IP发送,直接把这个IP加到DEMO_URL的防火墙白名单即可。用专用终结点访问Azure内部服务
如果DEMO_URL对应的是Azure自家服务(比如App Service、Storage、SQL等),可以给目标服务配置专用终结点,让Function通过VNet内部私有IP访问,无需依赖公共出站IP,防火墙直接放行VNet的私有IP段就行。配置VNet路由规则锁定出口
当Function加入VNet后,通过用户定义路由(UDR)和网络安全组(NSG)配置出站流量路径,确保发往DEMO_URL的流量都走指定的静态公网IP出口,避免走默认共享出口。临时方案:添加全量出站IP段到白名单
若暂时没法升级计划,可先在Azure门户里导出Function App的所有出站IP范围(包括计划对应的额外IP段),把这些IP段全部加到DEMO_URL的防火墙白名单。但这种方式IP数量多,维护麻烦,仅作为临时过渡方案。
内容的提问来源于stack exchange,提问作者Jack Lin

