首页 > 解决方案 > 如何中继来自 docker 容器的出站请求以修改标头?

问题描述

我有一个在配置有 NGINX 反向代理的 Docker 中运行的应用程序。该应用程序是二进制文件,我没有源代码,也无法从应用程序本身修改 HTTP 请求的标头。我的目标是在请求从主机发出之前附加一个标头字段:

/// @dev some http proxy or similar
listener(PORT, function(request) {
  // 1) modifies header
  request.setHeader('FOO', 'bar')
  // 2) passes through to original or intended destination
  request.continue()
})

关键是在运行 Docker 应用程序的主机中修改请求的标头。

我查看了 MITM 代理并使用 iptables 或 socat 重新路由 Docker 出站流量。

您对此操作有什么建议吗?

标签: dockeriptableshttp-proxynetcatsocat

解决方案


你可以使用Traefik 反向代理v2.4+ 并启用Traefik Pilot和像Header transformation这样的插件。

您将Traefik作为一个容器运行,它将流量路由到其他容器。然后,您可以使用启用插件的令牌将您的实例链接到Traefik Pilot 。如果您在docker-compose.yml文件中使用标签:

services:
    traefik:
        # ...
        labels:
         - "--pilot.token=XXXXXXXX"
         # ...

要添加插件,您还可以将标签添加到Traefik服务和您的应用程序:

services:
    traefik:
        # ...
        labels:
         # ...
         - "--entrypoints.web.address=:80"
         - "--pilot.token=XXXXXXXX"
         - "--experimental.plugins.htransformation.modulename=github.com/tommoulard/htransformation"
         - "--experimental.plugins.htransformation.version=v0.2.3"

    your_service:
        # ...
        labels:
         - "traefik.enable=true"
         - "traefik.http.routers.your_service.rule=Host(`some.host`)"
         - "traefik.http.routers.your_service.entrypoints=web"
         - "traefik.http.routers.your_service.middlewares=add_header"
         - "traefik.http.middlewares.add_header.plugin.htransformation.Rules[0].Name=set_foo"
         - "traefik.http.middlewares.add_header.plugin.htransformation.Rules[0].Header=FOO"
         - "traefik.http.middlewares.add_header.plugin.htransformation.Rules[0].Value=bar"
         - "traefik.http.middlewares.add_header.plugin.htransformation.Rules[0].Type=Set"

您还可以使用YAMLTOML中的其他配置文件,所有内容都显示在文档中。


推荐阅读