Skip to content

Instantly share code, notes, and snippets.

@zerog2k
Created February 7, 2019 04:07
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zerog2k/6a4add502ca4625adaf08021f5a87631 to your computer and use it in GitHub Desktop.
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
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