docker容器使用socks5做全局代理

docker容器使用socks5做全局代理


背景

博主自行构建ubuntu容器来编译openwrt,部分组件构建需要获取墙外资源,博主使用的代理工具,支持的协议
为socks5,但是容器中部分工具如:wget 只支持http代理,所以在容器中需要配置socks5转http全局代理。

宿主机代理配置

需要修改宿主机代理客户端配置,方便局域网其他主机连接代理,容器使用的网络类型为桥接。之前也使用过host网
络,但是在容器中测试并未成功。为了能迅速编译openwrt,只能使用默认桥接网络进行代理。

首先配置客户端,允许局域网中其他主机进行连接,我这里直接配置成“0.0.0.0”,虽说这个不安全,但是在局域网中
风险暂时可以接受。这里需要注意,需要使用firewalld或者iptables启用本地代理端口。firewalld配置指令如下:

1
firewall-cmd --permanent --add-port=6666/tcp

个人本地代理服务器配置如下:
20200307-proxy-client.png
宿主机本地的代理端口为:6666,未设置验证用户名和密码
可以使用局域网中其他主机测试一下,宿主机本地代理服务器是否配置成功,测试过程这里就不在赘述了。

容器构建配置

以下Dockerfile配置文件仅供参考,这是我为了编译openwrt自行构建的。除了openwrt编译需要的基础环境,
我增加了polipo,我使用polipo这个工具进行全局代理。设置http和https代理地址。由于polipo只存在ubuntu 20.04 LTS之前的版本库中,这里直接在最新版ubuntu中安装polipo的deb包。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
FROM ubuntu:latest

ENV LANG en_US.UTF-8
ENV LANGUAGE en_US.UTF-8

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

RUN echo 'Asia/Shanghai' >/etc/timezone

# config apt sources.list
RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list

RUN apt-get update -qq && \
apt-get upgrade -qqy && \
apt-get install -qqy build-essential asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch python3 unzip zlib1g-dev lib32gcc1 libc6-dev-i386 subversion flex uglifyjs git-core gcc-multilib p7zip p7zip-full msmtp libssl-dev texinfo libglib2.0-dev xmlto qemu-utils upx libelf-dev autoconf automake libtool autopoint device-tree-compiler g++-multilib wget iputils-ping curl && \
apt-get clean && \
rm -rf /tmp/* /var/tmp/*

# install polipo
RUN wget http://archive.ubuntu.com/ubuntu/pool/universe/p/polipo/polipo_1.1.1-8_amd64.deb && \
dpkg -i polipo_1.1.1-8_amd64.deb

ADD config /etc/polipo/config

ENV http_proxy "http://127.0.0.1:8183"
ENV https_proxy "http://127.0.0.1:8183"

polipo配置文件如下:

1
2
3
4
5
6
7
logSyslog = true
logFile = /var/log/polipo/polipo.log
socksParentProxy = "192.168.3.200:6666"
socksProxyType = socks5
proxyPort = 8183
proxyAddress = "0.0.0.0"
allowedClients = 127.0.0.1

宿主机的ip为192.168.3.200,宿主机代理服务器启用的端口为:6666,polipo全局代理的端口为8183
使用以下指令进行构建

1
docker build -t openwrt-build-env .

启用容器并进行测试

执行以下指令映射本地目录到容器中去

1
docker run -itd --name openwrt-build-env -v ~/openwrt/openwrt:/home/user/openwrt openwrt-build-env

使用以下指令进入容器

1
docker exec -it openwrt-build-env /bin/bash

polipo未设置自启动,需要手动运行

1
/etc/init.d/polipo start

使用以下指令测试代理是否成功

1
curl cip.cc

20200307-proxy-test.png
显示得ip位于国外,代理成功,可以开心编译openwrt了。

注意

如果有http协议的代理工具,使用以下指令直接配置即可

1
2
export http_proxy="http://ip:port"
export https_proxy="http://ip:port"

这篇文章其实有点儿鸡肋,可以在容器之外安装polipo或者其他工具,将sock5协议转成http协议,然后配置全局代理即可。

参考内容


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!