Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
lua-resty-limit-traffic — Bibliothèque Lua pour limiter et contrôler le trafic dans OpenResty/ngx_lua | Kitploit
Outils/GitHubGitHub/openresty/lua-resty-limit-traffic
Outils DéfensifsUtilitaires GénérauxSécurité Web
GitHubopenresty/lua-resty-limit-traffic

lua-resty-limit-traffic

Bibliothèque Lua pour limiter et contrôler le trafic dans OpenResty/ngx_lua

Voir le dépôt
852157il y a 1 moisVérifié par Kitploit

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

Nom

lua-resty-limit-traffic - Bibliothèque Lua pour limiter et contrôler le trafic dans OpenResty/ngx_lua

Table des matières

  • Nom
  • Statut
  • Synopsis
  • Description
  • Installation
  • Communauté
    • Liste de diffusion en anglais
    • Liste de diffusion en chinois
  • Bogues et correctifs
  • Auteur
  • Copyright et licence
  • Voir aussi

Statut

Cette bibliothèque est déjà utilisable bien qu'encore hautement expérimentale.

L'API Lua est encore en évolution et peut changer dans un proche avenir sans préavis.

Synopsis

root@kitploit:~
# demonstrate the usage of the resty.limit.req module (alone!)
http {
    lua_shared_dict my_limit_req_store 100m;

    server {
        location / {
            access_by_lua_block {
                -- well, we could put the require() and new() calls in our own Lua
                -- modules to save overhead. here we put them below just for
                -- convenience.

                local limit_req = require "resty.limit.req"

                -- limit the requests under 200 req/sec with a burst of 100 req/sec,
                -- that is, we delay requests under 300 req/sec and above 200
                -- req/sec, and reject any requests exceeding 300 req/sec.
                local lim, err = limit_req.new("my_limit_req_store", 200, 100)
                if not lim then
                    ngx.log(ngx.ERR,
                            "failed to instantiate a resty.limit.req object: ", err)
                    return ngx.exit(500)
                end

                -- the following call must be per-request.
                -- here we use the remote (IP) address as the limiting key
                local key = ngx.var.binary_remote_addr
                local delay, err = lim:incoming(key, true)
                if not delay then
                    if err == "rejected" then
                        return ngx.exit(503)
                    end
                    ngx.log(ngx.ERR, "failed to limit req: ", err)
                    return ngx.exit(500)
                end

                if delay >= 0.001 then
                    -- the 2nd return value holds the number of excess requests
                    -- per second for the specified key. for example, number 31
                    -- means the current request rate is at 231 req/sec for the
                    -- specified key.
                    local excess = err

                    -- the request exceeding the 200 req/sec but below 300 req/sec,
                    -- so we intentionally delay it here a bit to conform to the
                    -- 200 req/sec rate.
                    ngx.sleep(delay)
                end
            }

            # content handler goes here. if it is content_by_lua, then you can
            # merge the Lua code above in access_by_lua into your content_by_lua's
            # Lua handler to save a little bit of CPU time.
        }
    }
}
root@kitploit:~
# demonstrate the usage of the resty.limit.conn module (alone!)
http {
    lua_shared_dict my_limit_conn_store 100m;

    server {
        location / {
            access_by_lua_block {
                -- well, we could put the require() and new() calls in our own Lua
                -- modules to save overhead. here we put them below just for
                -- convenience.

                local limit_conn = require "resty.limit.conn"

                -- limit the requests under 200 concurrent requests (normally just
                -- incoming connections unless protocols like SPDY is used) with
                -- a burst of 100 extra concurrent requests, that is, we delay
                -- requests under 300 concurrent connections and above 200
                -- connections, and reject any new requests exceeding 300
                -- connections.
                -- also, we assume a default request time of 0.5 sec, which can be
                -- dynamically adjusted by the leaving() call in log_by_lua below.
                local lim, err = limit_conn.new("my_limit_conn_store", 200, 100, 0.5)
                if not lim then
                    ngx.log(ngx.ERR,
                            "failed to instantiate a resty.limit.conn object: ", err)
                    return ngx.exit(500)
                end

                -- the following call must be per-request.
                -- here we use the remote (IP) address as the limiting key
                local key = ngx.var.binary_remote_addr
                local delay, err = lim:incoming(key, true)
                if not delay then
                    if err == "rejected" then
                        return ngx.exit(503)
                    end
                    ngx.log(ngx.ERR, "failed to limit req: ", err)
                    return ngx.exit(500)
                end

                if lim:is_committed() then
                    local ctx = ngx.ctx
                    ctx.limit_conn = lim
                    ctx.limit_conn_key = key
                    ctx.limit_conn_delay = delay
                end

                -- the 2nd return value holds the current concurrency level
                -- for the specified key.
                local conn = err

                if delay >= 0.001 then
                    -- the request exceeding the 200 connections ratio but below
                    -- 300 connections, so
                    -- we intentionally delay it here a bit to conform to the
                    -- 200 connection limit.
                    -- ngx.log(ngx.WARN, "delaying")
                    ngx.sleep(delay)
                end
            }

            # content handler goes here. if it is content_by_lua, then you can
            # merge the Lua code above in access_by_lua into your
            # content_by_lua's Lua handler to save a little bit of CPU time.

            log_by_lua_block {
                local ctx = ngx.ctx
                local lim = ctx.limit_conn
                if lim then
                    -- if you are using an upstream module in the content phase,
                    -- then you probably want to use $upstream_response_time
                    -- instead of ($request_time - ctx.limit_conn_delay) below.
                    local latency = tonumber(ngx.var.request_time) - ctx.limit_conn_delay
                    local key = ctx.limit_conn_key
                    assert(key)
                    local conn, err = lim:leaving(key, latency)
                    if not conn then
                        ngx.log(ngx.ERR,
                                "failed to record the connection leaving ",
                                "request: ", err)
                        return
                    end
                end
            }
        }
    }
}
root@kitploit:~
# demonstrate the usage of the resty.limit.traffic module
http {
    lua_shared_dict my_req_store 100m;
    lua_shared_dict my_conn_store 100m;

    server {
        location / {
            access_by_lua_block {
                local limit_conn = require "resty.limit.conn"
                local limit_req = require "resty.limit.req"
                local limit_traffic = require "resty.limit.traffic"

                local lim1, err = limit_req.new("my_req_store", 300, 200)
                assert(lim1, err)
                local lim2, err = limit_req.new("my_req_store", 200, 100)
                assert(lim2, err)
                local lim3, err = limit_conn.new("my_conn_store", 1000, 1000, 0.5)
                assert(lim3, err)

                local limiters = {lim1, lim2, lim3}

                local host = ngx.var.host
                local client = ngx.var.binary_remote_addr
                local keys = {host, client, client}

                local states = {}

                local delay, err = limit_traffic.combine(limiters, keys, states)
                if not delay then
                    if err == "rejected" then
                        return ngx.exit(503)
                    end
                    ngx.log(ngx.ERR, "failed to limit traffic: ", err)
                    return ngx.exit(500)
                end

                if lim3:is_committed() then
                    local ctx = ngx.ctx
                    ctx.limit_conn = lim3
                    ctx.limit_conn_key = keys[3]
                end

                print("sleeping ", delay, " sec, states: ",
                      table.concat(states, ", "))

                if delay >= 0.001 then
                    ngx.sleep(delay)
                end
            }

            # content handler goes here. if it is content_by_lua, then you can
            # merge the Lua code above in access_by_lua into your
            # content_by_lua's Lua handler to save a little bit of CPU time.

            log_by_lua_block {
                local ctx = ngx.ctx
                local lim = ctx.limit_conn
                if lim then
                    -- if you are using an upstream module in the content phase,
                    -- then you probably want to use $upstream_response_time
                    -- instead of $request_time below.
                    local latency = tonumber(ngx.var.request_time)
                    local key = ctx.limit_conn_key
                    assert(key)
                    local conn, err = lim:leaving(key, latency)
                    if not conn then
                        ngx.log(ngx.ERR,
                                "failed to record the connection leaving ",
                                "request: ", err)
                        return
                    end
                end
            }
        }
    }
}

