VKProxy

news/2025/10/15 8:54:25/文章来源:https://www.cnblogs.com/as199019/p/19142515

VKProxy 目前新添加了如下功能

会话亲和性
禁止http
静态内容
简单的waf
VKProxy 是使用c#开发的基于 Kestrel 实现 L4/L7的代理(感兴趣的同学烦请点个github小赞赞呢)

会话亲和性
会话亲和性是一种机制,用于将有因果关系的请求序列绑定到在多个目标之间均衡负载时处理第一个请求的目标。 在序列中的大多数请求处理相同数据以及处理请求的不同节点(目标)的数据访问成本不同的情况下,它很有用。 最常见的示例是暂时性缓存(例如内存中),其中第一个请求将数据从较慢的永久性存储提取到快速本地缓存中,而其他请求则只处理缓存的数据,从而增加吞吐量。

建立新的亲和性或解析现有的亲和性
请求到达并路由到启用了会话亲和性的群集后,代理会根据请求中的亲和性键的状态和有效性来自动决定是应建立新的亲和性,还是需要解析现有的亲和性,如下所示:

请求不包含密钥。 跳过解析,并与负载均衡器选择的目标建立新的亲和性

请求中已找到关联密钥,并且有效. 相关性机制会尝试查找与密钥匹配的第一个正常目标。

关联键无效或找不到正常健康的关联目标。 它被视为失败,并与负载均衡器选择的目标建立新的亲和性

如果为请求建立了新的相关性,则关联键会附加到响应,其中确切的键表示形式和位置取决于实现。 目前,有两个内置策略将密钥存储在cookie标头或自定义标头上。 将响应传递到客户端后,客户端负责将密钥附加到同一会话中的所有以下请求。 此外,当承载密钥的下一个请求到达代理时,它会解析现有相关性,但关联密钥不会再次附加到响应。 因此,只有第一个响应具有亲和性键。

有四种内置关联策略,这些策略在请求和响应上以不同的方式格式化和存储密钥。

HashCookie

策略使用 XxHash64 哈希为 cookie 值生成快速、紧凑、不明确的输出格式。

请求的键将作为具有配置名称的 cookie 进行传递,并在关联序列中的第一个响应上使用 cookie 标头设置相同的 Set-Cookie。

ArrCookie

策略使用 SHA-256 哈希为cookie值生成模糊输出。

请求的键将作为具有配置名称的 cookie 进行传递,并在关联序列中的第一个响应上使用 cookie 标头设置相同的 Set-Cookie。

Cookie

策略使用数据保护来加密密钥

请求的键将作为具有配置名称的 cookie 进行传递,并在关联序列中的第一个响应上使用 cookie 标头设置相同的 Set-Cookie。

CustomHeader

策略使用数据保护来加密密钥,将密钥存储为加密标头。 它要求在具有已配置名称的自定义标头中传递关联键,并在关联序列中的第一个响应上设置相同的标头。

由于 header 不具备 cookie 这般在浏览器等有内置附加在请求处理的逻辑,需要用户自行处理附加在后续的请求中。所以优先使用 cookie的方式

设置项
大家可以可以在cluster的Metadata 设置SessionAffinity 为 HashCookie/ArrCookie/Cookie/CustomHeader 其一来启用会话亲和性

CustomHeader

当 SessionAffinityKey 有设置时,其值将作为 header name,否则将默认采用 x-sessionaffinity

HashCookie/ArrCookie/Cookie

当 SessionAffinityKey 有设置时,其值将作为 cookie name,否则将默认采用 SessionAffinity

而如下设置可以用于控制 cookie

CookieDomain

获取或设置要与 Cookie 关联的域。

CookieExpires

获取或设置 Cookie 的到期日期和时间。

CookieExtensions

获取要追加到 Cookie 的其他值的集合。

CookieHttpOnly

获取或设置一个值,该值指示客户端脚本是否无法访问 Cookie。 不设置则默认为 true

CookieIsEssential

