如何中继来自 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"
您还可以使用 YAML 或 TOML 中的其他配置文件,一切都在文档中显示。
要将 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
(或任何其他值)上。
我有一个 运行 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"
您还可以使用 YAML 或 TOML 中的其他配置文件,一切都在文档中显示。
要将 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
(或任何其他值)上。