Description

Cette bibliothèque fournit plusieurs modules Lua pour aider les utilisateurs d'OpenResty/ngx_lua à contrôler et limiter le trafic, que ce soit le débit des requêtes ou la concurrence des requêtes (ou les deux).

  • resty.limit.req fournit une limitation et un ajustement du débit des requêtes basés sur la méthode du « seau percé ».
  • resty.limit.count fournit une limitation du débit basée sur une implémentation à « fenêtre fixe » depuis OpenResty 1.13.6.1+.
  • resty.limit.conn fournit une limitation et un ajustement du niveau de concurrence des requêtes basés sur des délais supplémentaires.
  • resty.limit.traffic fournit un agrégateur pour combiner plusieurs instances des classes resty.limit.req, resty.limit.count ou resty.limit.conn (ou toutes).

Veuillez consulter la documentation propre à chacun de ces modules Lua pour plus de détails.

Cette bibliothèque offre des alternatives plus flexibles aux modules standard de NGINX ngx_limit_req et ngx_limit_conn. Par exemple, les limiteurs basés sur Lua fournis par cette bibliothèque peuvent être utilisés dans n'importe quel contexte, comme juste avant la procédure de poignée de main SSL côté aval (avec ssl_certificate_by_lua) ou juste avant l'émission de requêtes vers le backend.

