Trojan 搭建记录

2020-06-13 2996点热度 1人点赞

Trojan 是一个新兴的工具,主要是提供一种方式,在仅 TLS 的情况下达成网络隧道的建立。 Trojan 具有多种协议 TLS,可以避免主动/被动检测和网络运营商 QoS 限制。


1 、 Trojan 简介

Trojan 模仿了最常见的协议 HTTPS (TLS) 以欺骗网络运营商并达成规避网络运营商 QOS 限制。

Github 项目 [ 链接 ]
文档 [ 链接 ]


2 、 Trojan 使用

先到 Github 上下载对应服务器版本的 Release 应该不用多说了。

默认 trojan 程序启动时要搭配一个配置文件,会从程序当前目录找 config.json 。
或者携带参数指定配置文件运行也可以 ./trojan config.json

关于 Systemd 服务,默认位置在 .examples/trojan.service-example,你可以复制该文件到服务文件夹下,并配置自动启动

cp -a ./examples/trojan.service-example /etc/systemd/system/trojan.service
systemctl enable trojan
systemctl start trojan

如果你需要降用户权限运行 Trojan,或者喜欢 trojan@ 的方式管理多配置文件,可以参考下方配置文件。

cat /etc/systemd/system/[email protected]

[Unit]
Description=trojan %i
Documentation=man:trojan(1) https://trojan-gfw.github.io/trojan/config https://trojan-gfw.github.io/trojan/
After=network.target network-online.target nss-lookup.target mysql.service mariadb.service mysqld.service

[Service]
Type=simple
StandardError=journal
#User=trojan
#Group=trojan
AmbientCapabilities=CAP_NET_BIND_SERVICE
ExecStart=/usr/bin/trojan/trojan /etc/trojan/%i.json
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartSec=1s

[Install]
WantedBy=multi-user.target

参考样例
程序文件路径 /usr/bin/trojan/trojan
配置文件路径 /etc/trojan/demoserver.json
服务启动方式 systemctl start trojan@demoserver


3 、 Trojan 配置

在官方的文档中其实有很详细的配置说明,参考 [ 链接 ]

对默认配置编辑就可以了,在此只提点几个重要的地方


3.1 、 Client 端 remote_addr 解析问题

默认 Trojan 首先是对域名进行地址转换为 IP,然后再直接访问这个 IP
但是如果这个域名支持 IPV6 解析,那转换后就使用 IPV6 进行访问了。
此时如果你的服务器没有监听 IPV6 端口,就会导致无法使用


3.2 、 Linux 下 Client 证书的问题

目前 Trojan Client 在 Linux 下需要手动指定 CA 路径,大多数 Linux 发行版的 CA 路径如下

"/etc/ssl/certs/ca-certificates.crt",                // Debian/Ubuntu/Gentoo etc.
"/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem", // CentOS/RHEL 7
"/etc/pki/tls/certs/ca-bundle.crt",                  // Fedora/RHEL 6
"/etc/ssl/ca-bundle.pem",                            // OpenSUSE
"/etc/pki/tls/cacert.pem",                           // OpenELEC

"/etc/ssl/certs",               // SLES10/SLES11, https://golang.org/issue/12139
"/system/etc/security/cacerts", // Android
"/usr/local/share/certs",       // FreeBSD
"/etc/pki/tls/certs",           // Fedora/RHEL
"/etc/openssl/certs",           // NetBSD

所以你如果使用的是 Linux 版,需要手动修改证书路径为

"cert": "/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem",

当发生该问题时,可以查看到关键错误日志字段如下 ( "log_level": 1 )

Client: SSL handshake failed with *.*.*.* : certificate verify failed
Server: SSL handshake failed : tlsv1 alert unknown ca

3.3 、内网安全问题

默认 trojan 是可以访问服务端 127.0.0.1 相关的端口,所以建议封禁
默认 trojan 使用的用户权限也可以缩减到普通用户
(注意 4096 以下端口需要 root 权限放通)


4 、 Trojan-GO

使用 Go 实现的完整 Trojan 代理 Trojan-Go [ 链接 ]

有需求就有市场,原版 Trojan 更像是一个开发模型,很多常用的功能都不支持
所以支持这些功能的 Trojan-Go 就成为了替代品

