
Proxy reverso HTTP com filtragem
Proxy HTTP reverso para filtrar requisições por diferentes regras. Pode ser usado entre o servidor web de produção e o servidor de aplicação para prevenir abuso do backend da aplicação.
O propósito original deste programa era defender o searx, mas pode ser usado para proteger qualquer aplicação web.
$ go install github.com/asciimoo/filtron
$ "$GOPATH/bin/filtron" --help
Uma regra tem dois atributos obrigatórios: name e actions
Uma regra pode conter todos os seguintes atributos:
limit inteiro - Define quantas requisições correspondentes podem acessar a aplicação dentro de interval segundos. (Pode ser omitido se 0)interval inteiro - Intervalo de tempo em segundos para redefinir os números da regra (Pode ser omitido se limit for 0)filters lista de seletoresaggregations lista de seletores (se filters for especificado, ativa apenas se o filtro corresponder)subrules lista de regras (se filters for especificado, ativa apenas se o filtro corresponder)disabled booleano - Desabilitar uma regra (padrão é false)stop booleano - Finalizar a validação da requisição imediatamente e pular as regras restantes (padrão é false)Representação JSON de uma regra:
{
"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"}}
]
}
Explicação: Permitir apenas 10 requisições por minuto onde q é representado como parâmetro GET e o cabeçalho user-agent começa com curl. A requisição é registrada no STDERR e bloqueada com uma mensagem de erro personalizada se o limite for excedido. Veja mais exemplos aqui.
actionsAs ações da regra são ativadas sequencialmente se uma requisição exceder o limite da regra
Nota: Somente a primeira ação da regra que fornece uma resposta personalizada será executada
logRegistrar a requisição
blockResponder com HTTP 429 em vez de passar a requisição para a aplicação
shell Executar um comando shell. cmd (string) e args (lista de seletores) são parâmetros obrigatórios (Exemplo: {"name": "shell", "params": {"cmd": "echo %v is the IP", "args": ["IP"]}})
filtersSe todos os seletores forem encontrados, incrementa um contador. A regra bloqueia a requisição se o contador atingir limit
aggregationsConta os valores retornados pelos seletores. A regra bloqueia a requisição se o número de qualquer valor atingir limit
subrulesCada regra pode conter qualquer número de sub-regras. Ativa quando o filtro da regra pai corresponde.
Diferentes partes da requisição podem ser extraídas usando expressões de seletor.
Seletores são strings que podem corresponder a qualquer atributo de uma requisição HTTP com a seguinte sintaxe:
[!]RequestAttribute[:SubAttribute][=Expression]
! pode negar o seletorRequestAttribute (obrigatório) seleciona uma parte específica da requisição - valores possíveis:
IPHostPathMethodGETPOSTParam - é um alias para ambos GET e POSTCookieHeaderSubAttribute se não for um valor único, pode especificar o atributo internoIP retorna o endereço IP do cliente
GET:x retorna o parâmetro GET x se existir
!Header:Accept-Language retorna verdadeiro se não houver cabeçalho HTTP Accept-Language
Path=^/(x|y)$ corresponde se o caminho for /x ou /y
IP=nslookup(example.com) corresponde se o endereço IP do cliente for um dos endereços IP de example.com.
O Filtron pode ser configurado através de sua API REST que escuta em 127.0.0.1:4005 por padrão.
/rulesRegras carregadas no formato JSON
/rules/reloadRecarregar o arquivo de regras especificado na inicialização
Interface construída sobre a API

Bugs ou sugestões? Visite o rastreador de issues.
RequestAttributeExpression valor possível:
nslookup(Hostname) para filtrar os valores do atributo selecionado com os endereços IP de Hostname. O Filtron resolve Hostname para seus endereços IP quando a regra é carregada (IPv4 e IPv6).