反向HTTP代理,用于按不同规则过滤请求。可用于生产Web服务器和应用服务器之间,防止对应用后端的滥用。
此程序的初衷是保护 searx,但可用于守护任何Web应用。
$ go install github.com/asciimoo/filtron
$ "$GOPATH/bin/filtron" --help
一个规则有两个必需属性:name 和 actions
一个规则可以包含以下所有属性:
limit 整数 - 定义在 interval 秒内允许多少个匹配请求访问应用。(如果为 0 可省略)interval 整数 - 重置规则计数的秒数范围(如果 limit 为 0 可省略)filters 选择器列表aggregations 选择器列表(如果指定了 filters,则仅在过滤器匹配时激活)subrules 规则列表(如果指定了 filters,则仅在过滤器匹配时激活)disabled 布尔 - 禁用规则(默认为 false)stop 布尔 - 立即结束请求验证并跳过剩余规则(默认为 false)规则的JSON表示:
{
"name": "example rule",
"interval": 60,
"limit": 10,
"filters": ["GET:q", "Header:User-Agent=^curl"],
"actions": [
{"name": "log",
"params": {"destination": "stderr"}},
{"name": "block",
"params": {"message": "Not allowed"}}
]
}
说明:仅允许每分钟10个请求,其中 q 作为GET参数,且用户代理头部以 curl 开头。如果超过限制,请求将被记录到STDERR并以自定义错误消息阻止。更多示例见这里。
actions如果请求超过规则的限制,规则的动作将按顺序激活。
注意:只有提供自定义响应的规则的第一个动作才会被执行。
log记录请求
block返回HTTP 429响应,而不是将请求传递到应用
shell 执行Shell命令。cmd(字符串)和 args(选择器列表)是必需参数(示例:{"name": "shell", "params": {"cmd": "echo %v is the IP", "args": ["IP"]}})
filters如果找到所有选择器,则计数器加一。如果计数器达到 limit,规则将阻止请求。
aggregations统计选择器返回的值。如果任何值的数量达到 limit,规则将阻止请求。
subrules每个规则可以包含任意数量的子规则。在父规则的过滤器匹配时激活。
可以使用选择器表达式提取请求的不同部分。
选择器是可以匹配HTTP请求任何属性的字符串,语法如下:
[!]RequestAttribute[:SubAttribute][=Expression]
! 可以取反选择器RequestAttribute(必需)选择请求的特定部分 - 可能的值:
IPHostPathMethodGETPOSTParam - 它是 GET 和 POST 的别名CookieHeaderSubAttribute 如果 RequestAttribute 不是单值,则可以指定内部属性IP 返回客户端IP地址
GET:x 返回 x GET参数(如果存在)
!Header:Accept-Language 如果没有 Accept-Language HTTP头部则返回true
Path=^/(x|y)$ 如果路径是 /x 或 /y 则匹配
IP=nslookup(example.com) 如果客户端IP地址是example.com的IP地址之一则匹配。
Filtron 可以通过其REST API进行配置,默认监听 127.0.0.1:4005。
/rules以JSON格式加载规则
/rules/reload重新加载启动时指定的规则文件
基于API构建的UI

发现Bug或有建议?请访问问题跟踪器。
Expression 可能的值:
nslookup(Hostname) 用于使用 Hostname 的IP地址过滤选定属性值。Filtron 在加载规则时将 Hostname 解析为其IP地址(IPv4和IPv6)。