Privoxy Docker SSH Tunneling

备注

本文是一个快捷构建Docker容器自由上网的方案,是多个技术的组合方案

目的是方便我的 Gentoo Linux 容器使用。对于其他发行版或环境也是通用的 配置Docker使用代理 方案。

我在 Android 手机上采用 Privoxy Android SSH Tunneling 也是一种简洁的通用方法,例如,对于物理主机运行 Gentoo Linux 是非常容易设置 SSH Tunneling: 动态端口转发Firefox 设置 越过长城 。但是,对于 Gentoo Docker 众多的虚拟容器,显然也需要一个通用的代理方式,以满足容器的无阻碍访问互联网:

  • 物理主机启动 SSH Tunneling: 动态端口转发 提供本地回环地址 socks 代理

  • 物理主机 Gentoo Linux 上安装 Privoxy代理服务 并设置上游代理为本地 socks5 代理,这样只要访问这个 privoxy 的客户端都能科学上网: 注意 privoxy 仅对以下2个地址绑定服务:

    • 127.0.0.1 本地回环地址

    • 172.17.0.1 Docker的NAT网络地址,这样运行容器访问这个IP地址 8118 就能够使用物理主机代理

  • 配置 Docker客户端的Proxy ,这样每个运行的docker容器都会注入代理配置

启动SSH Tunneling

  • 在物理主机上执行简单的一条命令构建起本地socks代理,创建SSH Tunnel:

执行一条命令建立起动态端口转发的翻墙ssh tunnel
ssh -D 1080 -C user@vpn.example.com

安装和运行privoxy

  • 我的 Gentoo Linux 安装 privoxy (其他发行版安装方法不同,但后续配置方法相同):

Gentoo Linux 上安装 privoxy
emerge --ask net-proxy/privoxy
  • 配置 /etc/privoxy/config 设置绑定IP以及上游socks5代理:

/etc/privoxy/config 设置绑定IP以及上游socks5代理
...
listen-address  127.0.0.1:8118
listen-address  172.17.0.1:8118
...
permit-access  localhost
permit-access  172.17.0.0/24
forward-socks5   /  127.0.0.1:1080  .
OpenRC 配置 privoxy
rc-service privoxy start
rc-update add privoxy default

配置 Docker客户端的Proxy

  • 配置 ~/.docker/config.json 设置指向privoxy代理:

配置 ~/.docker/config.json 设置Docker客户端代理
{
 "proxies":
 {
   "default":
   {
     "httpProxy": "http://172.17.0.1:8118",
     "httpsProxy": "http://172.17.0.1:8118",
     "noProxy": "*.baidu.com,192.168.0.0/16,10.0.0.0/8"
   }
 }
}

则创建的docker容器会注入代理配置的环境变量

如果上述docker代理配置注入无效,则手工配置容器环境变量添加如下 :

手工配置docker容器的用户环境变量使用代理
export HTTP_PROXY="http://172.17.0.1:8118"
export HTTPS_PROXY="http://172.17.0.1:8118"
export http_proxy="http://172.17.0.1:8118"
export https_proxy="http://172.17.0.1:8118"