如何通过websocket实现基于socks5的网络穿透?
摘要:有盆友好奇所谓的网络穿透是怎么做的 然后talk is cheap,please show code 所以只好写个简单且常见的websocket例子, 这里的例子大致是这个原理 浏览器插件(或者其他)首先将正常访问请求 --&
有盆友好奇所谓的网络穿透是怎么做的
然后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
