123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 |
- .. _searx filtron:
- ==========================
- How to protect an instance
- ==========================
- .. sidebar:: further reading
- - :ref:`filtron.sh`
- - :ref:`nginx searx site`
- .. contents:: Contents
- :depth: 2
- :local:
- :backlinks: entry
- .. _filtron: https://github.com/asciimoo/filtron
- Searx depends on external search services. To avoid the abuse of these services
- it is advised to limit the number of requests processed by searx.
- An application firewall, filtron_ solves exactly this problem. Filtron is just
- a middleware between your web server (nginx, apache, ...) and searx, we describe
- such infratructures in chapter: :ref:`architecture`.
- filtron & go
- ============
- .. _Go: https://golang.org/
- .. _filtron README: https://github.com/asciimoo/filtron/blob/master/README.md
- Filtron needs Go_ installed. If Go_ is preinstalled, filtron_ is simply
- installed by ``go get`` package management (see `filtron README`_). If you use
- filtron as middleware, a more isolated setup is recommended. To simplify such
- an installation and the maintenance of, use our script :ref:`filtron.sh`.
- .. _Sample configuration of filtron:
- Sample configuration of filtron
- ===============================
- .. sidebar:: Tooling box
- - :origin:`/etc/filtron/rules.json <utils/templates/etc/filtron/rules.json>`
- An example configuration can be find below. This configuration limits the access
- of:
- - scripts or applications (roboagent limit)
- - webcrawlers (botlimit)
- - IPs which send too many requests (IP limit)
- - too many json, csv, etc. requests (rss/json limit)
- - the same UserAgent of if too many requests (useragent limit)
- .. code:: json
- [
- {
- "name": "search request",
- "filters": [
- "Param:q",
- "Path=^(/|/search)$"
- ],
- "interval": "<time-interval-in-sec (int)>",
- "limit": "<max-request-number-in-interval (int)>",
- "subrules": [
- {
- "name": "missing Accept-Language",
- "filters": ["!Header:Accept-Language"],
- "limit": "<max-request-number-in-interval (int)>",
- "stop": true,
- "actions": [
- {"name":"log"},
- {"name": "block",
- "params": {"message": "Rate limit exceeded"}}
- ]
- },
- {
- "name": "suspiciously Connection=close header",
- "filters": ["Header:Connection=close"],
- "limit": "<max-request-number-in-interval (int)>",
- "stop": true,
- "actions": [
- {"name":"log"},
- {"name": "block",
- "params": {"message": "Rate limit exceeded"}}
- ]
- },
- {
- "name": "IP limit",
- "interval": "<time-interval-in-sec (int)>",
- "limit": "<max-request-number-in-interval (int)>",
- "stop": true,
- "aggregations": [
- "Header:X-Forwarded-For"
- ],
- "actions": [
- { "name": "log"},
- { "name": "block",
- "params": {
- "message": "Rate limit exceeded"
- }
- }
- ]
- },
- {
- "name": "rss/json limit",
- "filters": [
- "Param:format=(csv|json|rss)"
- ],
- "interval": "<time-interval-in-sec (int)>",
- "limit": "<max-request-number-in-interval (int)>",
- "stop": true,
- "actions": [
- { "name": "log"},
- { "name": "block",
- "params": {
- "message": "Rate limit exceeded"
- }
- }
- ]
- },
- {
- "name": "useragent limit",
- "interval": "<time-interval-in-sec (int)>",
- "limit": "<max-request-number-in-interval (int)>",
- "aggregations": [
- "Header:User-Agent"
- ],
- "actions": [
- { "name": "log"},
- { "name": "block",
- "params": {
- "message": "Rate limit exceeded"
- }
- }
- ]
- }
- ]
- }
- ]
- .. _filtron route request:
- Route request through filtron
- =============================
- .. sidebar:: further reading
- - :ref:`filtron.sh overview`
- - :ref:`installation nginx`
- - :ref:`installation apache`
- Filtron can be started using the following command:
- .. code:: sh
- $ filtron -rules rules.json
- It listens on ``127.0.0.1:4004`` and forwards filtered requests to
- ``127.0.0.1:8888`` by default.
- Use it along with ``nginx`` with the following example configuration.
- .. code:: nginx
- # https://example.org/searx
- location /searx {
- proxy_pass http://127.0.0.1:4004/;
- proxy_set_header Host $host;
- proxy_set_header Connection $http_connection;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- proxy_set_header X-Scheme $scheme;
- proxy_set_header X-Script-Name /searx;
- }
- location /searx/static {
- /usr/local/searx/searx-src/searx/static;
- }
- Requests are coming from port 4004 going through filtron and then forwarded to
- port 8888 where a searx is being run. For a complete setup see: :ref:`nginx
- searx site`.
|