【问题标题】:How to make docker container connect everything through proxy如何让docker容器通过代理连接一切
【发布时间】:2022-02-13 18:09:13
【问题描述】:

我知道可以将 http_proxy 和 https_proxy 环境变量传递给容器,如示例所示。 this SO answer。但是,这仅适用于 wget 和 curl 等代理感知命令,因为它们只是读取和使用这些环境变量。

我需要通过代理连接一切,以便所有互联网访问都通过代理路由。本质上,代理应该变成一种VPN。

我正在考虑类似于--net=container 选项的东西,其中容器从另一个容器获取其网络。

如何配置容器以通过代理运行所有内容?

【问题讨论】:

  • 也许你可以像这个问题的答案一样更改默认路由:stackoverflow.com/questions/36882945/…
  • @HansKilian 如何更改默认路由以使用像 username:password@proxy2.domain.com 这样的代理?任何想法表示赞赏:)
  • 如果我理解正确,您想将所有容器放在代理后面吗?如果是这种情况,我会将它们全部放在他们自己的虚拟网络上,以及一个 nginx 容器,该容器在它自己的端点上公开你的每个容器。
  • @JanGaraj 您的链接实际上提供了有价值的信息。我想我可以从那里相处。

标签: docker proxy


【解决方案1】:

Jan Garaj 的评论实际上为我指明了正确的方向。

正如我的问题所述,并非所有程序和命令都使用代理环境变量,因此简单地将 http_proxy 和 https_proxy 环境变量传递给 docker 并不是解决方案。我需要一个解决方案,其中整个 docker 容器通过代理引导 每个 网络请求(在某些端口上)。无论是哪个程序或命令。

Medium article 演示了如何构建和设置一个 docker 容器,在redsocks 的帮助下,它将所有 ftp 请求重定向到另一个作为代理运行的 docker 容器。容器之间的通信是通过 docker 网络完成的。

就我而言,我已经有一个正在运行的代理,所以我不需要 docker 网络和 docker 代理。另外,我需要代理 http 和 https,而不是 ftp。

通过更改配置文件,我得到了它的工作。在此示例中,我只需调用 wget ipecho.net/plain 即可检索我的外部 IP。如果有效,这应该是代理的 IP,而不是我的真实 IP。

配置

Dockerfile:

FROM debian:latest
LABEL maintainer="marlar"
WORKDIR /app
ADD . /app
RUN apt-get update
RUN apt-get upgrade -qy
RUN apt-get install iptables redsocks curl wget lynx -qy
COPY redsocks.conf /etc/redsocks.conf
ENTRYPOINT /bin/bash run.sh

设置脚本(run.sh):

#!/bin/bash
echo "Configuration:"
echo "PROXY_SERVER=$PROXY_SERVER"
echo "PROXY_PORT=$PROXY_PORT"
echo "Setting config variables"
sed -i "s/vPROXY-SERVER/$PROXY_SERVER/g" /etc/redsocks.conf
sed -i "s/vPROXY-PORT/$PROXY_PORT/g" /etc/redsocks.conf
echo "Restarting redsocks and redirecting traffic via iptables"
/etc/init.d/redsocks restart
iptables -t nat -A OUTPUT -p tcp --dport 80 -j REDIRECT --to-port 12345
iptables -t nat -A OUTPUT -p tcp --dport 443 -j REDIRECT --to-port 12345
echo "Getting IP ..."
wget -q -O- https://ipecho.net/plain

redsocks.conf:

base {
 log_debug = off;
 log_info = on;
 log = "file:/var/log/redsocks.log";
 daemon = on;
 user = redsocks;
 group = redsocks;
 redirector = iptables;
}
redsocks {
 local_ip = 127.0.0.1;
 local_port = 12345;
 ip = vPROXY-SERVER;
 port = vPROXY-PORT;
 type = http-connect;

}

构建容器

build -t proxy-via-iptables .

运行容器

docker run -i -t  --privileged -e PROXY_SERVER=x.x.x.x -e PROXY_PORT=xxxx proxy-via-iptables

将代理服务器和端口替换为相关编号。

如果容器工作并使用外部代理,wget 应该输出代理的 IP即使 wget 命令不使用-e use_proxy=yes 选项。如果它不起作用,它会给你自己的IP。或者可能根本没有 IP,这取决于它是如何失败的。

【讨论】:

    【解决方案2】:

    您可以使用代理环境变量:

    docker container run \
      -e HTTP_PROXY=http://username:password@proxy2.domain.com \
      -e HTTPS_PROXY=http://username:password@proxy2.domain.com \
     yourimage
    

    如果您希望在启动容器时自动使用代理服务器,您可以在 Docker CLI 配置文件 (~/.docker/config.json) 中配置默认​​代理服务器。您可以在用户指南的网络部分找到instructions

    例如:

    {
      "proxies": {
        "default": {
          "httpProxy": "http://username:password@proxy2.domain.com",
          "httpsProxy": "http://username:password@proxy2.domain.com"
        }
      }
    }
    

    要验证 ~/.docker/config.json 配置是否正常工作,请启动一个容器并打印其环境:

    docker container run --rm busybox env
    
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    HOSTNAME=220e4df13604
    HTTP_PROXY=http://username:password@proxy2.domain.com
    http_proxy=http://username:password@proxy2.domain.com
    HTTPS_PROXY=http://username:password@proxy2.domain.com
    https_proxy=http://username:password@proxy2.domain.com
    HOME=/root
    

    【讨论】:

    • 不幸的是,使用代理环境变量并不能像我的问题中所说的那样工作。并非所有程序都使用变量。我需要整个容器将所有内容重定向到代理。
    猜你喜欢
    • 1970-01-01
    • 2015-09-19
    • 2017-04-25
    • 2017-02-24
    • 2021-02-03
    • 2015-05-22
    • 2017-06-30
    • 1970-01-01
    • 2019-03-07
    相关资源
    最近更新 更多