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 ...
 
随机推荐
- centos简单文件备份
			
1. 背景 现在有一个正在使用的服务器, 需要对服务器上的数据库数据.实验室文件以及采购平台文件进行备份, 将备份文件存储到另外一个服务器上, 要求留存最近七天的备份文件. 2.详细步骤 2.1 备份 ...
 - Flowable快速入门
			
flowable官方文档 官网:https://tkjohn.github.io/flowable-userguide/#_getting_started 工作流(Workflow),是& ...
 - mybatis的mapper接口动态代理开发
			
一.必须遵守的四项原则 1:接口 方法名==xx.xml中的id名 2:方法返回值类型与Mapper.xml文件中返回值类型一致 3:方法的入参类型与Mapper.xml文件中入参值类型一致 4:命名 ...
 - 解决React Warning: Can't perform a React state update on an unmounted component. This is a no-op, but it indicates a memory leak in your application. To fix, ... useEffect cleanup function.
			
在写react程序时遇到警告: Warning: Can't perform a React state update on an unmounted component. This is a no- ...
 - MySQL 高可用集群搭建部署
			
MySQL 高可用集群搭建(GTID 模式 + 自动故障转移) 一.环境规划 角色 IP 地址 说明 主库 (Master) 192.168.1.100 运行 MySQL + Keepalived/M ...
 - KoalaWiki vs DeepWiki:更优秀的开源代码知识库解决方案
			
KoalaWiki vs DeepWiki:更优秀的开源代码知识库解决方案 资源链接: 教程代码仓库:https://github.com/AIDotNet/SemanticKernel.Sample ...
 - <HarmonyOS第一课05>从简单的页面开始
			
ArkUI是HarmonyOS应用的UI开发框架,它提供了一套完整的基础设施,包括简洁的UI语法.丰富的UI功能(组件.布局.动画以及交互事件),以及实时界面预览工具等.ArkUI支持开发者进行可视化 ...
 - 【经验】VMware|虚拟机只能使用鼠标无法使用键盘、装不了或装了VMware-Tools无法复制粘贴的可能解决办法
			
2024/04/24说明:这篇暂时修改为粉丝可见,因为正在冲粉丝量,等到我弄完了粉丝量的要求,我就改回来!不方便看到全文的小伙伴不好意思!! VMware Workstation Pro版本:16.2 ...
 - VUE3中的组件通信
			
工作中使用组件之间传值在此记录 目录VUE3中的组件通信六种方法介绍与基本使用一.父传子(props)二. Emits 传值(子组件向父组件传值)三.v-model 双向绑定四. provide/in ...
 - 探索Rust:所有权和借用的魅力与应用
			
@charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...