首页 文章

HaProxy动态列表/ Map

提问于
浏览
0

我'm trying to get CORS working with a whitelist of domains based on the customers that exist in our system. We have a whitelabelled product that let'是公司CNAME我们系统的自定义域名 . 我们需要能够通过在HaProxy的响应中添加一个 Access-Control-Allow-Origin: http://some.custom.domain 标头来允许来自任何这些自定义域的 Origin .

我一直在阅读从haproxy加载列表/ Map 的不同方法,但我还没有确定最好的实现 . 我已经提出了大约3种可能的方法,但我想看看是否有其他人也有一些见解 . 我到目前为止的选择:

  • 存储map可用的域名,我可以在添加 Headers 时查找 . 此 Map 文件如何填充是目前的问题 . 我想我可以在启动时通过LUA进行API调用来创建文件?或者它可能是NFS挂载的文件?每次将新域添加到我们的系统时,我们都必须重新加载,通过相同的api调用或直接添加到套接字上的maps api .

  • 使用LUA通过haproxy在每个任务上向api发出实时请求,以验证在 Origin 上传入的域是否合法并添加头 . 如果我们可以为memcached找到LUA客户端库,可能会使用Memcached以获得最小的开销 .

  • 可能实现某种基于DNS的解决方案,我们运行自己的DNS服务器来解析这些自定义域并让HaProxy对其进行查找 . 我不知道这是否可能,我知道haproxy有DNS功能 . 奇怪的是,我们实际上并不想解析为IP,我们只想要一个“是”或“否”的答案 .

有没有其他人知道这个问题的明显解决方案?我正在寻找易于实现,但最终对请求本身的开销最小,因为这将需要在带有 Origin 标头的每个请求上发生 .

有任何见解赞赏!

1 回答

  • 0

    1/ Map solution:
    我认为最简单和最有效的解决方案是将可用域存储在 Map 中 . 然后你可以通过HAProxy套接字使用set mapadd map来更新 Map . 每当域名发生变化时,都不需要在这里重新加载 .

    2/ LUA solution:
    也可以使用LUA使用这样的函数来完成它:

    core.register_action("validate_origin", {"http-req"}, function(txn)
       local origin= txn.http:req_get_headers()headers["origin"][0]
       local sock = core.tcp()
       sock:connect("<API-IP>", <API-PORT>)
       sock:send("GET /api?validate=".. origin .. " HTTP/1.1\r\n Host:www\r\n ")
       domain = sock:receive("*a")
       sock:close()
       txn:set_var("txn.allow_origin", domain)
    end)
    

    有问题的前端有HAProxy conf:

    http-request capture hdr("Origin") len 128
    http-request lua.validate_origin if  { capture.req.hdr(0) -m found }
    http-response add-header Access-Control-Allow-Origin %[var(txn.allow_origin)] if  { capture.req.hdr(0) -m found }
    

    此解决方案引入了更多开销,因为HAProxy必须依赖于每个CORS请求的外部资源(并可能等待它) .

相关问题