问题描述

使用 Azure 虚拟网络,Azure APIM 可以管理无法通过 Internet 访问的 API,达到以保护企业内部的后端API的目的。在虚拟网络中,启用网络安全组(NSG:Network Security Group)来控制出站,入站的端口,我们可以形象的把它比喻成一道门,需要满足条件的流量才能通过这道安全的大门。

通过安全大门以后,我们就需要有路,才能达到目的。而默认的网络路径由Azure的骨干网络控制,如果需要通过公司自己的防火墙(Azure Firewall或企业自己的防火墙)。在虚拟网络中,通过路由表(Route Table)来指定下一跳(Next Pod),通过使用0.0.0.0/0的配置方式(UDRs:user-defined routes),把虚拟网络中的所有流量都导入并经过防火墙。实现企业级的安全保护。

以上两句总结起来就是:NSG是门,UDR是路。解决方案架构图为:

但是,在搭建APIM VNET时候,却遇见了各种各样的错误。

1)因为NSG的缘故,必须的端口不通。导致APIM的网络连接状态“Network connectivity status”页面中状态显示为 Error

2)因为配置了自定义路由(UDR), 导致了APIM页面中的APIs,Repository等页面错误,且门户一直弹出Failed to connect to management endpoint错误消息

问题分析

首先:以上的两个问题,都可以在" 如何将 Azure API 管理与虚拟网络配合使用:常见网络配置问题 "一文中找到答案。

问题一端口问题:添加上文档中所列出的所有必要端口,就可以实现网络连接状态全部Success的状态。

API 管理所需的端口:可以使用 网络安全组控制其中部署了 API 管理的子网的入站和出站流量。 如果其中的任一端口不可用,API 管理可能无法正常工作且不可访问。 将 API 管理与 VNET 配合使用时,另一个常见的错误配置问题是阻止了这些端口中的一个或多个。

VNET 中托管 APIM服务实例时,将使用下表中的端口。

源/目标端口 方向 传输协议 服务标记
源/目标
目的 (*) 虚拟网络类型
* / [80], 443 入站 TCP INTERNET/VIRTUAL_NETWORK 客户端与 API 管理的通信 外部
* / 3443 入站 TCP ApiManagement / VIRTUAL_NETWORK Azure 门户和 PowerShell 的管理终结点 外部和内部
* / 443 出站 TCP VIRTUAL_NETWORK / Storage 与 Azure 存储的依赖关系 外部和内部
* / 443 出站 TCP VIRTUAL_NETWORK / AzureActiveDirectory Azure Active Directory 和 Azure KeyVault 依赖项 外部和内部
* / 1433 出站 TCP VIRTUAL_NETWORK / SQL 访问 Azure SQL 终结点 外部和内部
* / 443 出站 TCP VIRTUAL_NETWORK / AzureKeyVault 访问 Azure KeyVault 外部和内部
* / 5671, 5672, 443 出站 TCP VIRTUAL_NETWORK / EventHub 事件中心策略日志和监视代理的依赖项 外部和内部
* / 445 出站 TCP VIRTUAL_NETWORK / Storage 与适用于 GIT 的 Azure 文件共享的依赖关系 外部和内部
* / 443, 12000 出站 TCP VIRTUAL_NETWORK / AzureCloud 运行状况和监视扩展 外部和内部
* / 1886、443 出站 TCP VIRTUAL_NETWORK / AzureMonitor 发布诊断日志和指标资源运行状况和 Application Insights 外部和内部
* / 25、587、25028 出站 TCP VIRTUAL_NETWORK/INTERNET 连接到 SMTP 中继以发送电子邮件 外部和内部
* / 6381 - 6383 入站和出站 TCP VIRTUAL_NETWORK/VIRTUAL_NETWORK 访问 Redis 服务以获取计算机之间的缓存策略 外部和内部
* / 4290 入站和出站 UDP VIRTUAL_NETWORK/VIRTUAL_NETWORK 同步用于计算机之间的速率限制策略的计数器 外部和内部
* / * 入站 TCP AZURE_LOAD_BALANCER/VIRTUAL_NETWORK Azure 基础结构负载均衡器 外部和内部

配置完成NSG后,一定要记住,在APIM中去Apply Network Configration,以实现网络配置双边同步。

