首页 > 其他分享 >http内网穿透CYarp[开源]

http内网穿透CYarp[开源]

时间:2024-03-19 22:22:24浏览次数:24  
标签:asp http netcore 中间件 穿透 CYarp 内网 客户端

0 前言

在物联网领域中,mqtt消息一直是海量设备连接到平台的标配协议,而平台向移动端开放的操作接口往往是http协议,这就要求平台为两种协议作消息一一适配。在某些情况下,这些设备是有操作系统的linux或安卓设备,如果我们换个思路,让这些设备直接提供http协议的操作接口(httpd服务器),平台端使用隧道打通设备与移动端的传输层,做为平台开发人员,就可以省去时间做这些繁琐的消息级别的一一适配工作了。

1 面临的问题

1.1 海量连接

mqtt默认基于tcp传输,一台设备与平台维持一个tcp连接即可高效的上下并行传输消息。而http/1.1在协议层限制了单个连接串行请求响应,但我们可以使用http/2.0或http/3.0做为http/1.1的传输层,也能达到一个物理链接多路传输http/1.1的目的。这样下来内网http/1.1穿透也和mqtt一样,只需要一个物理长连接。

1.2 身份认证

我尝试使用frp来承载物联网设备的http内网穿透,但至今还没成功完成海量设备的一机一密的身份认证,它里面的token认证方式只适合一平台对一个设备的安全要求,而OIDC验证我至今仍然看不明白怎么使用。对于一款内网穿透组件或应用,能像asp.netcore的身份验证强大,对平台端而言是非常需要的。

1.3 安全传输

设备内置的http服务器,一般都是没有https,因为它本身就不考虑公网传输的能力。但在内网穿透之后,我们必须要考虑设备到公网平台这段的传输安全。

1.4 开放协议

内网穿透组件涉及到平台的服务端和集成在设备里的客户端库,平台端一般只有二次开发的需求。而设备端由于芯片、系统和指令集、内存限制等等因素,只提供客户端库或二进制可执行文件是不够的,还可能需要客户端开发者根据交互协议来自行开发客户端组件。这就要求内网穿透组件提供客户端与服务端的交互协议,且最好是设计为非常简单的协议。

2 CYarp出场

CYarp基于Yarp的http内网穿透中间件,支持tcp、http/2.0或http/3.0作为http/1.1的传输层,其具有以下特征

  1. 是一个标准的asp.netcore中间件
  2. 能完整使用asp.netcore框架和其它中间件
  3. 使用服务端的tls(https)做为安全传输层
  4. 单连接多路复用,无需客户端提供http2服务器
  5. 协议透明简单,参考了WebSocket升级和Bootstrapping WebSockets with HTTP/2

2.1 服务端开发

CYarp中间件其依赖于Authentication身份认证中间件,使用如下方法进行注册和中间件的配置。

builder.Services.AddCYarp(cyarp=>
{
    ...
});

中间件配置顺序如下:

...
app.UseAuthentication();
...
app.UseCYarp();
...

最后在Controller、minapi的处理者或中间件中处理http转发

// 请求者的授权验证
[Authorize(Roles = "Mobile")]
public class CYarpController : ControllerBase
{ 
    private static readonly string clientIdClaimType = "ClientId";

    /// <summary>
    /// 处理cyarp
    /// 核心操作是从请求上下文获取clientId
    /// 然后使用clientId从clientManager获取client来转发http
    /// </summary>
    /// <param name="clientManager"></param>
    /// <returns></returns>
    [Route("/{**cyarp}")]
    public async Task InvokeAsync([FromServices] IClientManager clientManager)
    {
        var clientId = this.User.FindFirstValue(clientIdClaimType);
        if (clientId != null && clientManager.TryGetValue(clientId, out var client))
        {
            this.Request.Headers.Remove(HeaderNames.Authorization);
            await client.ForwardHttpAsync(this.HttpContext);
        }
        else
        {
            this.Response.StatusCode = StatusCodes.Status502BadGateway;
        }
    }
}

2.2 客户端开发

使用CYary.Client.CYarpClient很方便完成客户端开发

 using var client = new CYarpClient();
 while (true))
 {
     await client.TransportAsync(this.clientOptions.CurrentValue, stoppingToken).ConfigureAwait(ConfigureAwaitOptions.SuppressThrowing);
 }

2.3 客户端协议

由于篇幅有限,不在这里展开,可以查阅CYarp握手协议

3 同源产品

