ASP.NET核心Web API使用哪个IP地址



我已经在IIS上发布了ASP.NET核心Web API。该网站托管在具有多个IP地址的Windows Server 2019专用服务器上。在Plesk中,我已经设置了我希望网站绑定到的IP地址(假设是10.1.1.1(。当我ping域名时,我看到了正确的IP地址。

在API的一个端点中,有一个向外部API发出的HTTP请求,该请求对预定义的IP地址具有访问限制。如果从未知IP对此外部API发出请求,则返回该IP地址的错误。

我们网站的IP地址在外部API上设置正确。然而,当我们的API试图从代码连接到外部API时,它没有使用网站的正确IP地址。它使用服务器上第一个可用的IP地址。因此,与外部API的连接被拒绝。

我的问题是,为什么HTTP请求不是从与网站相同的IP地址发出的,我能做些什么来纠正问题?

当我们将站点绑定到IIS时,您只绑定传入的IP地址。传统上,我们希望控制和清除所有出站请求,如果配置了多个NIC,则出站流量将通过配置了网关的NIC或与目标位于同一子网上的NIC进行路由。

如果您的服务器在同一NIC中定义了多个IP地址,则会为您选择IIS托管内容中的出站IP地址。我不确定这是否是一个循环,但我可以告诉你,它与你的网站绑定的传入IP地址无关。

出站流量根本与IIS无关,来自IIS的出站流量遵循正常路径和规则,作为来自PC/服务器上所有进程的出站连接。

在IIS中避免此问题的一般标准是使用SSL和主机头名称。这样,您就可以在同一IP地址上托管多个站点,或者实际上您是入站地址不可知的,这意味着您的配置可以轻松地移植到其他主机,而不必处理多个物理或虚拟IP地址。

根据强制Windows服务器使用特定传出IP地址的建议,您可以使用powershell排除特定IP地址用作外部源。

假设您想要成为主要的IP地址是192.168.33.129。

$primaryIP = "192.168.0.4"
Set-NetIPAddress -IPAddress $primaryIP -SkipAsSource $false
Get-NetAdapter | Get-NetIPAddress | ? { $_.IPAddress -ne $primaryIP } | % {
Set-NetIPAddress -IPAddress $_.IPAddress -SkipAsSource $true
}

现在所有的IP地址,除了您指定为";初级;将被排除在首要考虑之外。我们可以使用…来验证这一点。。。

Get-NetAdapter | Get-NetIPAddress | Select-Object IPAddress,SkipAsSource

还必须指出,IIS主机外部的通信可以通过VPN和防火墙进行路由,即使您设法修复了内部IIS服务器出站IP地址,外部站点仍然会在NIC上注册网络的外部IP地址,而不是内部192.168.0.4

大多数企业防火墙都能够配置源NAT(SNAT(规则或策略,有时称为多路径路由,这将允许您绕过或否定IIS NIC上的任何配置,如上所述。