【问题标题】:Azure Hybrid Connection to HTTP Service与 HTTP 服务的 Azure 混合连接
【发布时间】:2017-06-19 04:54:29
【问题描述】:

我已成功创建混合连接 (ServerA) 并将其链接到我的 Azure Web 应用程序。状态连接成功:ServerB:1010 is defined

在我的本地计算机 (ServerA) 上,我可以连接到在 ServerB:1010 上运行的 HTTP 服务,但由于其他限制,我无法在 ServerB 上安装混合连接管理器。

如果我在 Azure Web App 中使用 WebClient.UploadData('ServerB:1010', data[]),我会收到以下错误。

无法连接到远程服务器 ---> System.Net.Sockets.SocketException: 尝试以访问权限禁止的方式访问套接字。

如果我连接到也可以从该服务器访问的数据库服务器 MySql 或 Oracle,我没有任何问题

【问题讨论】:

    标签: azure azure-web-app-service


    【解决方案1】:

    我已成功创建混合连接 (ServerA) 并将其链接到我的 Azure Web 应用程序。

    删除它并改为添加到 服务器 B 的混合连接。在服务器 A 上安装混合连接管理器。 HCM 将充当反向代理。

    混合连接不关心哪个服务器安装了 HCM,只要该服务器可以访问您在 新建 > 混合连接门户刀片中指定的 DNS 名称。

    WebClient.UploadData('ServerB:1010', data[]) 的流量示例:

    Web App ---> Hybrid Connection ---> HCM on Server A ---> 1010/TCP on Server B.
            <---                   <---                 <---
    

    有一种更简单的测试方法。打开 Kudu 控制台并执行

    tcpping ServerB:1010
    

    更正:tcpping 测试非常具有误导性,因为您正在握手混合连接的 Azure 端,而不是本地应用程序的 TCP 端点。即使本地的东西没有连接,这可能会很高兴地回复你。这就是我的意思:

    始终在应用层进行测试(例如,使用来自 Kudu Consolecurl.exe http://webservice.corp.local

    您必须使用名称而不是 IP 地址。使用完整的 FQDN 在门户设置和代码中引用 ServerA 和 ServerB。混合连接的工作原理是在操作系统级别拦截 DNS 调用并将它们解析到神奇的 127.0.0.x,然后通过混合连接路由到本地。

    TL;DR 版本:

    代替

    10.10.10.2:1010
    

    使用

    ServerB.domain.local:1010
    

    在门户设置中以及在您的代码中引用本地主机时。

    如果您使用 IP 地址而不是名称,会发生以下情况:

    在 Kudu 的 DebugConsole 中:

    D:\home>nameresolver 192.168.0.4
    Server: Default
    
    Non-authoritative answer:
    Name: 192.168.0.4
    Addresses:  127.0.0.3
    
    
    D:\home>tcpping 192.168.0.4:80
    Connection attempt failed: An attempt was made to access a socket in a way forbidden by its access permissions 192.168.0.4:80
    Connection attempt failed: An attempt was made to access a socket in a way forbidden by its access permissions 192.168.0.4:80
    Connection attempt failed: An attempt was made to access a socket in a way forbidden by its access permissions 192.168.0.4:80
    Connection attempt failed: An attempt was made to access a socket in a way forbidden by its access permissions 192.168.0.4:80
    Complete: 0/4 successfull attempts (0%). Average success time: 0ms
    
    
    D:\home>curl -s 192.168.0.4
    This is iisstart.htm from IIS 8.5 on Windows Server 2012 R2, on-prem.
    

    因此,根据您调用的 API(将 192.168.0.4 作为 FQDN 与 IP 地址的 API),它有点可以工作。

    【讨论】:

    • 感谢您的回复。这就是我所做的,但也许我的解释不是那么清楚。混合连接安装在服务器 A 上。我可以在服务器 A telnet ServerB 1010 上运行,并且它正在运行。当应用程序在服务器 A 上运行时,我可以毫无问题地使用连接 String ServerB 1010。感谢 kudu 的提示,但我也得到了同样的消息连接尝试失败:尝试以一种被其访问权限 SererB:1010 禁止的方式访问套接字
    • nameresolver.exe ServerB 在 Kudu 中给你什么?它应该解析为 127.0.0.x。
    • ServerA 上的 Get-HybridConnection | fl 应该说“在线”。
    • 我在混合连接设置中使用 IP 地址。 ServerB(10.10.10.2:1010) 是更好解释它的同义词。
    • 你的问题。您必须使用名称而不是 IP 地址。使用完整的内部 FQDN 在门户设置和代码中引用 ServerA 和 B。 HC 的工作原理是在操作系统级别拦截 DNS 调用并将它们解析为魔术 127.0.0.3,然后通过 HC 路由。
    【解决方案2】:

    您不能将 tcpping 与混合连接一起使用。它并没有真正告诉你任何事情。所有这一切都告诉您,您点击了本地套接字,该套接字将捕获您的 TCP 流量前往您的 HC 端点。它实际上并没有通过连接。

    就混合连接使用 IPv4 地址而言,它可以工作,但有时却不能。原因是该功能通过捕获 DNS 请求来发挥作用。如果您在应用程序代码中使用的客户端库不对 IP 地址进行 DNS 查找,则它不会通过混合连接。

    DNS 名称必须从运行混合连接管理器的主机解析为正确的 IP 地址。

    转到最初的问题,您需要为 ServerB 端口 1010 的端点定义一个混合连接。用于 ServerB 的 DNS 名称必须从运行 HCM 的主机解析。您的 HCM 需要对 ServerB 端口 1010 和 Azure 的网络访问。您的状态显示为已连接,这意味着您的 Web 应用程序可以与该端点的混合连接管理器对话。因此,测试从运行 HCM 的主机到所需的主机:端口端点的连接。如果可以,请使用 DNS 名称。我希望这可以解除对您的阻止。

    【讨论】:

    • 谢谢克里斯蒂娜!您对tcpping 和 HC 提出了非常重要的观点,我不知道这种行为。 TCP 握手始终有效,因为 Web App -> Biztalk 中的 HC 端点 始终处于连接状态,因此无论 Biztalk -> on-prem 通道是什么,它都会握手 TCP正在做。这种说法正确吗?
    • @ChristinaCompy 如果我尝试向端口 443 上的本地 API 发出请求怎么办?在我的 HC 配置中,我在端口 443 上定义了一个类似“server.fqdn.org”的端点。我的应用程序要求所有 curl 请求都通过 https 发出。 HC 知道这将是一个 https 请求吗?
    猜你喜欢
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    相关资源
    最近更新 更多