首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使docker容器通过代理连接所有东西

如何使docker容器通过代理连接所有东西
EN

Stack Overflow用户
提问于 2022-02-03 12:28:47
回答 2查看 2.9K关注 0票数 2

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

我需要通过代理连接所有的东西,这样所有的互联网接入都是通过代理路由的。从本质上讲,代理应该转化为一种VPN。

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-02-13 10:09:13

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

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

中篇演示了如何构建和设置一个码头容器,该容器将在红袜的帮助下将所有ftp请求重定向到另一个作为代理的正在运行的停靠容器。容器之间的通信是通过码头网络进行的。

在我的例子中,我已经有一个正在运行的代理,所以我不需要一个码头网络和一个码头代理。另外,我需要代理http和https,而不是ftp。

通过更改配置文件,我可以让它正常工作。在本例中,我只需调用wget ipecho.net/plain来检索外部IP。如果它有效的话,这应该是代理的IP,而不是我真正的IP。

配置

Dockerfile:

代码语言:javascript
复制
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):

代码语言:javascript
复制
#!/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:

代码语言:javascript
复制
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;

}

构建容器

代码语言:javascript
复制
build -t proxy-via-iptables .

运行容器

代码语言:javascript
复制
docker run -i -t  --privileged -e PROXY_SERVER=x.x.x.x -e PROXY_PORT=xxxx proxy-via-iptables

用相关的编号替换代理服务器和端口。

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

票数 4
EN

Stack Overflow用户

发布于 2022-02-12 21:50:46

您可以使用代理env:

代码语言:javascript
复制
docker container run \
  -e HTTP_PROXY=http://username:password@proxy2.domain.com \
  -e HTTPS_PROXY=http://username:password@proxy2.domain.com \
 yourimage

如果希望在启动容器时自动使用代理服务器,可以在Docker配置文件(~/.docker/config.json)中配置默认代理服务器。您可以在“用户指南”中的“网络”部分找到这方面的https://docs.docker.com/network/proxy/

例如:

代码语言:javascript
复制
{
  "proxies": {
    "default": {
      "httpProxy": "http://username:password@proxy2.domain.com",
      "httpsProxy": "http://username:password@proxy2.domain.com"
    }
  }
}

要验证~/..docker/config.json配置是否有效,请启动容器并打印其env:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70971310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档