Docker redsocks代理在HTTP代理后面,没有互联网DNS

时间:2015-10-05 16:56:28

标签: proxy docker iptables

网络环境

  • 没有可用的互联网DNS
  • 企业squid代理允许端口3128上的HTTP和HTTPS流量

Docker Environment

Docker正在OS X上的VirtualBox内的Ubuntu 15.04客户机上运行。

在主机网络基础架构之上运行docker-forgetproxy的容器redsockshttps://github.com/k-labs/docker-forgetproxy),运行时间为:

$ docker run -it --rm --net=host --privileged \
                 -e http_proxy=$http_proxy \
                 -e https_proxy=$https_proxy \
                 klabs/docker-forgetproxy

通过发出$1设置为A的以下命令来修改主机的iptables规则:

iptables -t nat -$1 PREROUTING -i docker0 -d 127.0.0.0/8 -j RETURN
iptables -t nat -$1 PREROUTING -i docker0 -d 169.254.0.0/16 -j RETURN
iptables -t nat -$1 PREROUTING -i docker0 -d 172.16.0.0/12 -j RETURN
iptables -t nat -$1 PREROUTING -i docker0 -d 192.168.0.0/16 -j RETURN
iptables -t nat -$1 PREROUTING -i docker0 -d 224.0.0.0/4 -j RETURN
iptables -t nat -$1 PREROUTING -i docker0 -d 240.0.0.0/4 -j RETURN

iptables -t nat -$1 PREROUTING -p tcp --dport 80   -i docker0 -j REDIRECT --to 12345 2>/dev/null
iptables -t nat -$1 PREROUTING -p tcp --dport 8080 -i docker0 -j REDIRECT --to 12345 2>/dev/null
iptables -t nat -$1 PREROUTING -p tcp --dport 53   -i docker0 -j REDIRECT --to 5300
iptables -t nat -$1 PREROUTING -p tcp -i docker0 -j REDIRECT --to 12346

启动redsocks并使用

启动
base {
  log_debug = off;
  log_info = on;
  log = "stderr";
  daemon = off;
  user = redsocks;
  group = redsocks;
  redirector = iptables;
}

redsocks {
  type = http-relay;
  ip = http://my-proxy;
  port = 3128;
  local_ip = 0.0.0.0;
  local_port = 12345;
}

redsocks {
  type = http-connect;
  ip = http://my-proxy;
  port = 3128;
  local_ip = 0.0.0.0;
  local_port = 12346;
}

dnstc {
    local_ip = 127.0.0.1;
    local_port = 5300;
}

问题

当我使用docker run -it --rm ubuntu apt-get update启动新的docker容器时,容器的请求似乎没有被重新路由到redsocks容器。

在wireshark上查看数据包,如果我设置了DNS,apt-get容器中的archive.ubuntu.com的DNS解析会尝试转到我的域DNS服务器(无法执行互联网查找)服务器到docker0 iface的服务器似乎它被172.16.0.0/12 iptables规则捕获,因为今天它是172.17.42.1

1 个答案:

答案 0 :(得分:0)

这适用于 Ubuntu Xenial 主机。

在您的主机上,在“连接信息”下,获取您当前的DNS地址;就我而言,172.21.17.212172.21.17.210

/etc/default/docker下,在DOCKER_OPTS上添加DNS地址:

DOCKER_OPTS="--dns 172.21.17.212 --dns 172.21.17.210"

使用以下内容创建/etc/systemd/system/docker.service.d/ubuntu.conf

[Service]
EnvironmentFile=/etc/default/docker
ExecStart=
ExecStart=/usr/bin/docker daemon -H fd:// $DOCKER_OPTS

然后:

sudo systemctl daemon-reload
sudo systemctl restart docker