Yarp是dotnet平台下堪比nginx的一个组件,其它融入asp.netcore框架作为里面的中间件共享asp.netcore生态。

davidfowl大神也曾经小手一挥造就了YarpTunnelDemo项目,也是实现了http内网穿透的能力。但是他的实现方案要求客户端方能要运行asp.netcore监听做为客户端组件,由于asp.netcore的runtime只适配了桌面系统,且编译出的二进制文件很大,此方法自然无法在物联网设备中运行了。

标签:asp,http,netcore,中间件,穿透,CYarp,内网,客户端
From: https://www.cnblogs.com/kewei/p/18084123

相关文章

  • SQLServer CLR程序集创建Http函数
    设计程序集-SQLServer|MicrosoftLearnMicrosoft.VisualBasic.dllMicrosoft.VisualC.dllmscorlib.dllSystem.dllSystem.Configuration.dllSystem.Core.dllSystem.Data.dllSystem.Data.OracleClient.dllSystem.Data.SqlXml.dllSystem.Deployment.dllSyst......
  • 为什么说HTTPS比HTTP安全? HTTPS是如何保证安全的?
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助一、安全特性在上篇文章中,我们了解到HTTP在通信过程中,存在以下问题:通信使用明文(不加密),内容可能被窃听不验证通信方的身份,因此有可能遭遇伪装而HTTPS的出现正是解决这些问题,HTTPS是建立在SSL之上,其安全性由SSL......
  • 利用Scala与Apache HttpClient实现网络音频流的抓取
    概述在当今数字化时代,网络数据的抓取和处理已成为许多应用程序和服务的重要组成部分。本文将介绍如何利用Scala编程语言结合ApacheHttpClient工具库实现网络音频流的抓取。通过本文,读者将学习如何利用强大的Scala语言和ApacheHttpClient库来抓取网络上的音频数据,以及如......
  • go使用HTTP代理和SOCKS5代理的代码示例
    本文档为获取到代理IP后使用代理的代码样例,供开发者参考。代码样例直接运行无法得到正确的结果,因为代码中的代理地址/端口和应用账号密码等信息都是虚构的,您替换成自己真实的就可以正常运行了。如何获取代理地址/端口和设置代理授权?请参考:接入指南-快速入门使用前提:......
  • pc7层登录内网站点,pc端手动授权---对外
    1、https://idp.pre.eagleyun.cn/ui/idp-auth.html?app_id=xxxxxxxx&redirect_url=https%3A%2F%2Feagleyun.portal.pre.eagleyun.com%2F&portal_type=&ins_id=xxxxxxxxxxxxx2、wss://127.0.0.1:56300/ 101SwitchingProtocolsUpgrade和客户端通信拿到ticket3、https:/......
  • 借助HttpWebRequest 调用第三方接口,获取Token和数据
    在一次项目中,在给客户做系统时,需要调用客户的系统获取数据,客户提供了获取Token和获取数据的接口,用户名和密码,认证方式是基于Bearer的,通过学习和找资料,提供一个C#示例一个C#示例1、传入语句获取数据///<summary>///传入语句获取数据///</summary>......
  • 前端基础之HTTP协议介绍
    HTTP协议介绍HTTP协议(HyperTextTransferProtocol,超文本传输协议),用来规定服务端和浏览器之间的数据交互的格式,也是用于从万维网(WWW:WorldWideWeb)服务器传输超文本到本地浏览器的传送协议。该协议构建于TCP/IP协议族之上,属于应用层协议。主要用于传输与超文本相关的资源文件......
  • 什么是HTTP? HTTP 和 HTTPS 的区别?
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助一、HTTPHTTP (HyperTextTransferProtocol),即超文本运输协议,是实现网络通信的一种规范在计算机和网络世界有,存在不同的协议,如广播协议、寻址协议、路由协议等等......而HTTP是一个传输协议,即将数据由A传到B或......
  • 内网穿透你真的了解吗?
    内网穿透你真的了解吗?:https://blog.csdn.net/a410974689/article/details/128469490?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171075441916800185843061%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=171075441916800......
  • Python实现HTTPS网站证书过期监控及更新
    Python实现HTTPS网站证书过期监控及更新当前HTTP逐渐被大众所抛弃,HTTPS正在成为互联网上的主流。前段时间我们维护的一个HTTPS证书即将过期,由于多云环境比较复杂,团队小伙伴在替换更新证书的过程中出现疏漏,导致有一个域名证书没有及时更新,影响了系统可用性,为了杜绝这种问题再次发......