PoW Shield 通过充当代理服务器,在后端服务和最终用户之间利用工作量证明,为 OSI 应用层提供 DDoS 防护。该项目旨在为 Google 的 ReCaptcha 等常见反 DDoS 方法提供一种替代方案,这些方法往往令人困扰。访问受 PoW Shield 保护的网络服务从未如此简单:只需访问 URL,您的浏览器将自动为您完成其余验证。
PoW Shield 旨在通过单个 Web 应用 / Docker 镜像提供以下服务:
(新版)领英上的文章
通过 PoW Phalanx 控制器支持:
另一种使用 Go 语言的实现 PoW-Shield-Go(开发中),用于压力测试以及未来的优化生产版本。
基本上,PoW Shield 作为实际 Web 应用/服务前端的代理工作。它通过工作量证明进行验证,仅将经过授权的流量代理到真实服务器。该代理易于安装,并能够使用 WAF 保护低安全性的应用程序。
当用户浏览受 PoW Shield 保护的 Web 服务时,后台发生的过程如下:
您可以通过以下方法配置 PoW Shield。
# 克隆仓库
git clone https://github.com/RuiSiang/PoW-Shield.git
# 安装依赖
npm install
# 配置设置
cp -n .env.example .env
# 编辑 .env
nano .env
# 编译
npm run build
#############################################
# 使用数据库(Redis)运行,推荐且更快 #
# 首先安装 redis #
# sudo apt-get install redis-server #
#############################################
npm start
#############################################
#############################################
# 无数据库运行(模拟 Redis) #
#############################################
npm run start:standalone # linux
npm run start:standalone-win # windows
#############################################
# 测试功能(可选)
npm test
####################################################
# Docker 使用数据库(Redis)运行,推荐且更快 #
####################################################
docker run -p 3000:3000 -e BACKEND_URL="http://example.com" -d ruisiang/pow-shield
####################################################
####################################################
# Docker 无数据库运行(模拟 Redis) #
####################################################
docker run -p 3000:3000 -e BACKEND_URL="http://example.com" -e NODE_ENV="standalone" -d ruisiang/pow-shield
####################################################
####################################################
# Docker Compose #
####################################################
# 复制 docker-compose.example.yaml
cp -n docker-compose.example.yaml docker-compose.yaml
# 编辑 docker-compose.yaml
nano docker-compose.yaml
# 启动容器
docker-compose -f docker-compose.yaml up
####################################################
注意:这仅适用于非容器化的 PoW Shield 版本,运行测试时您的系统可能会出现不稳定。
# 启动压力测试
npm run stress
# 如果您在 .env 中更改了 PORT 变量,也应更改压力测试脚本中的目标变量
nano scripts/stress.sh
以下测试是在 i7-10870H CPU 的单线程上进行的,每个并发参数持续 60 秒。
从以上样本可以看出,PoW Shield 的适当最大负载估计约为 512 个并发连接。此后错误率和延迟会恶化到超出正常接受范围。因此,在机器的负载均衡环境中(每个内核上运行 1 个 PoW Shield 实例,共 8 个内核),它应该能够处理大约 4096 个并发连接(客户端),总请求率可达 32k 请求/秒。
MIT
| 变量 | 类型 | 默认值 | 描述 |
|---|
| PORT | 通用 | 3000 | PoW Shield 监听的端口 |
| SESSION_KEY | 通用 | cookie 签名的密钥,出于安全考虑请使用唯一密钥,否则任何人都可以伪造您的签名 cookie | |
| BACKEND_URL | 通用 | 将经过认证的流量转发到的位置,接受 IP 和 URL(接受 protocol://url(:port) 或 protocol://ip(:port)) | |
| DATABASE_HOST | Redis | 127.0.0.1 | Redis 服务主机 |
| DATABASE_PORT | Redis | 6379 | Redis 服务端口 |
| DATABASE_PASSWORD | Redis | null | Redis 服务密码 |
| POW | PoW | on | 开启/关闭 PoW 功能(如果暂时不关闭,何必使用这个项目?) |
| NONCE_VALIDITY | PoW | 60000 | 指定随机数在生成后必须提交给服务器的最大秒数(用于强制难度变更并过滤过时随机数) |
| DIFFICULTY | PoW | 13 | 问题难度,生成的哈希中前导 0 的位数(0:极其简单 ~ 256:不可能,13(默认)浏览器大约需要 5 秒计算) |
| RATE_LIMIT | 速率限制 | on | 开启/关闭速率限制功能 |
| RATE_LIMIT_SAMPLE_MINUTES | 速率限制 | 60 | 指定经过多少分钟后会话/IP 的统计数据重置 |
| RATE_LIMIT_SESSION_THRESHOLD | 速率限制 | 100 | 单个会话在触发令牌吊销前允许的请求数 |
| RATE_LIMIT_BAN_IP | 速率限制 | on | 开启/关闭 IP 封禁功能 |
| RATE_LIMIT_IP_THRESHOLD | 速率限制 | 500 | 单个会话在触发 IP 封禁前允许的请求数 |
| RATE_LIMIT_BAN_MINUTES | 速率限制 | 15 | IP 封禁持续分钟数 |
| WAF | WAF | on | 开启/关闭 WAF 功能 |
| WAF_URL_EXCLUDE_RULES | WAF | 扫描请求 URL 时要排除的规则,使用 ',' 分隔规则编号,使用 '-' 指定范围(例如:1,2-4,5,7-10) | |
| WAF_HEADER_EXCLUDE_RULES | WAF | 14,33,80,96,100 | 扫描请求头部时要排除的规则,使用 ',' 分隔规则编号,使用 '-' 指定范围(例如:1,2-4,5,7-10) |
| WAF_BODY_EXCLUDE_RULES | WAF | 扫描请求体时要排除的规则,使用 ',' 分隔规则编号,使用 '-' 指定范围(例如:1,2-4,5,7-10) | |
| SSL | SSL | off | 开启/关闭 SSL 功能 |
| SSL_CERT_PATH | SSL | tests/ssl/mock-cert.pem | SSL 证书路径 |
| SSL_KEY_PATH | SSL | tests/ssl/mock-key.pem | SSL 密钥路径 |
| SOCKET | Socket | off | 开启/关闭 Socket 功能 |
| SOCKET_URL | Socket | PoW Phalanx 控制器位置,接受 IP 和 URL(接受 protocol://url:port 或 protocol://ip:port) | |
| SOCKET_TOKEN | Socket | PoW Phalanx 控制器的订阅令牌 |
| 并发连接数 | 平均延迟 | 错误率 | 每秒请求数 |
|---|
| 64 | 15.3ms | 0.0000 | 4188 |
| 128 | 30.2ms | 0.0000 | 4229 |
| 256 | 60.4ms | 0.0000 | 4235 |
| 512 | 122.6ms | 0.0142 | 4166 |
| 1024 | 261.7ms | 0.1766 | 3894 |
| 2048 | 1966.5ms | 0.4979 | 1027 |
| 4096 | 4685ms | 0.7179 | 838 |
| 并发连接数 | 平均延迟 | 错误率 | 每秒请求数 |
|---|
| 64 | 15.6ms | N/A | 4094 |
| 128 | 31.5ms | N/A | 4058 |
| 256 | 61.5ms | N/A | 4159 |
| 512 | 129.5ms | N/A | 3945 |
| 1024 | 264.4ms | N/A | 3858 |
| 2048 | 592.1ms | N/A | 3407 |
| 4096 | 1212.6ms | N/A | 3322 |