Docker Redsocks代理服务器在HTTP代理之后,没有互联网DNS

networking环境

  • 没有互联网DNS可用
  • 公司squid代理允许端口3128上的HTTP和HTTPSstream量

Docker环境

Docker在OS X上的VirtualBox中的Ubuntu 15.04 guest上运行。

容器docker-forgetproxy ( https://github.com/k-labs/docker-forgetproxy )在主机的networking基础架构之上运行redsocks ,运行:

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

这通过发出以下命令修改主机的iptables规则,其中$1被设置为A

 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推出的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集装箱docker run -it --rm ubuntu apt-get update似乎容器的请求不会重新路由到redsocks容器。

在wireshark上观看数据包,看起来来自apt-get容器的archive.ubuntu.com的DNSparsing尝试转到我的域名DNS服务器(无法执行Internet查找),如果我将DNS服务器设置为docker0 iface它似乎被172.16.0.0/12 iptables规则捕获,从今天起它是172.17.42.1

这适用于Ubuntu Xenial主机。

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

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

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

使用以下命令创build/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