指示此 Cookie 是否对应用程序正常运行至关重要。 如果为 true,则可以绕过同意策略检查。 默认值为 false。

CookieMaxAge

获取或设置 Cookie 的最大期限。

CookiePath

获取或设置 Cookie 路径。 不设置则默认为"/"

CookieSameSite

获取或设置 Cookie 的 SameSite 属性的值。 默认值为 Unspecified

CookieSecure

获取或设置一个值,该值指示是否使用安全套接字层(SSL)(即仅通过 HTTPS 传输 Cookie)。

配置示例:

{
"ReverseProxy": {
"Routes": {
"a": {
"Order": 0,
"Match": {
"Hosts": [ "api.com" ],
"Paths": [ "*" ]
},
"ClusterId": "apidemo",
"Metadata": {
"MirrorCluster": "apidemoMirror"
}
}
},
"Clusters": {
"apidemo": {
"LoadBalancingPolicy": "RoundRobin",
"Metadata": {
"SessionAffinity": "Cookie",
"CookieExpires": "00:00:13"
},
"Destinations": [
{
"Address": "https://xxx.lt"
},
{
"Address": "https://xxx1.lt"
},
{
"Address": "https://xxx2.lt"
}
]
}
}
}
}
禁止http
有一些原因需要我们禁用 HTTP(即只允许 HTTPS,不允许明文 HTTP),比如:

数据加密安全
HTTP 传输的数据是明文的,容易被窃听、篡改和中间人攻击。而 HTTPS 使用 TLS/SSL 加密,能保护数据在传输过程中的安全性和隐私性。

身份验证
HTTPS 通过证书机制可以验证服务器身份,防止被钓鱼网站冒充。HTTP 无法保证你访问的是“真实”的服务器。

数据完整性
通过 HTTPS 传输的数据无法被中途篡改,而 HTTP 没有任何防护,容易被劫持或修改内容。

合规要求
许多法律法规(如GDPR、PCI DSS等)要求必须加密用户敏感数据的传输,明文 HTTP 不符合这些合规要求。

浏览器政策
现代主流浏览器(如 Chrome、Firefox)对 HTTP 网站会高亮“不安全”,甚至屏蔽部分功能,如获取地理位置、摄像头、麦克风等。部分浏览器或 API 也要求强制使用 HTTPS。

SEO 优势
搜索引擎(如 Google)会优先收录和排名 HTTPS 网站,禁用 HTTP 有助于提升网站权重。

所以VKProxy 提供了非常简单的强制重定向功能

设置项
大家可以可以在cluster的Metadata 设置OnlyHttps 为 "true" 来启用

配置示例:

{
"ReverseProxy": {
"Routes": {
"a": {
"Order": 0,
"Match": {
"Hosts": [ "api.com" ],
"Paths": [ "*" ],
"Statement": "Header('x-env') = 'test'"
},
"ClusterId": "ClusterA",
"Metadata": {
"OnlyHttps": "true"
}
}
}
}
}
实现其实非常简单
public class OnlyHttpsFunc : IHttpFunc
{
public int Order => -1000;

public RequestDelegate Create(RouteConfig config, RequestDelegate next)
{if (config.Metadata == null || !config.Metadata.TryGetValue("OnlyHttps", out var v) || !bool.TryParse(v, out var b) || !b) return next;return c =>{if (c.Request.IsHttps){return next(c);}else{c.Response.Redirect($"https://{c.Request.Host}{c.Request.GetEncodedPathAndQuery()}", true);return c.Response.CompleteAsync();}};
}

}
静态内容
有很多时候我们需要临时或者不同环境添加一些不同内容,

比如 robots.txt

在开发阶段,多半不会有人考虑这东西,多半都是遇到一些问题后才会调整这些东西,但是通常这时候调整程序就显得杀鸡用牛刀了

所以 VKProxy 就提供了一个简单的功能,可以随时添加一些静态响应内容

设置项
大家可以可以在cluster的Metadata 设置

xxx_Content

