想了一想,反正 2018 年的年度总结已经咕了这么久了,干脆就咕到除夕再写啦。在此之前,答应大火酱给 trojan 写的广告也咕了好一段时间了,现在 trojan 的 Android 客户端也已经在鹿上了,就先来介绍一下 trojan 啦。不过想了一想我会不会写太多的*墙文章了……

trojan-gfw 是大火酱写的一款相对比较新(其实也诞生有一年啦)的代理工具,项目名字也起得很直白,是以对抗 GFW 为目的而创建的项目,特色是使用 TLS 1.3 来传输流量,将自己伪装成普通的网站 HTTPS 流量(被主动探测的时候能返回真实 HTTPS 网站),就这一年的使用者的反馈来看效果良好。

安装与使用

我们的服务器系统以 debian 为例。如果你也使用 debian 做服务器,我十分建议你将系统滚到 testing,原因主要是作为一台代理服务器,应该没人会在上面放什么重要的业务,还不如滚上 testing 以后用新包新内核;二是 trojan 在 testing 及以上已经有打包,可以直接 apt 安装;三是 testing 的内核足够新,可以让你直接开启 bbr,你完全可以跟肮脏的一键脚本们说再见(当然现在 debian 9 的内核也已经在 4.9 以上了)。

接下来我也就先滚上 testing 做为示范,为了偷懒一下均直接用 root 用户,请注意阅读注释部分:

# 修改 sources.list, 下面两行需要一起复制粘贴,或者你手动去改 /etc/apt/sources.list 文件也行
$ echo "deb http://http.us.debian.org/debian/ testing main contrib non-free
deb-src http://http.us.debian.org/debian/ testing main contrib non-free" > /etc/apt/sources.list
# 因为滚动过程中可能发生 ssh 连接断开的惨案,所以用一下 screen 来保持会话。没装 screen 就 apt install screen 一下
$ screen
$ apt update && apt upgrade
# 滚动完成后为了切换到新内核需要重启,如果你重启后连接不上则可能是 iptables 的原因,自己连上 VNC 修一下
# 或者先执行 iptables-legacy -F && iptables-legacy-save 以后再来重启
$ systemctl reboot
# 重启后先把 bbr 开了
$ modprobe tcp_bbr
$ echo "net.ipv4.tcp_fastopen = 3" >> /etc/sysctl.conf
$ echo "net.ipv4.tcp_congestion_control = bbr" >> /etc/sysctl.conf
$ sysctl -p
# 然后直接安装 trojan
$ apt install trojan

使用 apt 安装的另一个好处是 apt 会直接带上 systemd service,比一些 9102 年还用 nohup 或者 SysV 的沙雕脚本好的多。另外,在 /etc/trojan/ 里还送了一个服务端的示例配置文件,有了它基本上我们只需要修改一些小地方就可以了。

在改配置文件之前我们先得搞到 TLS 用的证书和密钥文件,如果你自己有域名那再好不过了,如果没有的话你可以借助 ,这是一个公共的 DNS 服务,它可以让你在有一个公网 ip 的情况下帮你省去一个独立域名的麻烦。比如我刚开的测试用服务器的 ip 是 104.238.161.202, 那么 104-238-161-202.sslip.io 就可以直接解析到我的服务器而不需要任何操作。然后我们用 来签一张 Let's Encrypt 的证书。

# 先装一下 acme.sh
$ wget -O -  https://get.acme.sh | sh && . ~/.bashrc
$ acme.sh --issue --standalone -d 104-238-161-202.sslip.io
# 然后按照脚本运行成功的提示,证书和密钥应该已经放在 /root/.acme.sh/104-238-161-202.sslip.io/ 下了
$ ls /root/.acme.sh/104-238-161-202.sslip.io/
104-238-161-202.sslip.io.cer 104-238-161-202.sslip.io.key ...

然后就用 vim 或者别的 editor 来改 /etc/trojan/config.json:

{
    "run_type": "server",
    "local_addr": "0.0.0.0",
    "local_port": 443,
    "remote_addr": "127.0.0.1",
    "remote_port": 80,
    "password": [
        "337845818"
    ],
    "log_level": 2,
    "ssl": {
        "cert": "/root/.acme.sh/104-238-161-202.sslip.io/104-238-161-202.sslip.io.cer",
        "key": "/root/.acme.sh/104-238-161-202.sslip.io/104-238-161-202.sslip.io.key",
        "key_password": "",
        "cipher": "ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256",
        "prefer_server_cipher": true,
        "alpn": [
            "http/1.1"
        ],
        "reuse_session": true,
        "session_ticket": false,
        "session_timeout": 600,
        "plain_http_response": "",
        "curves": "",
        "dhparam": ""
    },
    "tcp": {
        "prefer_ipv4": false,
        "no_delay": true,
        "keep_alive": true,
        "fast_open": false,
        "fast_open_qlen": 20
    },
    "mysql": {
        "enabled": false,
        "server_addr": "127.0.0.1",
        "server_port": 3306,
        "database": "trojan",
        "username": "trojan",
        "password": ""
    }
}

