概述
VKProxy 是使用c#开发的基于 Kestrel 实现 L4/L7的代理
为何基于 Kestrel
主要是http 协议的处理实在太多了,工作量巨大,所以为了省事就基于 Kestrel 了
不过众所周知 Kestrel 是 Aspnetcore 为了跨平台而实现的web server,只提供 http 1/2/3 的 L7层的能力
但看过源码的同学都知道,其实其本身从L4层(socket)实现的Http协议处理,只是OnBind只有http相关实现以及没有提供相关公开扩展的api,所以限制了其能力
但是既然代码是开源的,并且我们也知道dotnet有虽然麻烦但是能跨越访问限制的能力(Reflection),所以它是不能阻挡我们的魔爪
(ps 1. 不过这样绕过限制可能会在Native AOT相关场景存在问题,目前暂时没有做具体相关测试 2. 在不同版本Kestrel 可能会存在api变动,目前为了省事,不适配各版本差异,暂时以net9.0为准,net10正式发布后迁移升级到net10,此后不再适配net9.0之前版本 )
局限
不得不先提一个局限,dotnet 的socket 没有提供统一的跨进程socket转移api,因为dotnet是跨平台的,不同系统存在差异,该issue Migrate Socket between processes 已经多年没有下文了
所以不好做到热重启,暂时不会支持
不过内部有支持监听配置变动,进行相关监听端口变动处理等,所以大部分场景应该没有太大问题,只是无法保持tcp连接迁移
功能
- [X] TCP proxy
- [X] UDP proxy
- [X] HTTP1/2/3 proxy
- [X] SNI proxy (no tls handle, tls base on upstream)
- [X] SNI proxy (tls handle, upstream no tls handle)
- [X] dns (use system dns, no query from dns server )
- [X] LoadBalancingPolicy
- [X] Passive HealthCheck
- [X] TCP Connected Active HealthCheck
- [X] Configuration
- [X] reload config and rebind
- [X] socks5 TCP
- [X] NO AUTH
- [X] simple user/password auth
- [X] socks5 UDP
- [X] Http Active HealthCheck
- [X] socks5(tcp) to websocket to socks5