Docker正在OS X上的VirtualBox内的Ubuntu 15.04客户机上运行。
在主机网络基础架构之上运行docker-forgetproxy
的容器redsocks
(https://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
答案 0 :(得分:0)
这适用于 Ubuntu Xenial 主机。
在您的主机上,在“连接信息”下,获取您当前的DNS地址;就我而言,172.21.17.212
和172.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