如何让 docker 容器通过代理连接一切
How to make docker container connect everything through proxy
我知道可以将 http_proxy 和 https_proxy 环境变量传递给容器,如示例所示。 。但是,这仅适用于 wget 和 curl 等代理感知命令,因为它们仅读取和使用这些环境变量。
我需要通过代理连接所有内容,以便所有互联网访问都通过代理路由。本质上应该把proxy改造成一种VPN。
我正在考虑类似于 --net=container
选项的内容,其中容器从另一个容器获取网络。
如何配置容器以通过代理 运行 一切?
您可以使用代理环境变量:
docker container run \
-e HTTP_PROXY=http://username:password@proxy2.domain.com \
-e HTTPS_PROXY=http://username:password@proxy2.domain.com \
yourimage
如果你想在启动容器时自动使用proxy-server,你可以在Docker CLI 配置文件中配置默认的proxy-servers (~/.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
Jan Garaj 的评论实际上为我指明了正确的方向。
如我的问题所述,并非所有程序和命令都使用代理环境变量,因此简单地将 http_proxy 和 https_proxy 环境变量传递给 docker 不是解决方案。我需要一个解决方案,其中整个 docker 容器通过代理引导 每个 网络请求(在某些端口上)。无论是哪个程序或命令。
Medium article demonstrates how to build and setup a docker container that, by the help of redsocks 会将所有 ftp 请求重定向到另一个作为代理的 运行 docker 容器。容器之间的通信是通过 docker 网络完成的。
在我的例子中,我已经有一个 运行 代理,所以我不需要 docker 网络和 docker 代理。此外,我需要代理 http 和 https,而不是 ftp。
通过更改配置文件,我让它工作了。在此示例中,我只是调用 wget ipecho.net/plain
来检索我的外部 IP。如果可以,这应该是代理的IP,不是我的真实IP。
配置
Docker 文件:
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,这取决于它是如何失败的。
我知道可以将 http_proxy 和 https_proxy 环境变量传递给容器,如示例所示。
我需要通过代理连接所有内容,以便所有互联网访问都通过代理路由。本质上应该把proxy改造成一种VPN。
我正在考虑类似于 --net=container
选项的内容,其中容器从另一个容器获取网络。
如何配置容器以通过代理 运行 一切?
您可以使用代理环境变量:
docker container run \
-e HTTP_PROXY=http://username:password@proxy2.domain.com \
-e HTTPS_PROXY=http://username:password@proxy2.domain.com \
yourimage
如果你想在启动容器时自动使用proxy-server,你可以在Docker CLI 配置文件中配置默认的proxy-servers (~/.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
Jan Garaj 的评论实际上为我指明了正确的方向。
如我的问题所述,并非所有程序和命令都使用代理环境变量,因此简单地将 http_proxy 和 https_proxy 环境变量传递给 docker 不是解决方案。我需要一个解决方案,其中整个 docker 容器通过代理引导 每个 网络请求(在某些端口上)。无论是哪个程序或命令。
Medium article demonstrates how to build and setup a docker container that, by the help of redsocks 会将所有 ftp 请求重定向到另一个作为代理的 运行 docker 容器。容器之间的通信是通过 docker 网络完成的。
在我的例子中,我已经有一个 运行 代理,所以我不需要 docker 网络和 docker 代理。此外,我需要代理 http 和 https,而不是 ftp。
通过更改配置文件,我让它工作了。在此示例中,我只是调用 wget ipecho.net/plain
来检索我的外部 IP。如果可以,这应该是代理的IP,不是我的真实IP。
配置
Docker 文件:
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,这取决于它是如何失败的。