trojan

之前打包了 trojan-git 但是还没测试过,刚好备用服务器准备更新,顺便测试。其本身安装和配置本身十分简单,但是如何不影响原有服务还是需要考虑一下的。

安装

Github 页面

安装向导

如果发行版没有打包的话直接使用 binary 也很方便,然后去其他有打包的发行版抄个 systemd service 配置。

1
$ sudo pacman -S trojan # or install `trojan-git` from archlinux cn mirrors or aur.

配置

配置文档

简单以 CaddyServer 为例子,也可以使用其他的方式获得 CA 证书。配置上基本和示例一样,没有什么改动,具体参数意思请见文档链接。

  • server_config.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
{
"run_type": "server",
"local_addr": "::",
"local_port": 443,
"remote_addr": "127.0.0.1",
"remote_port": 80,
"password": ["<YourPasswordHere>"],
"log_level": 2,
"ssl": {
"cert": "/var/lib/caddy/acme/acme-v01.api.letsencrypt.org/sites/<YourHostName>/<YourHostName>.crt",
"key": "/var/lib/caddy/acme/acme-v01.api.letsencrypt.org/sites/<YourHostName>/<YourHostName>.key",
"key_password": "",
"cipher": "ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS",
"prefer_server_cipher": true,
"alpn": ["h2", "http/1.1"],
"reuse_session": true,
"session_timeout": 300,
"curves": "",
"sigalgs": "",
"dhparam": ""
},
"tcp": {
"keep_alive": true,
"no_delay": true,
"fast_open": true,
"fast_open_qlen": 5
},
"mysql": {
"enabled": false,
"server_addr": "127.0.0.1",
"server_port": 3306,
"database": "trojan",
"username": "trojan",
"password": ""
}
}
  • client_config.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{
"run_type": "client",
"local_addr": "127.0.0.1",
"local_port": 9999,
"remote_addr": "<ServerIP>",
"remote_port": 443,
"password": ["<YourPasswordHere>"],
"append_payload": true,
"log_level": 2,
"ssl": {
"verify": true,
"verify_hostname": true,
"cert": "",
"cipher": "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:AES128-SHA:AES256-SHA:DES-CBC3-SHA",
"sni": "<YourHostName>",
"alpn": ["h2", "http/1.1"],
"reuse_session": true,
"curves": "",
"sigalgs": ""
},
"tcp": {
"keep_alive": true,
"no_delay": true,
"fast_open": true,
"fast_open_qlen": 5
}
}

谈谈

由于 trojan 相当于自己管理了 tls,所以其他原有的服务就不能再占用 433 端口,只能通过 trojan 转发,但是由于其转发功能目前实现还不是很完善,比如多域名支持、反向代理等,所以原本需要的 nginx/caddy 还是需要,为了避免端口占用冲突,将 caddyhttps_port 设置在了 444(其他也行,只要没有端口占用),如果是 trojan 无法识别的请求类型,它将会转发到本地的 80 端口,也就是服务器配置里面的 remote_port 参数,caddy 通过从 80 端口接受转发信息,相当于透明代理了原有业务。

从研究密码学上的无处逢春,到后面思路转向混淆,到后来有了 tlswebsocket实现了真实流量的混入,也算是经历了大的几个阶段。websocket 本身还是要经过多次协商,但是 websocket 本身被发现并不能代表什么,其后面也可能是 aria2 这样的正常服务,尽管不同的 websocket 访问可能产生一些特征。在设计思路上 trojan 把自己当作了那个万夫莫开的当关一夫,可以更加迅速的将正常流量转发出去,减少接触时间,也算是一种新的设计思路和实现。