Docker配置Trojan代理

1、遇到的问题

在做云计算作业,使用阿里云的ECS服务器尝试使用docker拉取镜像的时候,发现一直无法从仓库拉取,更换了多个镜像源也没有解决问题,于是决定学会去配置linux的代理,记录过程。

2、安装Trojan

何为Trojan?

Trojans是一种加密的代理协议,全称为Trojan-GFW,是目前最成功的代理加速伪装技术之一。

Trojan的工作原理?

Trojan通过监听443端口,模仿互联网上最常见的HTTPS协议,把合法的Trojan代理数据伪装成正常的HTTPS通信,并真正地完整完成TLS握手,以诱骗GFW认为它是HTTPS,从而不被识别。

为什么使用Trojan?

首先主要原因是因为我使用的提供代理的网站大部分的连接都是采用了Trojan协议的。其次Trojan协议本身并不能被Docker识别,为了让Docker使用代理,需要借助Trojan客户端工具接收Docker发出的http协议的请求,再输出出去。

我们使用指令wget https://github.com/trojan-gfw/trojan/releases/download/v1.16.0/trojan-1.16.0-linux-amd64.tar.xz从Github下载Trojan的预编译二进制文件。

下载成功后,使用tar -xvf trojan-1.16.0-linux-amd64.tar.xz解压下载的文件夹。

使用sudo mv trojan /usr/local/bin/移动到可执行文件路径,并且使用sudo mkdir /etc/trojan创建配置文件目录。

使用/usr/local/bin/trojan/trojan -v可以检测是否安装成功。

3、配置Trojan

参考:Linux命令行使用Trojan代理加速

创建并编辑配置文件 /etc/trojan/config.json,将你的代理信息填入其中,配置文件内容如下:

{
"run_type": "client",//运行类型
"local_addr": "127.0.0.1",//本地监听地址
"local_port": 1080,//本地监听端口
"remote_addr": "***",//服务端的ip或域名
"remote_port": ***,//服务端的ip或端口
"password": [
"***"//对应服务端设置的密码
],
"ssl": {//ssl证书配置
"sni": "***"
}
//若不需要ssl证书配置,请配置如下文
// "ssl": {
// "verify": false,
// "sni": "***"
//}
}

使用如下命令后台运行Trojan。

/usr/local/bin/trojan/trojan -c /etc/trojan/config.json &

使用如下命令可以杀死Trojan进程。

pkill -f trojan

此时,Trojan客户端就会在本地启动一个SOCKS5代理服务,将Trojans流量转换成SOCKS5代理,监听127.0.0.1:8080

4、为Docker配置代理

我们在docker的/etc/docker/daemon.json文件下添加如下配置

{
"proxies": {
"http-proxy": "http://127.0.0.1:1080",
"https-proxy": "http://127.0.0.1:1080",
"no-proxy": "localhost,127.0.0.1"
}
}

然后使用sudo systemctl restart docker重新启动docker,现在配置已经完成。

再次测试docker run hello-wolrld,查看是否成功。

哈哈!失败了。

信息显示连接失败了,那么我们需要进行错误排查。

我们使用如下命令来检查能否使用SOCKS5协议向docker仓库发送信息。

curl -x socks5://127.0.0.1:1080 https://registry-1.docker.io/v2/
[2024-10-23 22:51:23] [INFO] 127.0.0.1:49036 requested connection to 157.240.17.41:443
[2024-10-23 22:51:25] [INFO] 127.0.0.1:49036 disconnected, 3422 bytes received, 213 bytes sent, lasted for 2 seconds
curl: (51) Unable to communicate securely with peer: requested domain name does not match the server's certificate.

可以看到,失败的原因是因为证书认证失败,我们换一个网站进行测试,检查我们的代理是否面对任何网站都会认证失败,如果是那就说明是我们的Trojan客户端配出了问题。

curl -x socks5://127.0.0.1:1080 https://www.example.com

结果成功返回了一个示例,那么说明我们的代理配置是没有问题的,应该是使用的协议出了问题导致docker仓库无法识别我们的证书。

查阅资料,继续了解其代理过程,了解到Trojan客户端实现的具体原理是向本地提供了一个基于SOCKS5协议的代理服务,应用程序的流量将会发送到这个代理上,接着Trojan服务器再将流量通过Trojan协议传输到目的地上。而Docker的代理配置中,我们配置了https和http协议的代理流量发送地点,这可能是因为SOCKS5协议和http协议产生了一点冲突,导致证书不能被正确识别。为了解决这个问题,我们可以再加一层中间件,负责将https协议的流量转换成SOCKS5协议的流量,就能正确处理https的请求。

5、安装配置Privoxy

使用如下命令在centOS上安装Privoxy

sudo yum install privoxy

接着配置/etc/privoxy/config这个文件,将Privoxy连接到本地的SOCKS5代理。

forward-socks5 / 127.0.0.1:1080 .

然后启动Privoxy

sudo systemctl start privoxy
sudo systemctl enable privoxy

Privoxy 默认会监听本地的 8118 端口,这意味着你可以将应用程序的 HTTP/HTTPS 代理配置为 http://127.0.0.1:8118

接着我们需要再次更改daemon配置,修改为如下

{
"proxies": {
"http-proxy": "http://127.0.0.1:8118",
"https-proxy": "http://127.0.0.1:8118",
"no-proxy": "localhost,127.0.0.1"
}
}

重启docker

sudo systemctl restart docker

最终我们再运行docker run hello-world,成功了。

本文作者:MelonTe

本文链接:https://www.cnblogs.com/MelonTe/p/18498620

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   MelonTe  阅读(313)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起