Files
trojan-go/docs/content/basic/full-config.md
T
2020-06-11 07:38:52 +00:00

17 KiB
Raw Blame History

title, draft, weight
title draft weight
完整的配置文件 false 30

下面是一个完整的配置文件,其中的必填选项有

  • run_type

  • local_addr

  • local_port

  • remote_addr

  • remote_port

对于服务器serverkeycert为必填。

对于客户端client,反向代理隧道forward,以及透明代理nat,password必填

其余未填的选项,用下面给出的值进行填充。

{
  "run_type": *required*,
  "local_addr": *required*,
  "local_port": *required*,
  "remote_addr": *required*,
  "remote_port": *required*,
  "log_level": 1,
  "log_file": "",
  "password": [],
  "buffer_size": 32,
  "dns": [],
  "disable_http_check": false,
  "ssl": {
    "verify": true,
    "verify_hostname": true,
    "cert": *required*,
    "key": *required*,
    "key_password": "",
    "cipher": "",
    "cipher_tls13": "",
    "curves": "",
    "prefer_server_cipher": false,
    "sni": "",
    "alpn": [
      "http/1.1"
    ],
    "session_ticket": true,
    "reuse_session": true,
    "plain_http_response": "",
    "fallback_port": 0,
    "fingerprint": "firefox",
  },
  "tcp": {
    "no_delay": true,
    "keep_alive": true,
    "prefer_ipv4": false,
  },
  "mux": {
    "enabled": false,
    "concurrency": 8,
    "idle_timeout": 60
  },
  "router": {
    "enabled": false,
    "bypass": [],
    "proxy": [],
    "block": [],
    "default_policy": "proxy",
    "domain_strategy": "as_is",
    "geoip": "geoip.dat",
    "geosite": "geosite.dat"
  },
  "websocket": {
    "enabled": false,
    "path": "",
    "hostname": ""
  },
  "shadowsocks": {
    "enabled": false,
    "method": "AES-128-GCM",
    "password": ""
  },
  "transport_plugin": {
    "enabled": false,
    "type": "",
    "command": "",
    "plugin_option": "",
    "arg": [],
    "env": []
  },
  "forward_proxy": {
    "enabled": false,
    "proxy_addr": "",
    "proxy_port": 0,
    "username": "",
    "password": ""
  },
  "mysql": {
    "enabled": false,
    "server_addr": "localhost",
    "server_port": 3306,
    "database": "",
    "username": "",
    "password": "",
    "check_rate": 60
  },
  "redis": {
    "enabled": false,
    "server_addr": "localhost",
    "server_port": 6379,
    "password": ""
  },
  "api": {
    "enabled": false,
    "api_addr": "",
    "api_port": 0,
    "api_tls": false,
    "ssl": {
      "cert": "",
      "key": "",
      "key_password": "",
      "client_cert": []
    }
  }
}

说明

一般选项

对于client/nat/forwardremote_xxxx应当填写你的trojan服务器地址和端口号,local_xxxx对应本地开放的socks5/http代理地址(自动适配)

对于serverlocal_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,默认32KiB。适当提升这个数值可以提升网络吞吐量和效率,但是也会增加内存消耗。对于路由器等嵌入式系统,建议根据实际情况,适当减小该数值。

dns指定trojan-go使用的DNS服务器列表,如果不指定则使用主机默认DNS。如果指定了服务器,按照列表顺序依次查询,支持UDP/TCP/DOT类型的DNS,查询结果会被缓存五分钟。使用URL格式描述服务器,例如

  • "udp://1.1.1.1",基于UDP的DNS服务器,默认53端口

  • "udp://1.1.1.1:53",与上一项等价

  • "1.1.1.1",与上一项等价

  • "tcp://1.1.1.1",基于TCP的DNS服务器,默认53端口

  • "dot://1.1.1.1",基于DOT(DNS Over TLS)的DNS服务器,默认853端口

使用DOT可以防止DNS请求泄露,但由于TLS的握手耗费更多时间,查询速度也会有一定的下降,请自行斟酌性能和安全性的平衡。

disable_http_check是否禁用HTTP可用性检查。

ssl选项

verify表示客户端(client/nat/forward)是否校验服务端提供的证书合法性,默认开启。出于安全性考虑,这个选项不应该在实际场景中选择false,否则可能遭受中间人攻击。如果使用自签名或者自签发的证书,开启verify会导致校验失败。这种情况下,应当保持verify开启,然后在cert中填写服务端的证书,即可正常连接。

