openresty 고주파 IP 자동 차단
location /redis_forbid {
default_type 'text/html';
access_by_lua_file lua/intercept.lua;
content_by_lua_block {
ngx.say("access")
}
}
intercept.lua
local redis = require("resty.redis")
local conn = redis:new()
conn:set_timeout(10000)
local redis_ip = "192.168.138.129"
local redis_port = 6379
local ok , err = conn:connect(redis_ip,redis_port)
if not ok then
ngx.say("connect to redis fatal error: " ,err)
return redis_close(conn)
end
-- ngx.exit(ngx.ERR)
local ttl = 60 -- key
local top_times = 10
local forbit_ttl = 100 --60
local ip = ngx.var.remote_addr
local ip_total_times = conn:get(ip)
print("debug...................................." , conn:ttl(ip))
if ip_total_times ~= ngx.null then
if (ip_total_times == "-1") then
return ngx.exit(403)
else
this_ttl = conn:ttl(ip)
if (this_ttl == -1) then --
conn:set(ip,0)
conn:expire(ip,ttl)
return ngx.exit(ngx.OK)
end
v_times = tonumber(conn:get(ip)) + 1
if (v_times > top_times) then
conn:set(ip,-1)
conn:expire(ip,forbit_ttl)
return ngx.exit(ngx.OK)
else
print("debug 03")
conn:set(ip,v_times)
conn:expire(ip,this_ttl) --
return ngx.exit(ngx.OK)
end
end
else
print("key is not exists")
conn:set(ip,1)
conn:expire(ip,ttl)
return ngx.exit(ngx.OK) --step done, access_by_lua_file , content_by_lua_file
end
재 작성 테스트 프로그램
package main
import (
"net/http"
"fmt"
"io/ioutil"
"os"
)
func main() {
for i := 1 ; i<= 20 ;i++ {
resp,err := http.Get("http://192.168.138.128/redis_forbid")
defer resp.Body.Close()
if err != nil {
os.Exit(-1)
}
//time.Sleep(1*time.Second)
body, _ := ioutil.ReadAll(resp.Body)
fmt.Println("i is", i)
fmt.Println(string(body))
}
}
결 과 는 다음 과 같 습 니 다.
i is 12
403 Forbidden
403 Forbidden
openresty/1.13.6.2
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.