如何中继来自 docker 容器的出站请求以修改 headers?

How to relay outbound request from docker container to modify headers?

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

/// @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 应用程序为 运行 的主机中修改请求的 header。

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

您对这次手术有什么建议吗?

你可以使用 Traefik reverse proxy v2.4+ with Traefik Pilot enabled and a plugin like Header transformation.

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

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 中的其他配置文件,一切都在文档中显示。

要将 header 添加到传出的 响应 ,只需使用 add_header 指令:

location /foo/ {
  add_header name "value";
  proxy_pass http://my-legacy-app;
}

要将 header 添加到传出 请求 ,您可以尝试转发代理:

server {
  listen 127.0.0.121:80;
  
  location / {
    proxy_add_header name "value";
    proxy_pass http://$http_host$request;
  }
}

如果您可以让您的应用程序将所有传出请求发送到 127.0.0.121:80(转发代理)而不是实际目标,这将起作用。例如,您可以使旧版应用程序容器使用专用 DNS 服务器,这将表明每个主机都在 127.0.0.121(或任何其他值)上。