如何通过websocket实现基于socks5的网络穿透?

摘要:有盆友好奇所谓的网络穿透是怎么做的 然后talk is cheap,please show code 所以只好写个简单且常见的websocket例子, 这里的例子大致是这个原理 浏览器插件(或者其他)首先将正常访问请求 --&amp
有盆友好奇所谓的网络穿透是怎么做的 然后talk is cheap,please show code 所以只好写个简单且常见的websocket例子, 这里的例子大致是这个原理 浏览器插件(或者其他)首先将正常访问请求 --> 转换为socks5访问 --> 假代理服务器建立websocket链接,然后传输socks5协议数据 --> 允许websocket的网关由于不解析websocket数据而不知道是socks5所以未做拦截 --> 真代理服务器从websocket中解析socks5进行转发处理 代码如下 Socks5 --> websocket 端 internal class Socks5ToWSMiddleware : ITcpProxyMiddleware { private readonly IForwarderHttpClientFactory httpClientFactory; private readonly ILoadBalancingPolicyFactory loadBalancing; private readonly ProxyLogger logger; private readonly TimeProvider timeProvider; public Socks5ToWSMiddleware(IForwarderHttpClientFactory httpClientFactory, ILoadBalancingPolicyFactory loadBalancing, ProxyLogger logger, TimeProvider timeProvider) { this.httpClientFactory = httpClientFactory; this.loadBalancing = loadBalancing; this.logger = logger; this.timeProvider = timeProvider; } public Task InitAsync(ConnectionContext context, CancellationToken token, TcpDelegate next) { // 过滤符合的路由配置 var feature = context.Features.Get<IL4ReverseProxyFeature>(); if (feature is not null) { var route = feature.Route; if (route is not null && route.Metadata is not null && route.Metadata.TryGetValue("socks5ToWS", out var b) && bool.TryParse(b, out var isSocks5) && isSocks5) { feature.IsDone = true; route.ClusterConfig?.InitHttp(httpClientFactory); return Proxy(context, feature, token); } } return next(context, token); } private async Task Proxy(ConnectionContext context, IL4ReverseProxyFeature feature, CancellationToken token) { // loadBalancing 选取有效 ip var route = feature.Route; var cluster = route.ClusterConfig; DestinationState selectedDestination; if (cluster is null) { selec
阅读全文