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,成功了。

Docker配置Trojan代理的更多相关文章

  1. docker配置代理的用户名密码

    公司访问外网全部需要经过代理服务器,在使用docker的过程中,发现就算为docker配置了代理,还是会因为没有代理服务器认证,导致pull操作失败,报如下错误: Error response fro ...

  2. Docker设置http代理

    在国内由于不可描述的原因无法访问Google等网站,但是作为一枚挨踢人士,无法使用Google搜索,在使用Ctrl + C技能时是抓狂的:特别是当下Docker.Kubernetes等容器技术火热的时 ...

  3. centos7 docker使用https_proxy 代理配置

    centos7 docker使用https_proxy 代理配置 背景: 内网的centos主机不能上网,通过同网段的windows设置代理上网,yum.conf配置http代理是可以的,但是dock ...

  4. Docker 配置代理

    最近在k8s上部署helm 老提示无法下载镜像,因为伟大的祖国的长城Firewall....导致k8s根本玩不了..... 第一步:配置系统代理 # vim .bashrc export http_p ...

  5. 一文教您如何通过 Docker 搭建反向代理 Ngnix,并配置 Https SSL 证书

    欢迎关注个人微信公众号: 小哈学Java, 每日推送 Java 领域干货文章,关注附送 100G 海量学习资源哟!! 个人网站: https://www.exception.site/docker/h ...

  6. docker配置与实践#可以好好看看

    Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源.Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的 L ...

  7. Docker配置整理

    目录: 以非root用户身份管理Docker 配置Docker以在启动时启动 配置Docker守护程序监听连接的位置 以非root用户身份管理Docker 默认情况下,Docker运行权限由用户roo ...

  8. [转帖]龙芯:Docker 配置与实践清单

    Docker 配置与实践清单 http://www.sohu.com/a/254904706_198222 文章对来官方文档及 Docker Links[1] 中链接内容进行归档整理,包含了日常工作中 ...

  9. Linux +Docker +Nginx 部署代理转发初探

    很多开发人员仅仅只会码代码,如果让开发人员部署一些深入点的东西,或者做负载均衡等,很多开发人员估计就懵逼了,作为一个专业的开发还需要懂一些基本的运维知识:虽然说在互联网行业中,中小企业都有一个牛逼的运 ...

  10. 【Azure 应用服务】App Service For Container 配置Nginx,设置/home/site/wwwroot/目录为启动目录,并配置反向代理

    问题描述 通过Docker Desktop for Linux,配置Nginx镜像后,自定义nginx.conf文件,修改启动目录和对 /out 路径的反向代理到博客园的博文地址 (https://w ...

随机推荐

  1. WinForm DevExpress 添加行内按钮

    1.在设计器里面添加一列,设置单元格不可编辑.只读属性 2. 在所在GridView属性里面添加CustomDrawCell事件与RowCellClick事件 private void gvMain_ ...

  2. iPhone 打不开 Apple News 解决方法

    想看 Apple News,但是在主屏幕找不到,在 App Store 搜索 Apple News 后打开时显示访问控制已启用,然而在设置中检查发现访问控制并没有启用. 经过一番摸索,发现这个访问控制 ...

  3. maven 网关应用:[NACOS ConnectException httpPost] currentServerAddr: http://localhost:8848,

    网关应用运行忽然报错:[NACOS ConnectException httpPost] currentServerAddr: http://localhost:8848, 虽然调整了代码逻辑,但是n ...

  4. 【YashanDB知识库】swap空间使用超大报错

    问题描述 问题单 使用GROUP_CONCAT函数时,数据库swap表空间上涨厉害 测试用例 drop table tmp1; create table tmp1(c1 int,c2 double,c ...

  5. C++源码中司空见惯的PIMPL是什么?

    前言: C++源码中司空见惯的PIMPL是什么?用原始指针.std::unique_ptr和std::shared_ptr指向Implementation,会有什么不同?优缺点是什么?读完这篇文章,相 ...

  6. [JS设计模式]:鸭子类型与多态

    鸭子类型 编程语言按照数据类型大体可以分为两类,一类是静态类型语言,另一类是动态类型语言. 动态类型语言对变量类型的宽容给实际编码带来了很大的灵活性.由于无需进行类型检测,我们可以尝试调用任何对象的任 ...

  7. JavaScript – 小技巧 Tips

    1e6 等价于 1 + 后面 6 个零 console.log(1e6 === 1_000_000); 模拟 C# 的 Record Deconstruct class Size implements ...

  8. shell脚本参数读取列表文件,循环执行时,要注意这个列表文件转换成 unix 格式

    当报一些很奇怪的错,比如报错多了一个空格,但 vim 看打开没有,比如: 或者肉眼看上去路径正常,但却报路径不存在: 这种时候要使用 dos2unix 工具,把这个列表文件转换一下:

  9. SXYZ-6.26模拟赛

    没有爆零,足矣. 发现绍兴一中机房的一个特点:键盘打得贼响!! T1 ctrl 啃臭键在哪里 (中文名我都不好意思大打) 第一遍测T1一分都没得啊! 这跟题目描述自相矛盾有关,导致我只是轻微考虑了一下 ...

  10. 手写 p-map(控制并发数以及迭代处理 promise 的库)

    介绍 p-map 是一个迭代处理 promise 并且能控制 promise 执行并发数的库.作者是 sindresorhus,他还创建了许多关于 promise 的库 promise-fun,感兴趣 ...