VKProxy新增一些功能
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的代理(感兴趣的同学烦请点个github小赞赞呢)
VKProxy新增一些功能的更多相关文章
- sns社交系统ThinkSNS+ 更新至V0.8.2,新增圈子功能
sns社交系统"ThinkSNS+"于7月15日发布了V0.8.0,含开源版本web+H5,及Android APP和iOS APP客户端. V0.8.2版本将于7月29日(本周六 ...
- atitit.新增编辑功能 跟orm的实现 attilax p31
atitit.新增编辑功能 跟orm的实现 attilax p31 1. 流程的实现 1 2. view的实现(dwr) 1 3. 获取表结构 1 4. grep filt req params 2 ...
- Java第十二次作业:什么是一维数组?什么是对象数组?吃金币游戏2.0版 新增炸弹功能 新增游戏倒计时功能 新增胜利失败检测功能 使用如鹏游戏引擎制作窗体 一维数组设置金币
什么是数组? 数组的定义:是用统一的名字代表这批数据,用序号来区分各个数据.数组是无序的数据元素按有序的下标组成的集合,分配固定空间大小的一种容器. 如何理解:其实就是一个同时放很多数据的变量. a= ...
- 关于html5新增的功能(百度)
HTML5包含以下新增和更新功能: 1. 新增了一种HTML文档类型:<DOCTYPE html> 2. 新增了一些结构化标记的元素(<header>,<nav> ...
- 微信快速开发框架(九)-- V3.0发布,代码已更新至Github 新增微店功能
版本内容 1.修正了缺少对Event.View的支持 2.增加了用户UnionID 3.新增微信小店功能 4.多客服功能 5.单元测试 什么是UnionID 我们知道,每个用户针对一个微信公众账号都有 ...
- 【PHP发展史】PHP5.2 到 PHP5.6 中新增的功能详解
截至目前(2014.2), PHP 的最新稳定版本是 PHP5.5, 但有差不多一半的用户仍在使用已经不在维护的 PHP5.2, 其余的一半用户在使用 PHP5.3. 因为 PHP 那“集百家之长”的 ...
- Editable DataGrid 实现列表新增编辑功能
今天在开发一个功能时候,需要直接在列表实现新增.编辑等功能.于是查看easyui 相关文档,找到相关解决办法. easyui的datagrid支持可编辑功能.它使用户能够向数据网格中添加一个新行.用户 ...
- PHP 自 5.2 到 5.6 中新增的功能详解
截至目前(2014.2), PHP 的最新稳定版本是 PHP5.5, 但有差不多一半的用户仍在使用已经不在维护 [注] 的 PHP5.2, 其余的一半用户在使用 PHP5.3 [注].因为 PHP 那 ...
- .Net语言 APP开发平台——Smobiler学习日志:SmoOne新增考勤功能
大家好!SmoOne这次新增了考勤功能,大家打开SmoOne应用便可体验,无需重新下载更新.如果没有下载SmoOne客户端,可以在apps.smobiler.com进行下载安装. 另外,SmoOne开 ...
- Mockplus3.5.0.1新增标注功能
Mockplus3.5.0.1版本中,新增了标注功能.多种标注模式,智能生成,随时查看.原型设计效率更高. Mockplus的标注功能有以下四种模式: 1.无选中标注 在未选中任何组件时,按住Ctrl ...
随机推荐
- 2024.9.23 cj 训练总结
T1 这道题目仔细观察就会发现: 异或 k=1 这就很好办,考虑 k=1 怎么解 3 1 2 4 5 6 7.......... 即可. 异或,找规律发现有很多数字的异或值为0的.最后的答案是有规律的 ...
- .NET 原生驾驭 AI 新基建实战系列(三):Chroma ── 轻松构建智能应用的向量数据库
在人工智能AI和机器学习ML迅猛发展的今天,数据的存储和检索需求发生了巨大变化.传统的数据库擅长处理结构化数据,但在面对高维向量数据时往往力不从心.向量数据库作为一种新兴技术,专为AI应用设计,能够高 ...
- java 限流
题记 在高并发的分布式系统中,我们都需要考虑接口并发量突增时造成的严重后果,后端服务的高压力严重甚至会导致系统宕机.为避免这种问题,我们都会为接口添加限流.降级.熔断等能力,从而使接口更为健壮. 限流 ...
- 关于composer报错The openssl extension is required for SSL/TLS protection but is not available问题
今天使用composer的时候得到了这个错误: The openssl extension is required for SSL/TLS protection but is not availabl ...
- js录制系统/麦克风声音(基于electron)
最近想用electron写一个和音视频相关的软件,尽管在写之前都想好了要用哪些技术,但依然写得很艰难,今天对相关知识的个人理解做个记录和整理. 时隔半年,最近发现网上有大神造好的轮子,而且功能强大:h ...
- P7404题解
分析题意: 题意就是让前半段序列呈上升趋势,后半段呈下降趋势. 解题方法: 考虑差分出序列的高度. xix_ixi 表示以 iii 为 kkk 的前半段需增加量. yiy_iyi 表示以 i−1i ...
- 开发 MCP Proxy(代理)也可以用 Solon AI MCP 哟!
MCP 有三种通讯方式: 通道 说明 备注 stdio 本地进程内通讯 现有 sse http 远程 http 通讯 现有 streamable http 远程 http 通讯 (MCP 官方刚通过决 ...
- 一个简单的struts2配置
目录 1 需求 2 需要导入的jar包 3 项目的目录结构 3.1 demo1.jsp 3.2 success.jsp 3.3 HelloAction.java 3.4 struts.xml 3.5 ...
- 【HUST】网安|编译原理实验|实验四攻略
[实验代码及报告地址:Gitee传送门](已关闭传送大门,原因是抄袭过多,如需参考,请直接看博客,虽然下一届内容会变了) 不擅长写报告昂,很多地方能省全省了. 助力来年编译原理加大难度!(hhh) M ...
- 基于Kubernetes可扩展的Selenium 并行自动化测试部署及搭建(2)——Win10环境下Kubernetes(k8s)部署
继续上一篇,本篇进行K8S环境部署. K8s部署: 1. 访问k8s-for-docker-desktop 的github地址: https://github.com/AliyunContainer ...