xxx 可以任意命名,只要不重复就好

内容即为响应body

xxx_ContentType

xxx_Content 对应的 ContentType, 不设置默认为 text/plain

xxx_ContentWhen

xxx_Content 对应的 条件筛选 比如 Path = '/robots.txt' 意味着只有url为 /robots.txt才能匹配,具体配置可参考如何为HTTP配置路由复杂匹配

配置示例:

{
"ReverseProxy": {
"Routes": {
"a": {
"Order": 0,
"Match": {
"Hosts": [ ".com" ],
"Paths": [ "
" ]
},
"ClusterId": "ClusterA",
"Metadata": {
"robots_Content": "User-agent: \r\n*Allow: /\r\nSitemap: https://www.xxx.com/sitemap.xml",
"robots_ContentType": "application/text",
"robots_ContentWhen": "Path = '/robots.txt'"
}
}
}
}
}
简单的waf
WAF 是一种专门用于保护 Web 应用程序的安全防护。它通过检测、过滤和拦截进出 Web 应用的 HTTP/HTTPS 流量,防止常见的 Web 攻击,比如:

SQL 注入(SQL Injection)
跨站脚本攻击(XSS, Cross-Site Scripting)
文件包含漏洞
远程命令执行
等等
VKProxy 肯定无法做到专业级别的防护(毕竟俺不是吃这一口饭的,没必要没钱还去撞个头破血流),只提供基本功能:用户可以设置基本的匹配规则限制相应的请求。

这样没钱没精力的用户可以优先不修改程序的场景临时做一些简单的处理,

比如 wordpress 搭建的站点都有管理页面 yourdomain.com/wp-admin, 你并不想暴露这些地址到外网

设置项
大家可以可以在cluster的Metadata 设置

xxx_waf

xxx 可以任意命名,只要不重复就好

配置内容即为条件筛选 比如 Path = '/robots.txt' 意味着只有url为 /robots.txt才能匹配,具体配置可参考如何为HTTP配置路由复杂匹配

只有匹配就会直接返回 403, 不再转发到后端服务器

配置示例:

{
"ReverseProxy": {
"Routes": {
"a": {
"Order": 0,
"Match": {
"Hosts": [ ".com" ],
"Paths": [ "
" ]
},
"ClusterId": "ClusterA",
"Metadata": {
"noadmin_waf": "Path = '/wp-admin'"
}
}
}
}
}
VKProxy 是使用c#开发的基于 Kestrel 实现 L4/L7的代理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/937243.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025 年手套箱厂家推荐排行榜,惰性气体/真空/氮气/防护手套箱厂家推荐

在半导体、光电子、新能源等关键领域,手套箱是维持特殊生产与实验环境的核心设备,其质量直接决定下游产业的生产效率与产品品质。当前市场上手套箱厂家数量繁杂,产品质量差距悬殊,部分厂家存在技术落后、设备稳定性…

服务没有及时响应启动或控制请求

最近由于电脑环境有问题重装了下电脑系统,重装系统后在安装sql server的时候,前面都没有问题sqlserver安装防火墙警告 除了有个防火墙警告,看到“上面提示操作完成。已通过4。失败0。警告1。已跳过0”,警告警告呗,…

【日记】央视不要我,笑死(1672 字)

正文今天这个天黑得,像是有十万天兵天将要下来了似的。这两天还发生了蛮多的事情。首先,央视不要我了哈哈哈哈哈。也不知道头天晚上跟父母吵架吵个什么劲。都不按预期来走的。昨天晚上七点多钟,原来经常跳舞的朋友突…

无心插柳柳成荫/万能的添加地址模块/一个播放地址带上各种参数

一、前言说明 之前整个视频拉流播放组件,已经实现了一个url地址带上各种参数,这样可以涵盖所有可能的应用场景,比如rtsp视频流指定tcp方式采集,本地摄像头指定分辨率帧率格式,桌面采集指定屏幕索引和区域,保存视…

构造专题 #2

构造专题 #2 Problem A. UOJ460 新年的拯救计划 显然有上界 \(m=\lfloor\frac n 2 \rfloor\)。 增量构造,每次让 \(n\) 增加 \(2\)。若 \(n\) 为奇数则每棵树随便向 \(n\) 连一条边即可。 首先令第 \(i\) 个原树的 \…

HarmonyOS 详细安装第三方库的流程与注意

1、在终端面板中执行ohpm install @ohos/lottie,注意要写ohpm install;

瑜伽馆会员约课小程序页面功能梳理 - 教程

瑜伽馆会员约课小程序页面功能梳理 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…

2025-10-14

2025-10-14ELF文件的结构网上有很多教程,这里先只记录如何从ELF文件构建地址-函数名。 首先从ELF Header获取section header表的偏移,section header Elf32_Ehdr header; ... fread(&header,sizeof(ELF32_Ehdr),…

MySQL笔记---表的约束 - 实践

MySQL笔记---表的约束 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…

深入解析:Atlas Mapper 教程系列 (8/10):性能优化与最佳实践

深入解析:Atlas Mapper 教程系列 (8/10):性能优化与最佳实践2025-10-15 08:27 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !impor…

新买的笔记本电脑如何将旧笔记本数据迁移完整迁移克隆过来?买了新电脑,旧电脑大量数据如何迁移?

简单说,固态硬盘(SSD)和机械硬盘(HDD)就像两种“装东西的盒子”,区别主要在“取东西快不快”“结不结实”“贵不贵”这几点,用老百姓的话讲更直白:机械硬盘(HDD):像家里的“老式抽屉柜”,要拿东西得先拉开…

Nginx proxy_pass 末尾斜杠(/) - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

反射型XSS与自反型XSS深度解析

本视频深入探讨了反射型XSS和自反型XSS漏洞的区别与危害,通过实际案例演示如何识别和利用这些漏洞,并解释了为什么看似简单的漏洞却能带来高额赏金回报。反射型XSS与自反型XSS 视频概览发布时间:2025年8月12日 观看…

Markdown 是一种「用肉眼就能看懂」标记语言

Markdown 是一种「用肉眼就能看懂」的纯文本标记语言。 它的设计哲学只有一句话:让源文件本身就能读,同时让机器一键转成漂亮的 HTML/PDF/Word 等格式。 核心特点语法只占用了键盘上最常见的符号(# * _ > [] ()…

实用指南:oracle linux 10 +pg18 源码安装要点

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Java 与智慧能源:分布式能源与智能电网管理

一、引言 能源是社会发展的基础动力。随着 全球能源转型、碳中和目标、可再生能源普及,传统电力系统正经历深刻变革。分布式能源、智能电网、储能与能源互联网 已成为未来能源发展的核心方向。 然而,能源系统面临的挑…

PHP 真异步 TrueAsync SAPI 与 NGINX Unit 集成

PHP "真异步" TrueAsync SAPI 与 NGINX Unit 集成 现在的 Web 开发和过去最大的区别是什么?一句话:没人再愿意等服务器响应了。 七八年前,甚至更早的时候,模块加载、组件打包、脚本解释、数据库查询——…

Qt下设置Linux系统时间

Qt下设置Linux系统时间include <sys/time.h> bool SysTime(int nYear,int nMonth,int nDay,int nHours,int nMin,int nSecond) { QDateTime dateTime; dateTime.setDate(QDate(nYear, nMonth, nDay)); dateTime…

GitHub Spark引领Vibe编程与AI技术新趋势

本期节目探讨GitHub推出的Vibe编程工具Spark如何通过自然语言开发全栈应用,分析AI编码工具的数据安全问题,介绍科学推理与代码性能优化新数据集,并解读美国AI行动计划的技术战略布局。工具与应用某中心推出Vibe编程…

详细介绍:如何在 Apache 中启用 HSTS 以增强网络安全性 ?

详细介绍:如何在 Apache 中启用 HSTS 以增强网络安全性 ?pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consol…