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-sessionaffinityHashCookie/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_Contentxxx 可以任意命名,只要不重复就好
内容即为响应body
xxx_ContentTypexxx_Content 对应的 ContentType, 不设置默认为
text/plainxxx_ContentWhenxxx_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_wafxxx 可以任意命名,只要不重复就好
配置内容即为条件筛选 比如
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 ...
随机推荐
- java基础之数据结构
一.栈:stack,又称堆栈[出口和入口在同一侧],特点:先进后出(即,存进去的元素,要在后它后面的元素依次取出后,才能取出该元素) 例子:子弹压进弹夹,先压进去的子弹在下面,后压进去的子弹在上面,当 ...
- spring cloud alibaba的小坑:Caused by: com.alibaba.nacos.api.exception.NacosException: endpoint is blank报错问题,
一.是因为加添spring cloud alibaba配置中心依赖和bootstrap.xml又不使用的问题
- 为什么 MySQL 选择使用 B+ 树作为索引结构?
为什么 MySQL 选择使用 B+ 树作为索引结构? MySQL 选择 B+ 树作为其索引结构的主要原因是它具有以下几个优势,这些优势使得 B+ 树非常适合用于数据库系统中的索引实现. 1. 高效的范 ...
- Windows系统优化 3-清理预安装软件
事件起因: 经过我们上次 Windows系统优化 2-系统设置优化 之后,现在电脑已经基本上可以使用,不过对于有强迫症的我来说还差了一步,那就是系统预安装的软件: 对于我们刚入手的电脑你是否有 这些 ...
- 一文详解银河麒麟配置容器运行时及gVisor(runsc)、Kata(runv)详细指南
容器运行时介绍 容器运行时核心概念与分类 容器运行时(Container Runtime)是管理容器生命周期(创建.启动.停止.删除)和资源隔离的核心组件,通过与操作系统内核协作实现容器化环境.根据功 ...
- PowerShell : 无法加载文件 xxx.ps1,因为在此系统上禁止运行脚本(npm或yarn)
1.搜索powershell,右键以管理员身份运行 2.若要在本地计算机上运行您编写的未签名脚本和来自其他用户的签名脚本,请使用以下命令将计算机上的 执行策略更改为 RemoteSigned 执行 s ...
- VS2019 webApi(.net core2.2版本)上传到Gitee
一.本地创建项目 创建本地项目,依次点击下一步,在选择"目标框架"时选择2.2, 二.配置swagger 1.添加依赖项 2.修改Startup.cs public void Co ...
- python 处理word 分页符、分节符
import docx doc1 =docx.Document(r"C:\Users\Administrator\Desktop\test.docx") doc1.paragrap ...
- SpringIntegrationRamble
目录 Why SpringIntegration Background Consolidate Architecture ESB service Popular Solutions Getting S ...
- 改进NeteaseCloudMusicGtk4:添加移除歌曲按钮
之前已经发了一篇博客简述了如何阅读这个项目,尽管这个项目已经开源很久了,但我找了很久都没有找到怎么从播放列表移除歌曲,那就自己动手实现,再提个 PR 吧. 运行起来应用后通过 Inspector(Ct ...