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. WM_ERASEBKGND

    WM_ERASEBKGND是在当窗口背景必须被擦除时 (例如,窗口的移动,窗口的大小的改变)才发送. 当窗口的一部分无效需要重绘时发送此消息. #define WM_ERASEBKGND 0x0014 ...

  2. JAVA学习——JDK开发环境配置

    2024/07/08 一.JDK下载 二.安装与JDK开发环境配置(Windows) 三.安装与JDK开发环境配置(Linux) 一.JDK下载与安装 网址: https://www.oracle.c ...

  3. Vue状态管理库Pinia详解

    Pinia 是 Vue 的状态管理库,它提供了一种更简单.更不规范的 API 来管理应用的状态.Pinia 的设计哲学是简单性和易用性,它避免了 Vuex 中的许多复杂概念,如 mutations 和 ...

  4. 基于PaddleNLP信息抽取,uie微调打造自己专属的信息抽取模型

    基于PaddleNLP信息抽取,uie微调打造自己专属的信息抽取模型 UIE模型简介 UIE优势 应用示例 UIE开箱即用 UIE适用抽取示例 命名实体识别(Named Entity Recognit ...

  5. Spark Dataframe 转 Json

    import org.apache.spark.sql.DataFrame import org.apache.spark.sql.functions._ import org.apache.spar ...

  6. c程序设计语言 by K&R(二)指针与数组

    指针与数组 1. c语言只有值传递,没有引用传递 可通过指针交换 #include <stdio.h> #include <stdlib.h> void swap(int* a ...

  7. Nuxt Kit 的使用指南:从加载到构建

    title: Nuxt Kit 的使用指南:从加载到构建 date: 2024/9/12 updated: 2024/9/12 author: cmdragon excerpt: 摘要:本文详细介绍了 ...

  8. 3.1 migration to 5.0

    记入我遇到的问题 : 1. localizer.WithCulture 废弃了 https://github.com/dotnet/aspnetcore/issues/7756 其实讨论很久了, 只是 ...

  9. Naming Conversion & Case Style 命名规范

    前言 写代码有 2 个点很重要 第一是表达 (不要词不达意) 要达到这点, 就要多参考其它人如何表达. 第二是一致性 (一样的东西就用一样的写法) 要达到这点就要建立规范 以前的笔记 命名规范 nam ...

  10. ModbusRTU通信协议报文剖析

    前言 大家好!我是付工.前面给大家介绍了Modbus协议的应用层面.终于有人把Modbus说明白了那么,今天跟大家聊聊关于Modbus协议报文的那些事. 一.真实案例 前段时间有个粉丝朋友,让我帮他解 ...