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.212
和172.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