问题二自定义路由问题:情况要复杂一些。需要开启服务终结点,在路由表中放行所在中国区的IP地址(控制平面 IP 地址

使用 Express Route 或网络虚拟设备强制隧道流量发往本地防火墙:客户的常用配置是定义自己的默认路由 (0.0.0.0/0),强制来自 API 管理所委托子网的所有流量流经本地防火墙或流向网络虚拟设备。 此流量流一定会中断与 Azure API 管理的连接,因为出站流量会在本地被阻止,或者通过“网络地址转换”功能发送到不再与各种 Azure 终结点一起工作的一组无法识别的地址。

此解决方案要求执行以下三项操作:

第一项:在部署 API 管理服务的子网上启用服务终结点。 需为 Azure SQL、Azure 存储、Azure 事件中心和 Azure 服务总线启用服务终结点。 直接从 API 管理委托的子网启用这些服务的终结点可以让它们使用 Azure 主干网络,为服务流量提供优化的路由。 如果将服务终结点与强制隧道 API 管理配合使用,则不会将上述 Azure 服务流量进行强制隧道传输。 其他 API 管理服务依赖项流量会通过强制隧道重定向,不能丢失,否则 API 管理服务会功能失常。

第二项:所有控制平面流量(从 Internet 到 API 管理服务的管理终结点)都会通过特定的一组由 API 管理托管的入站 IP 进行路由。 当流量被强制进行隧道传输时,响应不会对称地映射回这些入站源 IP。 为了克服此限制,我们需要添加以下用户定义的路由 (UDR),通过将这些主机路由的目标设置为“Internet”来将流量传回 Azure。 用于控制平面流量的入站 IP 集是记录在案的控制平面 IP 地址

第三项:对于被强制进行隧道传输的其他 API 管理服务依赖项,应该有一种方法来解析主机名并访问该终结点。 其中包括:

  • 指标和运行状况监视:到 Azure 监视终结点的出站网络连接,可在内网中解析,这些 URL 在 AzureMonitor 服务标记下表示,用于网络安全组。
        1. mooncake.warmpath.chinacloudapi.cn
        2. global.prod.microsoftmetrics.com(新增)
        3. shoebox2.prod.microsoftmetrics.com(新增)
        4. shoebox2-red.prod.microsoftmetrics.com
        5. shoebox2-black.prod.microsoftmetrics.com
        6. shoebox2-red.shoebox2.metrics.nsatc.net
        7. shoebox2-black.shoebox2.metrics.nsatc.net
        8. prod3.prod.microsoftmetrics.com(新增)
        9. prod3-red.prod.microsoftmetrics.com
        10. prod5.prod.microsoftmetrics.com
        11. prod5-black.prod.microsoftmetrics.com
        12. prod5-red.prod.microsoftmetrics.com
        13. gcs.prod.warm.ingestion.monitoring.azure.cn
  • Azure 门户诊断:若要在从虚拟网络内部使用 API 管理扩展时从 Azure 门户启用诊断日志流,需要允许在端口 443 上对 dc.services.visualstudio.com 进行出站访问。
  • SMTP 中继  :在主机 smtpi-co1.msn.comsmtpi-ch1.msn.comsmtpi-db3.msn.comsmtpi-sin.msn.comies.global.microsoft.com 下解析的 SMTP 中继的出站网络连接
  • 开发人员门户验证码:在主机 client.hip.live.com 和 partner.hip.live.com 下解析的开发人员门户 CAPTCHA 的出站网络连接。

问题解决

对比NSG列表,添加缺少的端口。特别是:1433,5671, 5672,12000,1886,25028, 6381 - 6383等不常配置的端口。

在Route Table中添加中国区两个被标记为全球的IP地址。这是必须的地址,也是在配置中常常忽略的问题。也是产生此问题的根源。

参考资料

在内部虚拟网络中使用 Azure API 管理服务:https://docs.azure.cn/zh-cn/api-management/api-management-using-with-internal-vnet

APIM常见网络配置问题:https://docs.azure.cn/zh-cn/api-management/api-management-using-with-vnet#common-network-configuration-issues

【Azure API 管理】APIM集成内网虚拟网络后,启用自定义路由管理外出流量经过防火墙(Firewall),遇见APIs加载不出来问题的更多相关文章

  1. 【Azure 应用服务】App Service与APIM同时集成到同一个虚拟网络后,如何通过内网访问内部VNET的APIM呢?

    问题描述 App Service访问的APIM已配置内部虚拟网络(Internal VNet)并拥有内网IP地址.App Service与APIM都在相同的虚拟网络(VNET)中.App Servic ...

  2. 【Azure API 管理】Azure APIM服务集成在内部虚拟网络后,在内部环境中打开APIM门户使用APIs中的TEST功能失败

    问题描述 使用微软API管理服务(Azure API Management),简称APIM. 因为公司策略要求只能内部网络访问,所以启用了VNET集成.集成方式见: (在内部模式下使用 Azure A ...

  3. 云计算之路-试用Azure:搭建自己的内网DNS服务器

    之前我们写过一篇博文谈到Azure内置的内网DNS服务器不能跨Cloud Service,而我们的虚拟机部署场景恰恰需要跨多个Cloud Service,所以目前只能选择用Azure虚拟机搭建自己的内 ...

  4. VMware下CentOS7安装后,还原虚拟网络后,敲ifconfig不显示局域网ip解决方法

    VMware下CentOS7安装后,还原虚拟网络后,敲ifconfig不显示局域网ip,没有出现eth0网卡,不能上网,SSH不能连接,输入ifconfig后如下图: 解决方法: 1.编辑网卡的配置文 ...

  5. WinServer 之 内网发布网站后端口映射外网访问

    内网IP只能在内网局域网访问连接,在外网是不能认识内网IP不能访问的.如有路由权限,且路由有固定公网IP,可以通过路由的端口映射,实现外网访问内网.如无路由,或路由无公网IP,需要用到第三方开放的花生 ...

  6. 典型案例收集-使用OpenVPN连通多个机房内网(转)(静态路由)

    说明: 1.这篇文章主要是使用静态路由表实现的多个机房通过VPN连接后的子网机房互通. 2.OpenVPN使用的是桥接模式(server-bridge和dev tap),这个是关键点,只有这样设置才可 ...

  7. windows(Linux)创建”内网穿透“工具(通过自定义域名访问部署于内网的 web 服务,可以用于调试微信支付,支付宝支付,微信公众号等开发项目)

    此方法需要自有服务器和域名,如果没有这些的开发者, 可以参考钉钉提供的内网穿透方式:https://www.cnblogs.com/pxblog/p/13862376.html 一.准备工作 1.域名 ...

  8. 基于frp的内网穿透实例2-通过自定义域名访问部署于内网的 web 服务

    原文地址:https://wuter.cn/1837.html/ 一.想要实现的功能 1.将部署在自己电脑上的网站用于公网访问. 2.将未备案域名解析至国内服务器(即我宿舍的老母鸡上). 二.服务端配 ...

  9. TP5验证码上传阿里云万网虚拟主机后,验证码不显示的解决办法

    TP5不显示验证码 清除缓冲区就应该可以了,今天我刚好也遇到了,解决的办法是在vendor/topthink/think-captcha/CaptchaController.php中加上这个ob_cl ...

随机推荐

  1. 异步阻塞,Manager模块,线程

    一.异步阻塞 1.并没有按照执行顺序等待结果 2.而是所有的任务都在异步执行着 3.但是我要的结果又不知道谁的结果先来,谁先结束我就先取谁的结果 很明显的异步,大家都相互执行着(异步过程),谁先结束我 ...

  2. 黄衫女子,黄衫好.png

    正想着团队项目中数据该如何解析,就收到了来自软工课程组的一件小黄衫,真是意外之喜.详问其来源,竟是因结对项目做的"较好"而来,顿感受之有愧. 结对项目是两人对文件系统的一个小模拟, ...

  3. 记一次 .NET 某HIS系统后端服务 内存泄漏分析

    一:背景 1. 讲故事 前天那位 his 老哥又来找我了,上次因为CPU爆高的问题我给解决了,看样子对我挺信任的,这次另一个程序又遇到内存泄漏,希望我帮忙诊断下. 其实这位老哥技术还是很不错的,他既然 ...

  4. LVS跨网段DR模型

    客户端IP地址:172.16.8.147 路由器服务器IP地址:172.16.8.167内网IP地址:192.168.1.3 一.将客户端的网关修改为路由服务器IP地址 vim ifcfg-ens33 ...

  5. QTableWidget - 基础讲解(1)

    转载:http://www.cnblogs.com/fuqia/p/8904196.html QTableWidget是QT程序中常用的显示数据表格的空间,很类似于VC.C#中的DataGrid.说到 ...

  6. 6T硬盘分区

    6T硬盘分区 1.umount /data1   #  如果正在使用需要此命令卸载. 2.parted /dev/sdb     # parted 分区工具,选择要分区的硬件设备 mklabel gp ...

  7. linux免密传输文件 nc

    nc命令很强大,用来在内网传输小文件也不错,最主要的是仅一次传输的情况下不需要用户和密码即可直接接受与发送文件 不管是linux2linux 还是 linux2windows皆可 先决条件: 1.使用 ...

  8. 本地软件仓库配置及NFS安装

    [root@localhost ~]# mount /dev/cdrom /mnt mount: /dev/sr0 is write-protected, mounting read-only [ro ...

  9. Python+Selenium学习笔记7 - os模块

    os模块是关于文件/目录方面的 导入语法 import os 相关方法 path.abspath()   用来获取当前路径下的文件 os.path.abspath('checkbox.html')  ...

  10. MSQL 数据完整性(约束)

    0. 前言 1. 实体完整性 1.1 主键约束(primary key) 1.2 唯一约束(unique) 1.3 自动增长列(auto_increment) 2. 域完整性 数据类型 非空约束 默认 ...