首先下载相关文件

mkdir /opt/trojan-go
cd /opt/trojan-go
wget https://github.com/p4gefau1t/trojan-go/releases/download/v0.10.6/trojan-go-linux-amd64.zip
unzip trojan-go-linux-amd64.zip

获得可执行文件后,我们额外还需要创建服务文件和配置文件,由于默认自带所以直接复制即可

ln -s /opt/trojan-go/trojan-go /usr/bin/trojan-go
cp /opt/trojan-go/example/trojan-go.service /etc/systemd/system/
cp /opt/trojan-go/example/server.json /opt/trojan-go/config.json
chmod -x /opt/trojan-go/example/server.json /opt/trojan-go/config.json
ln -s /opt/trojan-go/config.json /etc/trojan-go/config.json

复制完毕后,默认的配置文件如下所示

{
    "run_type": "server",
    "local_addr": "0.0.0.0",
    "local_port": 443,
    "remote_addr": "127.0.0.1",
    "remote_port": 80,
    "password": [
        "your_password"
    ],
    "ssl": {
        "cert": "your_cert.crt",
        "key": "your_key.key",
        "sni": "your-domain-name.com"
    },
    "router": {
        "enabled": true,
        "block": [
            "geoip:private"
        ],
        "geoip": "/usr/share/trojan-go/geoip.dat",
        "geosite": "/usr/share/trojan-go/geosite.dat"
    }
}

修改为如下所示,注意对应字段参数含义
服务器 X.X.X.X:14430
密码 your_password1
SNI your-domain-name.com

{
    "run_type": "server",
    "local_addr": "0.0.0.0",
    "local_port": 14430,
    "remote_addr": "127.0.0.1",
    "remote_port": 80,
    "log_level": 5,
    "log_file": "",
    "password": [
        "your_password1",
        "your_password2"
    ],
    "disable_http_check": false,
    "udp_timeout": 60,
    "ssl": {
        "verify": true,
        "verify_hostname": true,
        "cert": "your_cert.crt",
        "key": "your_key.key",
        "key_password": "",
        "sni": "your-domain-name.com",
        "prefer_server_cipher": false,
        "reuse_session": true,
        "fallback_addr": "",
        "fallback_port": 80
        "fingerprint": "",
    },
    "tcp": {
      "no_delay": true,
      "keep_alive": true,
      "prefer_ipv4": false
    },
    "mux": {
      "enabled": false,
      "concurrency": 8,
      "idle_timeout": 60
    },
    "router": {
        "enabled": true,
        "block": [
            "geoip:private",
            "full:localhost",
            "geosite:category-ads-all"
        ],
        "default_policy": "proxy",
        "domain_strategy": "as_is",
        "geoip": "/opt/trojan-go/geoip.dat",
        "geosite": "/opt/trojan-go/geosite.dat"
    }
}

对于客户端的配置如下所示,sock5 127.0.0.1:1080

{
    "run_type": "client",
    "local_addr": "127.0.0.1",
    "local_port": 1080,
    "remote_addr": "111.222.111.222",
    "remote_port": 14330,
    "log_level": 5,
    "log_file": "",
    "password": [
        "your_password1"
    ],
    "disable_http_check": false,
    "udp_timeout": 60,
    "ssl": {
        "verify": true,
        "verify_hostname": true,
        "cert": "/etc/ssl/certs/ca-certificates.crt",
        "sni": "your-domain-name.com",
        "prefer_server_cipher": false,
        "reuse_session": true,
        "fingerprint": "chrome"
    },
    "tcp": {
        "no_delay": true,
        "keep_alive": true,
        "prefer_ipv4": false
    },
    "router": {
        "enabled": true,
        "bypass": [
            "geoip:private",
            "full:localhost"
        ],
        "block": [
            "geosite:category-ads-all"
        ],
        "default_policy": "proxy",
        "domain_strategy": "as_is",
        "geoip": "/opt/trojan-go/geoip.dat",
        "geosite": "/opt/trojan-go/geosite.dat"
    }
}

在客户端中,注意额外放行 本地 DNS 的地址,本例放在了 bypass 中,阻断 DNS 会导致连接失败。


5 、备注

StarryVoid

Have a good time