13 KiB
title, draft, weight
| title | draft | weight |
|---|---|---|
| 完整的配置文件 | false | 30 |
下面是一个完整的配置文件,其中的必填选项有
-
run_type -
local_addr -
local_port -
remote_addr -
remote_port
对于服务器server,key和cert为必填。
对于客户端client,反向代理隧道forward,以及透明代理nat,password必填
其余未填的选项,用下面给出的值进行填充。
{
"run_type": "client/server/nat",
"local_addr": "127.0.0.1",
"local_port": your_port1,
"remote_addr": "example.com",
"remote_port": your_port2,
"log_level": 1,
"log_file": "",
"password": [
"password1",
"password2"
],
"buffer_size": 512,
"ssl": {
"verify": true,
"verify_hostname": true,
"cert": "your_crt_file(optional for a client/forward/nat)",
"key": "your_key_file(optional for a client/forward/nat)",
"key_password": "",
"cipher": "",
"cipher_tls13": "",
"curves": "",
"prefer_server_cipher": false,
"sni": "",
"alpn": [],
"session_ticket": true,
"reuse_session": true,
"plain_http_response": "",
"fallback_port": 0,
"fingerprint": ""
},
"tcp": {
"no_delay": true,
"keep_alive": true,
"reuse_port": false,
"prefer_ipv4": false,
"fast_open": false,
"fast_open_qlen": 20
},
"mux": {
"enabled": false,
"concurrency": 8,
"idle_timeout": 60
},
"router": {
"enabled": false,
"bypass": [],
"proxy": [],
"block": [],
"route_by_ip": false,
"route_by_ip_on_nonmatch": false,
"default_policy": "proxy"
},
"websocket": {
"enabled": false,
"path": "",
"hostname": "",
"obfuscation_password": "",
"double_tls": true
},
"forward_proxy": {
"enabled": false,
"proxy_addr": "",
"proxy_port": 0,
"username": "",
"password": ""
},
"mysql": {
"enabled": false,
"server_addr": "",
"server_port": 0,
"database": "",
"username": "",
"password": "",
"check_rate": 60
}
}
说明
一般选项
对于client/nat/forward,remote_xxxx应当填写你的trojan服务器地址和端口号,local_xxxx对应本地开放的socks5/http代理地址(自动适配)
对于server,local_xxxx对应trojan服务器监听地址(强烈建议使用443端口),remote_xxxx填写识别到非trojan流量时代理到的HTTP服务地址,通常填写本地80端口。
log_level指定日志等级。等级越高,输出的信息越少,0输出Debug以上日志(所有日志),1输出Info及以上日志,2输出Warning及以上日志,3输出Error及以上信息,4输出Fatal及以上信息,5完全不输出日志。
log_file指定日志输出文件路径。如果未指定则使用标准输出。
password可以填入多个密码。除了使用配置文件配置密码之外,trojan-go还支持使用mysql配置密码,参见下文。客户端的密码,只有与服务端配置文件中或者在数据库中的密码记录一致,才能通过服务端的校验,正常使用代理服务。
buffer_size为单个连接缓冲区大小,单位KiB,默认512KiB。提升这个数值可以提升网络吞吐量和效率,但是也会增加内存消耗。
ssl选项
verify表示客户端(client/nat/forward)是否校验服务端提供的证书合法性,默认开启。出于安全性考虑,这个选项不应该在实际场景中选择false,否则可能遭受中间人攻击。如果使用自签名或者自签发的证书,开启verify会导致校验失败。这种情况下,应当保持verify开启,然后在cert中填写服务端的证书,即可正常连接。
verify_hostname表示客户端(client/nat/forward)是否校验服务端提供的证书的Common Name和本地提供的SNI字段的一致性。
服务端必须填入cert和key,对应服务器的证书和私钥文件,请注意证书是否有效/过期。如果使用权威CA签发的证书,客户端(client/nat/forward)可以不填写cert。如果使用自签名或者自签发的证书,应当在的cert处填入服务器证书文件,否则可能导致校验失败。
sni指的是证书的Common Name,如果你使用letsencrypt等机构签名的证书,这里填入你的域名。如果这一项未填,将使用remote_addr填充。你应当指定一个有效的SNI(和远端证书CN一致),否则客户端可能无法验证远端证书有效性从而无法连接。
alpn为TLS的应用层协议协商指定协议。在TLS Client/Server Hello中传输,协商应用层使用的协议,仅用作指纹伪造 。
prefer_server_cipher客户端是否偏好选择服务端在协商中提供的密码学套件。
cipher和cipher13指TLS使用的密码学套件。只有在你明确知道自己在做什么的情况下,才应该去填写此项以修改trojan-go使用的TLS密码学套件。正常情况下,你应该将其留空或者不填,trojan-go会根据当前硬件平台以及远端的情况,自动选择最合适的加密算法以提升性能和安全性。如果需要填写,密码学套件名用分号(":")分隔。Go的TLS库中弃用了TLS1.2中不安全的密码学套件,并完全支持TLS1.3。默认情况下,trojan-go将优先使用更安全的TLS1.3
curves指定TLS在ECDHE中偏好使用的椭圆曲线。只有你明确知道自己在做什么的情况下,才应该填写此项。曲线名称用分号(":")分隔。
fingerprint用于指定TLS Client Hello指纹伪造类型,以抵抗GFW对于TLS Client Hello指纹的特征识别和阻断。trojan-go使用utls进行指纹伪造。合法的值有
-
""(空),默认,不使用指纹伪造
-
"auto",自动选择(推荐)
-
"firefox",伪造Firefox指纹
-
"chrome",伪造Chrome指纹
-
"ios",伪造ios指纹
-
"randomized",随机指纹
一旦指纹的值被设置,cipher,curves,alpn,session_ticket等有可能影响指纹的字段将使用该指纹的特定设置覆写。设置该选项有可能导致与服务器密钥协商失败,使用auto选项将自动尝试所有指纹并选出合适的一项。
plain_http_response指定了当TLS握手失败时,明文发送的原始数据(原始TCP数据)。这个字段填入该文件路径。推荐使用fallback_port而不是该字段。
fallback_port指TLS握手失败时,trojan-go将该连接代理到该端口上。这是trojan-go的特性,以便更好地隐蔽Trojan服务器,抵抗GFW的主动检测,使得服务器的443端口在遭遇非TLS协议的探测时,行为与正常服务器完全一致。当服务器接受了一个连接但无法进行TLS握手时,如果fallback_port不为空,则流量将会被代理至remote_addr:fallback_port。例如,你可以在本地使用nginx开启一个https服务,当你的服务器443端口被非TLS协议请求时(比如http请求),trojan-go将代理至本地https服务器,nginx将使用http协议明文返回一个400 Bad Request页面。你可以通过使用浏览器访问 http://your_domain_name.com:443 进行验证。
mux多路复用选项
多路复用是trojan-go的特性。如果服务器和客户端都是trojan-go,可以开启mux多路复用以减少高并发情景下的延迟(只需要客户端开启此选项即可,服务端自动适配)。
enabled是否开启多路复用
mux_concurrency指单个TLS隧道可以承载的最大连接数,默认为8。这个数值越大,多连接并发时TLS由于握手产生的延迟就越低,但网络吞吐量可能会有所降低,填入负数或者0表示所有连接只使用一个TLS隧道承载。
mux_idle_timeout指TLS隧道在空闲多久之后关闭,单位为秒。
router路由选项
路由功能是trojan-go的特性。trojan-go的路由策略有三种。
-
Proxy 代理。将请求通过TLS隧道进行代理,由trojan服务器和目的地址进行连接。
-
Bypass 绕过。直接在本地和目的地址进行连接。
-
Block 封锁。不代理请求,直接关闭连接。
在proxy, bypass, block字段中填入对应列表文件名或者geoip/geosite标签名,trojan-go即根据列表中的IP(CIDR)或域名执行相应路由策略。列表文件中每行是一个IP或者域名,trojan-go会自动识别。
enabled是否开启路由模块。
route_by_ip 开启后,所有域名会被在本地解析为IP后,仅使用IP列表进行匹配。如果开启这个选项,可能导致DNS泄露。
route_by_ip_on_nonmatch开启后,如果一个域名不在三个列表中,则会被在本地解析为IP后,仅使用IP列表进行匹配。如果开启这个选项,可能导致DNS泄露。
default_policy指的是三个列表匹配均失败后,使用的默认策略,默认为Proxy,即进行代理。
websocket选项
Websocket传输是trojan-go的特性。在正常的直接连接服务器节点的情况下,开启这个选项不会提升线路质量(甚至有可能下降),也不会提升你的连接安全性。你只应该在下面两种情况下启用它:
-
你需要利用CDN进行流量中转
-
你到代理节点的直接TLS连接遭到了GFW的中间人攻击
警告:由于信任CDN证书并使用CDN网络进行传输,HTTPS连接对于CDN是透明的,CDN运营商可以查看Websocket流量传输内容。如果你使用了国内CDN,务必开启double_tls进行双重加密,并使用password进行流量混淆
enabled表示是否启用Websocket承载流量,服务端开启后同时支持一般Trojan协议和基于websocket的Trojan协议,客户端开启后将只使用websocket承载所有Trojan协议流量。
path指的是Websocket使用的URL路径,必须以斜杠("/")开头,如"/longlongwebsocketpath",并且服务器和客户端必须一致。
hostnameWebsocket握手时使用的主机名,客户端如果留空则使用remote_addr填充。如果使用了CDN,这个选项一般填入域名。
double_tls是否开启双重TLS,默认开启。开启后在TLS+Websocket上将会再承载一次TLS连接。双重TLS的意义在于即使第一层TLS遭到中间人攻击也能保证通信安全。第二层TLS的证书校验被强制打开。客户端和服务端设置必须相同。这个选项对性能有一定影响,请自行斟酌安全性和性能的平衡。
obfuscation_password指定混淆密码。用于混淆内层连接以降低遭到国内无良CDN运营商识别的概率。如果需要使用混淆,服务端和客户端必须同时设置相同密码。这个选项对性能有一定影响,请自行斟酌安全性和性能的平衡。
tcp选项
no_delay是否禁用纳格算法(Nagle’s algorithm),即TCP封包是否直接发出而不等待缓冲区填满。
keep_alive是否启用TCP心跳存活检测。
reuse_port是否启用端口复用。由于trojan-gfw版本对多线程支持不佳,因而服务器使用此选项开启多个进程监听同一端口以提升并发性能。trojan-go本身的并发性能足够优秀,并无必要开启此选项。该选项仅为兼容而保留。
prefer_ipv4是否优先使用IPv4地址。
fast_open是否启用TCP Fast Open。开启此选项需要操作系统支持。考虑到TFO开启后的TCP封包特征明显,容易被GFW阻断,且可能存在安全性问题,trojan-go仅仅出于兼容目的在服务端实现TFO支持。
fast_open_qlenTCP Fast Open的qlen值,即允许的同时发起的未经三次握手的TFO连接数量。
mysql数据库选项
enabled表示是否启用mysql数据库进行用户验证。
check_rate是trojan-go从MySQL获取用户数据,更新缓存的间隔时间,单位是秒。
其他选项可以顾名思义,不再赘述。
users表结构和trojan-gfw定义一致,下面是一个创建users表的例子。注意这里的password指的是密码经过SHA224哈希之后的值(字符串),流量download, upload, quota的单位是字节。你可以通过修改数据库users表中的用户记录的方式,添加和删除用户,或者指定用户的流量配额。trojan-go会根据所有的用户流量配额,自动更新当前有效的用户列表。如果download+upload>quota,trojan-go服务器将拒绝该用户的连接。
CREATE TABLE users (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
username VARCHAR(64) NOT NULL,
password CHAR(56) NOT NULL,
quota BIGINT NOT NULL DEFAULT 0,
download BIGINT UNSIGNED NOT NULL DEFAULT 0,
upload BIGINT UNSIGNED NOT NULL DEFAULT 0,
PRIMARY KEY (id),
INDEX (password)
);
forward_proxy前置代理选项
前置代理选项允许使用其他代理承载trojan-go的流量
enabled是否启用前置代理(socks5)。
proxy_addr前置代理的主机地址。
proxy_port前置代理的端口号。
username password代理的用户和密码,如果留空则不使用认证。