
Фильтрующий обратный HTTP-прокси
Обратный HTTP-прокси для фильтрации запросов по различным правилам. Может использоваться между продакшн-веб-сервером и сервером приложений для предотвращения злоупотреблений бэкендом приложения.
Изначальная цель программы — защита searx, но она может использоваться для защиты любого веб-приложения.
$ go install github.com/asciimoo/filtron
$ "$GOPATH/bin/filtron" --help
Правило имеет два обязательных атрибута: name и actions
Правило может содержать следующие атрибуты:
limit целое число — Определяет, сколько соответствующих запросов разрешено к приложению в течение interval секунд. (Может быть опущено, если 0)interval целое число — Временной интервал в секундах для сброса счётчиков правила (Может быть опущено, если limit равен 0)filters список селекторовaggregations список селекторов (если задан filters, активируется только при совпадении фильтра)subrules список правил (если задан filters, активируется только при совпадении фильтра)disabled bool — Отключает правило (по умолчанию false)stop bool — Немедленно завершить проверку запроса и пропустить остальные правила (по умолчанию 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-параметром, а заголовок User-Agent начинается с curl. Запрос логируется в STDERR и блокируется с пользовательским сообщением об ошибке, если лимит превышен. Больше примеров здесь.
действияДействия правила активируются последовательно, если запрос превышает лимит правила.
Примечание: Будет выполнено только первое действие правила, которое возвращает пользовательский ответ.
logЛогировать запрос
blockВернуть HTTP-ответ 429 вместо передачи запроса приложению
shell Выполнить команду оболочки. cmd (строка) и args (список селекторов) — обязательные параметры (Пример: {"name": "shell", "params": {"cmd": "echo %v is the IP", "args": ["IP"]}})
фильтрыЕсли все селекторы найдены, счётчик увеличивается. Правило блокирует запрос, если счётчик достигает limit
агрегацииПодсчитывает значения, возвращаемые селекторами. Правило блокирует запрос, если количество любого значения достигает limit
подправилаКаждое правило может содержать любое количество подправил. Активируется при совпадении фильтра родительского правила.
Различные части запроса могут быть извлечены с помощью выражений селекторов.
Селекторы — это строки, которые могут соответствовать любому атрибуту HTTP-запроса со следующим синтаксисом:
[!]RequestAttribute[:SubAttribute][=Expression]
! может инвертировать селекторRequestAttribute (обязательно) выбирает конкретную часть запроса — возможные значения:
IPHostPathMethodGETPOSTParam — псевдоним для GET и POSTCookieHeaderSubAttribute если не является единичным значением, может указывать внутренний атрибутIP возвращает IP-адрес клиента
GET:x возвращает GET-параметр x, если он существует
!Header:Accept-Language возвращает true, если нет HTTP-заголовка Accept-Language
Path=^/(x|y)$ совпадает, если путь равен /x или /y
IP=nslookup(example.com) совпадает, если IP-адрес клиента является одним из IP-адресов example.com.
Filtron можно настроить через его REST API, который по умолчанию слушает 127.0.0.1:4005.
/rulesЗагруженные правила в формате JSON
/rules/reloadПерезагрузить файл правил, указанный при запуске
UI построен на API

Ошибки или предложения? Посетите трекер задач.
RequestAttributeExpression возможные значения:
nslookup(Hostname) для фильтрации выбранных значений атрибутов по IP-адресам Hostname. Filtron разрешает Hostname в его IP-адреса при загрузке правила (IPv4 и IPv6).