暮光博客

小心你讨厌的东西,因为你很可能被它塑造成某种形状

Docker + Trojan + Caddy 部署

技术 10 条评论

关于 Trojan,不要多问,问就是代理工具。它先进的地方在于,数据传输使用 TLS 协议,伪装成 HTTPS 请求。Trojan 服务端监听 443 端口,对于普通来路的请求,会交由 Web 服务器处理,返回 Web 网站;而对于 Trojan 客户端来的请求,则由 Trojan 服务端进行代理。这跟 某2ray + Websocket + TLS 原理是一样的,都是通过伪装流量,避免被提取特征或是被检测。

这篇文章里,我将使用 Ubuntu 18.04 操作系统,使用 Caddy 作为 Web 服务器,将 Trojan 服务端和 Caddy 部署到 Docker 中。

0、准备

  • 域名 x1
  • 国外服务器 x1

部署前先给域名设置一条 A 记录,并指向你的服务器 IP。

1、安装 Docker & Docker-Compose

  • 添加 Docker 软件源

    sudo apt-get update
    sudo apt-get install apt-transport-https ca-certificates  curl software-properties-common
    curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
    sudo add-apt-repository "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
    
  • 安装 Docker CE(社区版)

    sudo apt-get update -y
    sudo apt-get install docker-ce -y
  • 安装 Docker-compose 容器编排工具

    sudo curl -L https://github.com/docker/compose/releases/download/1.18.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
    sudo chmod +x /usr/local/bin/docker-compose
    docker-compose --version

2、构建 Trojan + Caddy 镜像

我已经写好了 Docker compose 的构建脚本,直接克隆下来用即可。

  • 下载 Trojan + Caddy 构建配置
    git clone git@github.com:FaithPatrick/trojan-caddy-docker-compose.git trojan-caddy-docker-compose && cd trojan-caddy-docker-compose
  • 编辑 ./caddy/Caddyfile

    www.yourdomain.com:80 {
        root /usr/src/trojan
        log /usr/src/caddy.log
        index index.html
    }
    
    www.yourdomain.com:443 {
        root /usr/src/trojan
        log /usr/src/caddy.log
        index index.html
    }

    www.yourdomain.com 替换成事先准备的域名。

  • 编辑 ./trojan/config/config.json
    config:json:8 位置,将 your_password 替换成要设置的密码,这是客户端需要用到的密码,妥善保管。

    config:json:12-13 位置将 your_domain_name 替换成自己的域名, 这个路径是 Caddy 自动调用 Let's encrypt 生成的证书路径。

    • 执行 docker-compose build 构建镜像,如果没什么报错就代表成功了。

3、运行 Trojan + Caddy 容器

执行 docker-compose up 命令启动容器,正常启动的日志应该看起来是这样的:

➜ docker-compose up

Starting test_caddy_1 ... done
Attaching to test_caddy_1
caddy_1  | Activating privacy features...
caddy_1  |
caddy_1  | Your sites will be served over HTTPS automatically using Let's Encrypt.
caddy_1  | By continuing, you agree to the Let's Encrypt Subscriber Agreement at:
caddy_1  |   https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf
caddy_1  | Please enter your email address to signify agreement and to be notified
caddy_1  | in case of issues. You can leave it blank, but we don't recommend it.
caddy_1  |   Email address: 2020/01/10 13:54:58 [INFO] acme: Registering account for
caddy_1  | 2020/01/10 13:54:58 [INFO][xx.xx.xx] acme: Obtaining bundled SAN certificate
caddy_1  | 2020/01/10 13:54:58 [INFO][xx.xx.xx] AuthURL: https://acme-v02.api.letsencrypt.org/acme/authz-v3/xxxxxx
caddy_1  | 2020/01/10 13:54:58 [INFO][xx.xx.xx] acme: Trying to solve HTTP-01
caddy_1  | 2020/01/10 13:54:58 [INFO][xx.xx.xx] Served key authentication
caddy_1  | 2020/01/10 13:54:58 [INFO][xx.xx.xx] Served key authentication
caddy_1  | 2020/01/10 13:55:03 [INFO][xx.xx.xx] The server validated our request
caddy_1  | 2020/01/10 13:55:03 [INFO][xx.xx.xx] acme: Validations succeeded; requesting certificates
caddy_1  | 2020/01/10 13:55:04 [INFO][xx.xx.xx] Server responded with a certificate.
caddy_1  | 2020/01/10 13:55:04 [INFO][xx.xx.xx] Certificate written to disk: /root/.caddy/acme/acme-v02.api.letsencrypt.org/sites/xx.xx.xx/xx.xx.xx.crt
caddy_1  | done.

Starting test_trojan_1 ... done
Attaching to test_caddy_1, test_trojan_1
trojan_1  | ssl certs is empty - checking...
trojan_1  | ssl certs is empty - checking...
trojan_1  | Welcome to trojan 1.14.0
trojan_1  | [2020-01-10 15:40:58] [WARN] trojan service (server) started at 0.0.0.0:443

如果想常驻进程,启动容器时执行 docker-compose up -d

用浏览器访问 https://域名 看一下返回,我的构建脚本默认会返回 Bootstrap 的起始页面:

20200111012712.png

网站存放在 ./wwwroot/trojan/ 目录下面 ,可以随便放点什么,尽可能像一个正常网站就好。

至此,Docker + Trojan + Caddy 服务端部署完成。

4、Trojan 客户端

不多提了,Windows 和 macOS 客户端官方仓库都有:https://url.cn/5r6mb9J
当然,你也可以去寻找更易用的支持 Trojan 的第三方客户端或路由器固件。

2020 年的愿景
评论区
选择表情选择表情
  1. Musk

    有没有办法将caddy配置成强制https, 而不是分别有https和http?
    我试过在:80配置下面做redir, 但是网站会变得无法运行, 只显示 too many redirect ...

    回复
    1. @Musk

      文章里给出的配置,443 端口是由 Trojan 监听的,对于正常的 https 请求,Trojan 会转发(反向代理)到 Caddy 的 80 端口。这就是你在 80 端口下做 redir 到 443,会出现「太多重定向」的原因,无限循环了。

      你的问题可以这样解决:
      Caddyfile 里写 3 条,分别是 80、8080、443 端口(443端口不对外监听,只用来生成 https 证书),80 做 redir 到 443,8080 放网站内容。Trojan 里配置将 https 请求转发给 8080 端口。如果不想对外网暴露 8080,在 iptables 里写一下规则。

      以上操作需要变更这三个配置文件:Caddyfile、docker-compose.yml、torjan/config/config.json

      回复
  2. 开门~查水表!

    回复
    1. @苏格

      别这样 icon_surprised.gif

      回复
  3. 不错呀,终于更新了。哈哈。我的友链帮忙改下呀,以前是frank2019.info。现在是frank2019.me

    回复
    1. @Frank

      已修改 icon_redface.gif

      回复
  4. 这工具名起的,我第一道眼球防火墙就给拦下了。

    回复
    1. @大致

      这名字起得很有灵性,把通往国外的流量装进木马里。

      回复
  5. 换主题了呀,很简洁大方。 icon_redface.gif

    回复
    1. @大大的小熊

      icon_redface.gif 好久不打理,难得改头换面一次。

      回复