verify_hostname表示服务端是否校验客户端提供的SNI与服务端设置的一致性。如果服务端SNI字段留空,认证将被强制关闭。

服务端必须填入certkey,对应服务器的证书和私钥文件,请注意证书是否有效/过期。如果使用权威CA签发的证书,客户端(client/nat/forward)可以不填写cert。如果使用自签名或者自签发的证书,应当在的cert处填入服务器证书文件,否则可能导致校验失败。

sni指的是TLS客户端请求中的服务器名字段,一般和证书的Common Name相同。如果你使用let'sencrypt等机构签发的证书,这里填入你的域名。如果这一项未填,将使用remote_addr填充。你应当指定一个有效的SNI(和远端证书CN一致),否则客户端可能无法验证远端证书有效性从而无法连接。

alpn为TLS的应用层协议协商指定协议。在TLS Client/Server Hello中传输,协商应用层使用的协议,仅用作指纹伪造,并无实际作用。如果使用了CDN,错误的alpn字段可能导致与CDN协商错误的应用层协议

prefer_server_cipher客户端是否偏好选择服务端在协商中提供的密码学套件。

ciphercipher13指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进行指纹伪造,默认伪造Firefox的指纹。合法的值有

  • "",不使用指纹伪造

  • "firefox",伪造Firefox指纹(默认)

  • "chrome",伪造Chrome指纹

  • "ios",伪造iOS指纹

一旦指纹的值被设置,ciphercurvesalpnsession_ticket等有可能影响指纹的字段将使用该指纹的特定设置覆写。

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进行验证。

key_logTLS密钥日志的文件路径。如果填写则开启密钥日志。记录密钥将破坏TLS的安全性,此项不应该用于除调试以外的其他任何用途。

mux多路复用选项

多路复用是trojan-go的特性。如果服务器和客户端都是trojan-go,可以开启mux多路复用以减少高并发情景下的延迟(只需要客户端开启此选项即可,服务端自动适配)。

注意,多路复用的意义在于降低握手延迟,而不是提升链路速度。相反,它会增加客户端和服务端的CPU和内存消耗,从而可能造成速度下降。

enabled是否开启多路复用。

concurrency指单个TLS隧道可以承载的最大连接数,默认为8。这个数值越大,多连接并发时TLS由于握手产生的延迟就越低,但网络吞吐量可能会有所降低,填入负数或者0表示所有连接只使用一个TLS隧道承载。

idle_timeout指TLS隧道在空闲多久之后关闭,单位为秒。如果数值为负值或0,则一旦TLS隧道空闲,则立即关闭。

router路由选项

路由功能是trojan-go的特性。trojan-go的路由策略有三种。

  • Proxy 代理。将请求通过TLS隧道进行代理,由trojan服务器和目的地址进行连接。

  • Bypass 绕过。直接在本地和目的地址进行连接。

  • Block 封锁。不代理请求,直接关闭连接。

proxy, bypass, block字段中填入对应列表geoip/geosite或路由规则,trojan-go即根据列表中的IP(CIDR)或域名执行相应路由策略。客户端(client)可以配置三种策略,服务端(server)只可配置block策略。

enabled是否开启路由模块。

default_policy指的是三个列表匹配均失败后,使用的默认策略,默认为"proxy",即进行代理。合法的值有

  • "proxy"

  • "bypass"

  • "block"

含义同上。

domain_strategy域名解析策略,默认"as_is"。合法的值有:

  • "as_is",只在域名列表中进行匹配。

  • "ip_if_non_match",在域名列表中进行匹配,如果不匹配,解析为IP后在IP列表中匹配。该策略可能导致DNS泄漏或遭到污染。

  • "ip_on_demand",域名均解析为IP,在IP列表中匹配。该策略可能导致DNS泄漏或遭到污染。

geoipgeosite字段指geoip和geosite数据库文件路径,默认使用当前目录的geoip.dat和geosite.dat。

websocket选项

Websocket传输是trojan-go的特性。在正常的直接连接代理节点的情况下,开启这个选项不会改善你的链路速度(甚至有可能下降),也不会提升你的连接安全性。你只应该在需要利用CDN进行中转,或利用nginx等服务器根据路径分发的情况下,使用websocket。

enabled表示是否启用Websocket承载流量,服务端开启后同时支持一般Trojan协议和基于websocket的Trojan协议,客户端开启后将只使用websocket承载所有Trojan协议流量。

path指的是Websocket使用的URL路径,必须以斜杠("/")开头,如"/longlongwebsocketpath",并且服务器和客户端必须一致。