Retour à la table des matières

Installation

Cette bibliothèque est activée par défaut dans OpenResty 1.11.2.2+.

Si vous devez installer cette bibliothèque manuellement, alors assurez-vous d'utiliser au moins OpenResty 1.11.2.1 ou une compilation personnalisée de nginx incluant ngx_lua 0.10.6+. De plus, vous devez configurer la directive lua_package_path afin d'ajouter le chemin de votre arborescence source lua-resty-limit-traffic au chemin de recherche des modules Lua de ngx_lua, comme suit :

root@kitploit:~
# nginx.conf
http {
    lua_package_path "/path/to/lua-resty-limit-traffic/lib/?.lua;;";
    ...
}

puis chargez l'un des modules fournis par cette bibliothèque dans Lua. Par exemple,

root@kitploit:~
local limit_req = require "resty.limit.req"

Retour à la table des matières

Communauté

Retour à la table des matières

Liste de diffusion en anglais

La liste de diffusion openresty-en est destinée aux anglophones.

Retour à la table des matières

Liste de diffusion en chinois

La liste de diffusion openresty est destinée aux sinophones.

Retour à la table des matières

Bogues et correctifs

Veuillez signaler les bogues ou soumettre des correctifs en

  1. créant un ticket sur le GitHub Issue Tracker,
  2. ou en publiant sur la communauté OpenResty.

Retour à la table des matières

Auteur

Yichun "agentzh" Zhang (章亦春) [email protected], OpenResty Inc.

Retour à la table des matières

Copyright et licence

Ce module est sous licence BSD.

Copyright (C) 2015-2019, par Yichun "agentzh" Zhang, OpenResty Inc.

Tous droits réservés.

La redistribution et l'utilisation sous forme source et binaire, avec ou sans modification, sont autorisées à condition que les conditions suivantes soient remplies :

  • Les redistributions du code source doivent conserver l'avis de droit d'auteur ci-dessus, cette liste de conditions et l'avertissement suivant.

  • Les redistributions sous forme binaire doivent reproduire l'avis de droit d'auteur ci-dessus, cette liste de conditions et l'avertissement suivant dans la documentation et/ou les autres matériels fournis avec la distribution.

CE LOGICIEL EST FOURNI PAR LES DÉTENTEURS DU DROIT D'AUTEUR ET LES CONTRIBUTEURS « TELS QUELS » ET TOUTE GARANTIE EXPRESSE OU IMPLICITE, Y COMPRIS, MAIS SANS S'Y LIMITER, LES GARANTIES IMPLICITES DE QUALITÉ MARCHANDE ET D'ADÉQUATION À UN USAGE PARTICULIER, EST DÉCLINÉE. EN AUCUN CAS LE DÉTENTEUR DU DROIT D'AUTEUR OU LES CONTRIBUTEURS NE POURRONT ÊTRE TENUS RESPONSABLES DE TOUT DOMMAGE DIRECT, INDIRECT, ACCESSOIRE, SPÉCIAL, EXEMPLAIRE OU CONSÉCUTIF (Y COMPRIS, MAIS SANS S'Y LIMITER, L'ACQUISITION DE BIENS OU DE SERVICES DE SUBSTITUTION ; UNE PERTE D'UTILISATION, DE DONNÉES OU DE PROFITS ; OU UNE INTERRUPTION D'ACTIVITÉ) QUELLE QU'EN SOIT LA CAUSE ET SUR TOUTE THÉORIE DE RESPONSABILITÉ, QU'IL S'AGISSE D'UN CONTRAT, D'UNE RESPONSABILITÉ STRICTE OU D'UN DÉLIT (Y COMPRIS LA NÉGLIGENCE OU AUTRE) DÉCOULANT DE L'UTILISATION DE CE LOGICIEL, MÊME SI LA POSSIBILITÉ DE TELS DOMMAGES A ÉTÉ SIGNALÉE.

Retour à la table des matières

Voir aussi

  • module resty.limit.req
  • module resty.limit.count
  • module resty.limit.conn
  • module resty.limit.traffic
  • le module ngx_lua : https://github.com/openresty/lua-nginx-module
  • OpenResty : https://openresty.org/

Retour à la table des matières

Télécharger l’outil