Trojan 是一个新兴的工具,主要是提供一种方式,在仅 TLS 的情况下达成网络隧道的建立。 Trojan 具有多种协议 TLS,可以避免主动/被动检测和网络运营商 QoS 限制。
1 、 Trojan 简介
Trojan 模仿了最常见的协议 HTTPS (TLS) 以欺骗网络运营商并达成规避网络运营商 QOS 限制。
Github 项目 [ 链接 ]
文档 [ 链接 ]
2 、 Trojan 使用
先到 Github 上下载对应服务器版本的 Release 应该不用多说了。
./trojan config.json
.examples/trojan.service-example
cp -a ./examples/trojan.service-example /etc/systemd/system/trojan.service systemctl enable trojan systemctl start trojan
如果你需要降用户权限运行 Trojan,或者喜欢 [email protected] 的方式管理多配置文件,可以参考下方配置文件。
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
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 、备注
无