hostnameWebsocket握手时使用的主机名,客户端如果留空则使用remote_addr填充。如果使用了CDN,这个选项一般填入域名。

shadowsocks AEAD加密选项

此选项用于替代弃用的混淆加密和双重TLS。如果此选项被设置启用,Trojan协议层下将插入一层Shadowsocks AEAD加密层。也即(已经加密的)TLS隧道内,所有的Trojan协议将再使用AEAD加密。注意,此选项和Websocket是否开启无关。无论Websocket是否开启,所有Trojan流量都会被再进行一次加密。

注意,开启这个选项将有可能降低传输性能,你只应该在不信任承载Trojan协议的传输信道的情况下,启用这个选项。例如:

  • 你使用了Websocket,经过不可信的CDN进行中转(如国内CDN)

  • 你与服务器的连接遭到了GFW针对TLS的中间人攻击

  • 你的证书失效,无法验证证书有效性

等等。

由于使用的是AEADtrojan-go启用了AEAD加密后依然可以正确判断是否遭到主动探测,并作出相应的响应。

enabled是否启用Shadowsocks AEAD加密Trojan协议层。

method加密方式。合法的值有:

  • "CHACHA20-IETF-POLY1305"

  • "AES-128-GCM" (默认)

  • "AES-256-GCM"

password用于生成主密钥的密码。必须确保客户端和服务端一致。

transport_plugin传输层插件选项

enabled是否启用传输层插件替代TLS传输。一旦启用传输层插件支持,trojan-go将会把未经TLS加密的trojan协议流量明文传输给插件,以允许用户对流量进行自定义的混淆和加密。

type插件类型。目前支持的类型有

  • "shadowsocks",支持符合SIP003标准的shadowsocks混淆插件。trojan-go将在启动时按照SIP003标准替换环境变量并修改自身配置(remote_addr/remote_port/local_addr/local_port),使插件与远端直接通讯,而trojan-go仅监听/连接插件。

  • "plaintext",使用明文传输。选择此项,trojan-go不会修改任何地址配置(remote_addr/remote_port/local_addr/local_port),也不会启动command中插件,仅移除最底层的TLS传输层并使用TCP明文传输。此选项目的为支持nginx等接管TLS并进行分流,以及高级用户进行调试测试。请勿直接使用明文传输模式穿透防火墙。

  • "other",其他插件。选择此项,trojan-go不会修改任何地址配置(remote_addr/remote_port/local_addr/local_port),但会启动command中插件并传入参数和环境变量。

command传输层插件可执行文件的路径。trojan-go将在启动时一并执行它。

arg传输层插件启动参数。这是一个列表,例如["-config", "test.json"]

env传输层插件环境变量。这是一个列表,例如["VAR1=foo", "VAR2=bar"]

option传输层插件配置(SIP003)。例如"obfs=http;obfs-host=www.baidu.com"

tcp选项

no_delayTCP封包是否直接发出而不等待缓冲区填满。

keep_alive是否启用TCP心跳存活检测。

prefer_ipv4是否优先使用IPv4地址。

mysql数据库选项

trojan-go兼容trojan-gfw的基于mysql的用户管理方式,但更推荐的方式是使用API。

enabled表示是否启用mysql数据库进行用户验证。

check_rate是trojan-go从MySQL获取用户数据,更新缓存的间隔时间,单位是秒。

其他选项可以顾名思义,不再赘述。

users表结构和trojan-gfw定义一致,下面是一个创建users表的例子。注意这里的password指的是密码经过SHA224散列之后的值(字符串),流量download, upload, quota的单位是字节。你可以通过修改数据库users表中的用户记录的方式,添加和删除用户,或者指定用户的流量配额。trojan-go会根据所有的用户流量配额,自动更新当前有效的用户列表。如果download+upload>quotatrojan-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代理的用户和密码,如果留空则不使用认证。

api选项

trojan-go基于gRPC提供了API,以支持服务端和客户端的管理和统计。可以实现客户端的流量和速度统计,服务端各用户的流量和速度统计,用户的动态增删和限速等。

enabled是否启用API功能。

api_addrgRPC监听的地址。

api_portgRPC监听的端口。

api_tlsgRPC是否启用TLS传输(双向认证)。

ssl TLS相关设置,如果开启TLS传输和双向认证,所有选项为必填。其中key, cert为API服务器使用的密钥和证书文件,client_cert为客户端使用的证书文件路径,用于客户端认证。

警告:不要将未开启TLS双向认证的API服务直接暴露在互联网上,否则可能导致各类安全问题。