Created
February 7, 2019 04:07
-
-
Save zerog2k/6a4add502ca4625adaf08021f5a87631 to your computer and use it in GitHub Desktop.
poc of openresty config to dynamically route udp traffic to backends with ip whitelisting, based upon data stored in redis
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
worker_processes 1; | |
error_log logs/error.log; | |
events { | |
worker_connections 1024; | |
} | |
stream { | |
lua_shared_dict config 10m; | |
init_worker_by_lua_block { | |
local config = ngx.shared.config | |
config:set("serverport", 0) | |
local function redis_config_fetcher (called_premature) | |
if called_premature then | |
return | |
end | |
local redis = require "resty.redis" | |
local cjson = require "cjson" | |
local config = ngx.shared.config | |
local red = redis:new() | |
red:set_timeout(1000) | |
local ok, err = red:connect("127.0.0.1", 6379) | |
if not ok then | |
ngx.log(ngx.ERR, err) | |
return | |
end | |
local hkey | |
for inport=20001,20003,1 do | |
hkey = "target:"..inport | |
local result, err = red:hmget(hkey,"host","port","allowip") | |
if not result then | |
ngx.log(ngx.ERR, err) | |
break | |
end | |
-- set shared dict | |
local hostsuccess, hosterr, hostforcible = config:set(hkey..":host", result[1]) | |
local portsuccess, porterr, hostforcible = config:set(hkey..":port", result[2]) | |
local allowipsuccess, allowiperr, allowipforcible = config:set(hkey..":allowip", result[3]) | |
-- check dict set success? | |
end | |
local ok, err = red:close() | |
end | |
local handle, err = ngx.timer.every(5, redis_config_fetcher) | |
} | |
upstream test_backend_1 { | |
server localhost:10000; | |
balancer_by_lua_block { | |
local balancer = require "ngx.balancer" | |
local host = "127.0.0.1" | |
local port = 10000 | |
local config = ngx.shared.config | |
local myport = ngx.var.server_port | |
local key = "target:"..myport | |
local targethost, flags = config:get(key..":host") | |
local targetport, flags = config:get(key..":port") | |
local ok, err = balancer.set_current_peer(targethost, targetport) | |
if not ok then | |
ngx.log(ngx.ERR, "failed to set peer: ", err) | |
return ngx.exit(ngx.ERROR) | |
end | |
} | |
} | |
server { | |
listen 20001 udp; | |
listen 20002 udp; | |
listen 20003 udp; | |
preread_by_lua_block { | |
local config = ngx.shared.config | |
local myport = ngx.var.server_port | |
local key = "target:"..myport | |
local targetallowip, flags = config:get(key..":allowip") | |
if ngx.var.remote_addr ~= targetallowip then | |
ngx.exit(ngx.ERROR) | |
end | |
} | |
proxy_pass test_backend_1; | |
} | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment