我需要通过代理连接所有东西,以便所有的Internet访问都通过代理路由。实际上,代理应该被转换成一种VPN类型。
我正在考虑类似于
--net=container
选项的东西,其中容器从另一个容器获取其网络。如何配置容器使所有内容都通过代理运行?
--net=container
选项的东西,其中容器从另一个容器获取其网络。Jan Garaj的评论实际上指引了我正确的方向。
正如我的问题所述,不是所有程序和命令都使用代理环境变量,因此简单地将http_proxy和https_proxy env变量传递给docker并不是一个解决办法。我需要一个解决方案,在这个方案中整个docker容器都通过代理在某些端口上发送每个网络请求。无论哪个程序或命令发出的请求,都要通过代理。
此Medium文章演示了如何构建和设置一个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地址。
您可以使用代理环境变量:
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)中配置默认的代理服务器。您可以在用户指南的网络部分找到有关此操作的说明
例如:
{
"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