要修改的只有 "password", "log_level" 和 "cert", "key" 字段而已,详细的配置文件说明可以在 trojan 的官方文档 中自行查阅。接着运行 trojan 并设置开机启动:

# 启用 trojan 的 systemd service
$ systemctl enable trojan --now
Created symlink /etc/systemd/system/multi-user.target.wants/trojan.service → /lib/systemd/system/trojan.service.
# 你可以查看一下运行状态
$ systemctl status trojan
# 如果之后出问题了你可以看一下 log
$ journalctl -fu trojan

如果一切正常,接着就可以开始准备客户端了。trojan 的 Windows 客户端可以在 release 里下载;Linux 客户端的话和服务端是一体的,我相信用 Linux Desktop 的用户是不用我多说了;Android 客户端在 igniter,不过完全是处于开发中的状态,离日常可用还很远;iOS 用户可以安装 ShadowrocketPharos Pro 的 TF 版。

客户端的配置文件跟服务端的区别只是前面几个字段:

{
    "run_type": "client",
    "local_addr": "127.0.0.1",
    "local_port": 1080,
    "remote_addr": "104-238-161-202.sslip.io",
    "remote_port": 443,
    "password": [
        "337845818"
    ],
    "append_payload": true,
    "log_level": 2,
    "ssl": {
        "verify": true,
        "verify_hostname": true,
        "cert": "",
        "cipher": "ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256",
        "alpn": [
            "http/1.1"
        ],
        "reuse_session": true,
        "session_ticket": false,
        "curves": ""
    },
    "tcp": {
        "no_delay": true,
        "keep_alive": true,
        "fast_open": false,
        "fast_open_qlen": 20
    }
}

将上面写到 client.json 以后,Windows 上应该跟 .exe 放在同一个目录下双击运行就可以了。

评价与比较

对于大多数人来说,翻墙这件事的备用手段自然是越多越好了,尤其是去年某段时间某两个代理软件互相竞争闹得满城风雨、不明真相的群众吃瓜吃着吃着还真有人信了的时候。不过就现在而言,不少人还能很放心地说出“我一直用着 SS/V2Ray 也没见什么事啊”,事实也确实如此。但就我看来,任何对不合理事物的反抗,即使是再微不足道的,也是值得鼓励和尝试的。现阶段 trojan 的开发势头良好,十分值得期待。

与 Shadowsocks 相比,trojan 的思路出发点完全不同。Shadowsocks(及其分支) 已经是一个庞大且相对成熟的项目,还有数不清的订阅制的机场;而 trojan 则还是以个人用户为主的一个小工具,并没有考虑那么多的东西。效果上由于两者的用户量级完全不同因此难以比较,不过在 Shadowsocks 时不时就会被大规模封一批的当下,抱着“小众的工具也许更不容易被针对”的想法来尝试也未尝不可。

而 V2Ray 是一个堪称瑞士军刀的超多功能代理工具,但是与 trojan 相比,它的全能有着配置文件复杂、协议 overhead 较大、性能和占用较大的一面。

trojan 作为一个新生的工具,它的劣势主要就是在客户端方面。刚刚才起步的 Android 端就不用说了,Windows 的 GUI 客户端也未发布,而我始终认为客户端的简单易用也是一个日常必备软件的基本要求,这也是我还未用 trojan 完全替代 V2Ray 的原因之一。

总而言之,我非常期待 trojan 接下来进一步的开发,期待着大火能让它成为一个更加成熟完善的软件,也希望更多人知道和关注这个项目。

广告打完了,我也来吐槽一下。为了写这篇文章,我特意开了一台一百年没用过的 vultr 来测试,然后搭好后发现网页加载不出来,而服务端和客户端的所有请求都很正常,但就是 connection timeout,害我 debug 了快一小时还是百思不得其解。然后抬头一看浏览器,咕果已经加载好了,那种感觉真是让我觉得得把电脑砸了。

不出意外的话,新的一年里我也不会再写这类文章了,主要是不想把个人博客变成翻墙博客,其次是 V2Ray 已经完全满足我的日常使用并且目前并没有什么能替代它所有功能的项目。

参考: https://trojan-gfw.github.io/trojan/config