三生有幸,四季如春 | 言文

Trojan

2018.08.29

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

安装

Github 页面

安装向导

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

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

配置

配置文档

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

  • server_config.json

    {
    "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

    {
    "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 把自己当作了那个万夫莫开的当关一夫,可以更加迅速的将正常流量转发出去,减少接触时间,也算是一种新的设计思路和实现。

comments powered by Disqus