
рдпрд╣ рдкреЛрд╕реНрдЯ
рдирдЧрдиреЗрдХреНрд╕ рдореЗрдВ рд▓реБрдЖ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдирд┐рд░рдВрддрд░рддрд╛ рд╣реИ ред
рдЙрдиреНрд╣реЛрдВрдиреЗ рд╕реНрдореГрддрд┐ рдореЗрдВ рдХреИрд╢рд┐рдВрдЧ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА, рдФрд░ рдпрд╣рд╛рдБ рдиреБрдЖрдиреЗрдХреНрд╕-рдмреИрд▓реЗрдиреНрд╕рд░ рдкрд░ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдлрд╝рд╛рдпрд░рд╡реЙрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реБрдЖ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
2GIS рдореЗрдВ рднреА рдХреБрдЫ рдРрд╕рд╛ рд╣реА рдерд╛ ред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдкрдиреА рдмрд╛рдЗрдХ рд╣реИ :) рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЧрддрд┐рд╢реАрд▓рддрд╛ рдФрд░ рд╕реНрдЯреИрдЯрд┐рдХреНрд╕ рд╕рд╛рдЭрд╛ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо NAT рдФрд░ рд╕рдлреЗрдж рд╕реВрдЪреА рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред рдФрд░, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдЖрдк рд╣рдореЗрд╢рд╛ рдХреБрдЫ рдФрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрд░реНрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред
рдпрд╣ рдпреЛрдЬрдирд╛ рдЕрдм рдЪреБрдкрдЪрд╛рдк рдФрд░ рдЕрдирд╛рдпрд╛рд╕ (рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рд╕реАрдкреАрдпреВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддреА рд╣реИ), рдпрд╣ рд▓рдЧрднрдЧ 1200 рдЕрдиреБрд░реЛрдзреЛрдВ / рд╕реЗрдХрдВрдб рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рддреА рд╣реИред рд╕реАрдорд╛ рдорд╛рдиреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╢рд╛рдпрдж, рд╕реМрднрд╛рдЧреНрдп рд╕реЗ :)
рдореИрдВ рд░рд╕реАрдж рдкрд░ рддреБрд░рдВрдд рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдФрд░ рдПрдХреНрд╕реЗрд╕_рд▓реЙрдЧ рдореЗрдВ рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рддрдереНрдп рдкрд░ рдирд╣реАрдВ (рдЬреЛ рдЕрднреА рднреА рдЙрд╕реА рд╕реНрдЯреИрдЯрд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП рдмрдВрдж рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рдХреЛрдИ рд╕рд╡рд╛рд▓ рдирд╣реАрдВ, рд╣рдо рдкреВрд░реЗ http рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░ рд╣реИрдВрдбрд▓рд░ рдХреЛ рд▓рдЯрдХрд╛рддреЗ рд╣реИрдВ:
http { include lua/req.conf; }
рдЕрдм nginx рдкрд░ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдЕрдиреБрд░реЛрдз рд╣рдорд╛рд░реЗ req.lua рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдПрдВрдЧреЗред
рдЗрд╕реА рд╕рдордп, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХреА рдЧрдИ рд╕реВрдЪреА (рдиреАрдЪреЗ рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг) рдХреА рд╕реВрдЪреА рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдЯреЗрдмрд▓ req_limit рдФрд░ ban_list рд╣реИрдВред
рдФрд░ рдЖрдИрдкреА рдкрд░ рд╢реНрд╡реЗрддрд╕реВрдЪреА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рд╛рдЗрдХрд┐рд▓ рдХреЗ рдмрдЬрд╛рдп, рдЬрд┐рдпреЛ рдирдЧрдиреЗрдХреНрд╕ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рдореЗрдВ lua_req_whitelist рдЪрд░ рдХрд╛ рдореВрд▓реНрдп рдиреАрдЪреЗ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
if ngx.var.lua_req_whitelist ~= '1' then
рд╕реНрдЯреЗрдЯрд┐рдХреНрд╕ / рдбрд╛рдпрдирд╛рдорд┐рдХреНрд╕ (рдбрд┐рд╕реНрдХ / рдмреИрдХрдПрдВрдб рд╕рд░реНрд╡рд░ рдкрд░ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз) рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдиреБрд░реЛрдзрд┐рдд рдлрд╝рд╛рдЗрд▓ рдХреЗ рдирд╛рдо рдкрд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ (рдпрд╣рд╛рдВ рдЖрдк рдЕрдкрдиреЗ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЬрдЯрд┐рд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ):
function string.endswith(haystack, needle) return (needle == '') or (needle == string.sub(haystack, -string.len(needle))) end local function path_is_static(path) local exts = {'js', 'css', 'png', 'jpg', 'jpeg', 'gif', 'xml', 'ico', 'swf'} path = path:lower() for _,ext in ipairs(exts) do if path:endswith(ext) then return true end end return false end local uri_path = ngx.var.request_uri if ngx.var.is_args == '?' then uri_path = uri_path:gsub('^([^?]+)\\?.*$', '%1') end local is_static = path_is_static(uri_path)
рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ NAT рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, IP рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЙрдирдХреЗ UserAgent рдХреЛ рднреА рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХреБрдХреА рдЬреЛрдбрд╝реА рдЬрд╛рддреА рд╣реИред рдПрдХ рдкреВрд░реЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рднреА рддреАрди рддрддреНрд╡ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдИрдбреА рдмрдирд╛рддреЗ рд╣реИрдВред рдпрджрд┐ рдХреБрдЫ рдЦрд▓рдирд╛рдпрдХ рд╕рд░реНрд╡рд░ рдХреЛ рдЦреЛрдЦрд▓рд╛ рдХрд░ рджреЗрддреЗ рд╣реИрдВ, рд╕рдВрдЪрд╛рд░рд┐рдд рдХреБрдХреА рдХреА рдЕрдирджреЗрдЦреА рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЗрд╕рдХреЗ рдЖрдИрдкреА / рд╕рдмрдиреЗрдЯ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕реА рд╕рдордп, рдЗрд╕ рд╕рдмрдиреЗрдЯ рд╕реЗ рдЙрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреБрдХреА рдкреНрд░рд╛рдкреНрдд рдХрд░ рдЪреБрдХреЗ рд╣реИрдВ, рдЪреБрдкрдЪрд╛рдк рдЖрдЧреЗ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ (рдЖрдИрдкреА рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рдЫреЛрдбрд╝рдХрд░)ред рд╕рдорд╛рдзрд╛рди рд╕рд╣реА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдЖрдзреЗ рджреЗрд╢ / рдореЛрдмрд╛рдЗрд▓ рдСрдкрд░реЗрдЯрд░ рдХреЛ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЧрд┐рдирдиреЗ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИред
рдХреБрдХреАрдЬрд╝ рдХрд╛ рд╕реГрдЬрди рдФрд░ рд╕рддреНрдпрд╛рдкрди:
local function gen_cookie_rand() return tostring(math.random(2147483647)) end local function gen_cookie(prefix, rnd) return ngx.encode_base64(
рдЕрдм key_prefix рдореЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЕрдиреБрд░реЛрдз рд╣рдо рдкреНрд░реЛрд╕реЗрд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрджрд┐ рдЗрд╕ рдЧреНрд░рд╛рд╣рдХ рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░рддрд┐рдмрдВрдз рд╣реИ, рддреЛ рдЖрдЧреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ:
local ban_key = key_prefix..':ban' if ban_list:get(ban_key) or ban_list:get(ip..':ban') then
рд╣рдореЗрдВ рдХреБрдВрдЬреА рдорд┐рд▓реА, рд╣рдордиреЗ рдкреНрд░рддрд┐рдмрдВрдз рдХреА рдЬрд╛рдВрдЪ рдХреА, рдЕрдм рд╣рдо рдпрд╣ рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдЕрдиреБрд░реЛрдз рд╕реАрдорд╛ рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИ:
рд╣рдо рдХрд╛рдЙрдВрдЯрд░реЛрдВ рдХреЗ 4 рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ: рд╕реНрдерд┐рд░ / рдЧрддрд┐рд╢реАрд▓рддрд╛, рдПрдХ рдкрде / рдЕрд▓рдЧред рд╕реАрдзреА рдЬрд╛рдБрдЪ check_limit_exerate () рдореЗрдВ рдХреА рдЬрд╛рддреА рд╣реИ:
local function check_limit_exhaust(key, limit, cnt_ttl) local key_ts = key..':ts' local cnt, _ = req_limit:incr(key, 1)
Lua_req_ban_ttl рд╕реЗрдХрдВрдб рдХреЗ рд▓рд┐рдП рд╕реАрдзреЗ рдкреНрд░рддрд┐рдмрдВрдз рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рд╕реНрдерд╛рдпреА рднрдВрдбрд╛рд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ IP рджреНрд╡рд╛рд░рд╛ iptables / analogues рдкрд░ рд▓реЙрдЧрд┐рдВрдЧ рдФрд░ рдЕрдЧреНрд░реЗрд╖рдг рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд┐рд╖рдп рд╣реИред
рдпрд╣ рд╕рдм, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдХреЗрд╡рд▓ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рди рдХрд┐ рдПрдХ рдЪрд╛рдВрджреА рдХреА рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рдмреБрд▓реЗрдЯред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реАрдорд╛ рдХреА рджреА рдЧрдИ рд╕рдВрдЦреНрдпрд╛ рдЫрдд рд╕реЗ рдЗрдВрдЧрд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред
рд╣реЗрдбрд░ рдореЗрдВ рдЫрд╡рд┐ рдпрд╣рд╛рдВ рд╕реЗ рд▓реА рдЧрдИ рд╣реИ ред