描述
PoW Shield通过在后端服务和终端用户之间充当使用工作量证明的代理,提供OSI应用层的DDoS保护。该项目旨在为一般的反DDoS方法(如谷歌的ReCaptcha,一直是一个令人头疼的问题)提供一种替代方案。访问由PoW Shield保护的网络服务从未如此简单,只需访问URL,您的浏览器将自动为您完成剩余的验证。
PoW Shield旨在提供以下捆绑在单个网络应用/Docker镜像中的服务:
- 工作量证明认证
- 速率限制和IP黑名单
- 网络应用防火墙
(新)LinkedIn上的文章
特性
- 网络服务结构
- 代理功能
- PoW实现
- Docker化
- IP黑名单
- 速率限制
- 单元测试
- WAF实现
- 多实例同步(Redis)
- SSL支持
通过PoW Phalanx控制器支持:
- 多实例管理
- 白名单令牌
- 黑名单IP同步
- 动态难度控制
- 仪表板
Go语言的替代实现PoW-Shield-Go(进行中)用于压力测试和未来的优化生产版本。
工作原理
基本上,PoW Shield作为实际网络应用/服务前面的代理工作。它通过工作量证明进行验证,只将授权流量代理到实际服务器。该代理易于安装,并能够通过WAF保护低安全性应用。
当用户浏览受PoW Shield保护的网络服务时,后台发生以下情况:
- 服务器生成一个随机的十六进制编码"前缀",并将其与PoW Shield页面一起发送给客户端。
- 客户端的浏览器JavaScript然后尝试暴力破解一个"nonce",当与前缀附加时,可以生成一个SHA256哈希,其前导零位数多于服务器指定的"难度"D。即SHA256(前缀 + nonce)=0...0xxxx(二进制,前导0的数量大于D)
- 客户端JavaScript然后将计算出的nonce发送到服务器进行验证,如果验证通过,服务器为客户端生成一个cookie以通过认证。
- 服务器开始代理现在已认证的客户端流量到服务器,并启用WAF过滤。
配置
您可以通过以下方法配置PoW Shield。
- nodejs: .env(示例:.env.example)
- docker-compose: docker-compose.yaml(示例:docker-compose.example.yaml)
- docker run: -e 参数
环境变量
变量 | 类型 | 默认值 | 描述 |
---|---|---|---|
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 | 指定nonce生成后必须提交到服务器的最长秒数(用于强制难度变化和过滤过时的nonce) |
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控制器的订阅令牌 |
使用方法
Nodejs
先决条件
- Docker ^19.0.0
- Nodejs ^14.0.0
# 克隆仓库
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运行,推荐且更快 #
####################################################
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秒。
大量GET请求
并发连接数 | 平均延迟 | 错误率 | 每秒请求数 |
---|---|---|---|
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 |
Nonce洪水攻击
并发连接数 | 平均延迟 | 错误率 | 每秒请求数 |
---|---|---|---|
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 |
从上面的样本中,我们可以看到PoW Shield的适当最大负载估计约为512个并发连接。之后,错误率和延迟会