diff --git a/Basis/Methods.py b/Basis/Methods.py index a9a7d4d..49e19f5 100644 --- a/Basis/Methods.py +++ b/Basis/Methods.py @@ -1,6 +1,7 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- +# Shadowsocks Info ssMethods = { # methods support of different Shadowsocks project 'ss-rust': [ # table method removed refer to https://github.com/shadowsocks/shadowsocks-rust/issues/887 'none', 'plain', 'rc4', 'rc4-md5', @@ -65,6 +66,26 @@ ssAllMethods = set() [ssAllMethods.update(ssMethods[x]) for x in ssMethods] ssAllMethods = sorted(list(ssAllMethods)) # methods of Shadowsocks +# Plugin Info +plugins = { + 'simple-obfs': ['obfs-local', 'obfs-server'], + 'simple-tls': ['simple-tls'], + 'v2ray': ['v2ray-plugin'], + 'xray': ['xray-plugin'], + 'kcptun': ['kcptun-client', 'kcptun-server'], + 'gost': ['gost-plugin'], + 'cloak': ['ck-client', 'ck-server'], + 'go-quiet': ['gq-client', 'gq-server'], + 'mos-tls-tunnel': ['mtt-client', 'mtt-server'], + 'rabbit': ['rabbit-plugin', 'rabbit'], + 'qtun': ['qtun-client', 'qtun-server'], + 'gun': ['gun-plugin'], +} + +plugins = {x: [plugins[x][0], plugins[x][1 if len(plugins[x]) == 2 else 0]] for x in plugins} +plugins = {x: {'client': plugins[x][0], 'server': plugins[x][1]} for x in plugins} # format plugins info + +# ShadowsocksR Info ssrMethods = [ # methods of ShadowsocksR 'aes-128-ctr', 'aes-192-ctr', 'aes-256-ctr', 'aes-128-gcm', 'aes-192-gcm', 'aes-256-gcm', @@ -91,21 +112,3 @@ ssrObfuscations = [ # obfuscations of ShadowsocksR (obfs) 'plain', 'http_post', 'http_simple', 'random_head', 'tls_simple', 'tls1.2_ticket_auth', 'tls1.2_ticket_fastauth', ] - -plugin = { - 'simple-obfs': ['obfs-local', 'obfs-server'], - 'simple-tls': ['simple-tls'], - 'v2ray': ['v2ray-plugin'], - 'xray': ['xray-plugin'], - 'kcptun': ['kcptun-client', 'kcptun-server'], - 'gost': ['gost-plugin'], - 'cloak': ['ck-client', 'ck-server'], - 'go-quiet': ['gq-client', 'gq-server'], - 'mos-tls-tunnel': ['mtt-client', 'mtt-server'], - 'rabbit': ['rabbit-plugin', 'rabbit'], - 'qtun': ['qtun-client', 'qtun-server'], - 'gun': ['gun-plugin'], -} - -plugin = {x: [plugin[x][0], plugin[x][1 if len(plugin[x]) == 2 else 0]] for x in plugin} -plugin = {x: {'client': plugin[x][0], 'server': plugin[x][1]} for x in plugin} # format plugin info diff --git a/Tester/Plugin.py b/Tester/Plugin.py index e4ae4af..d790425 100644 --- a/Tester/Plugin.py +++ b/Tester/Plugin.py @@ -5,22 +5,22 @@ import os import re import json from Basis.Logger import logging -from Basis.Methods import plugin from Basis.Process import Process +from Basis.Methods import plugins from Basis.Functions import genFlag, getAvailablePort settings = { 'serverBind': '127.0.0.1', - 'workDir': '/tmp/ProxyC' + 'workDir': '/tmp/ProxyC', } pluginParams = { 'SITE': 'www.bing.com', - 'PATH': '/test', 'HOST': '343.re', 'CERT': '/etc/ssl/certs/343.re/fullchain.pem', 'KEY': '/etc/ssl/certs/343.re/privkey.pem', - 'PASSWD': 'dnomd343', + 'PATH': '/' + genFlag(length = 6), + 'PASSWD': genFlag(length = 8), } pluginConfig = { @@ -231,8 +231,8 @@ def cloakLoad() -> None: pluginParams['CK_PUBLIC'] = re.search(r'\s+(\S+)$', ckKey.split('\n')[0])[1] pluginParams['CK_PRIVATE'] = re.search(r'\s+(\S+)$', ckKey.split('\n')[1])[1] pluginParams['CK_UID'] = re.search(r'\s+(\S+)\n', os.popen('ck-server -uid').read())[1] # generate uid for clock - logging.info('generate clock uid -> %s' % pluginParams['CK_UID']) - logging.info('generate clock key -> %s (Public) | %s (Private)' % ( + logging.info('generate cloak uid -> %s' % pluginParams['CK_UID']) + logging.info('generate cloak key -> %s (Public) | %s (Private)' % ( pluginParams['CK_PUBLIC'], pluginParams['CK_PRIVATE'] )) ckPrefix = 'UID=${CK_UID};PublicKey=${CK_PUBLIC};ServerName=${SITE};' # cloak plugin's basic command @@ -300,11 +300,11 @@ def load(): 'type': pluginType, 'caption': pluginTest, 'server': { # plugin info for server - 'type': plugin[pluginType]['server'], + 'type': plugins[pluginType]['server'], 'param': paramFill(pluginTestInfo[0]), }, 'client': { # plugin info for client - 'type': plugin[pluginType]['client'], + 'type': plugins[pluginType]['client'], 'param': paramFill(pluginTestInfo[1]), }, 'inject': ssInject # for some special plugins (only server part) diff --git a/docs/ProxyObject/Shadowsocks.md b/docs/ProxyObject/Shadowsocks.md index 90ad9bf..3b89975 100644 --- a/docs/ProxyObject/Shadowsocks.md +++ b/docs/ProxyObject/Shadowsocks.md @@ -1,78 +1,121 @@ -## Shadowsocks - -> **remark** -> -> + 类型:*str* -> + 说明:节点备注名称 -> + 缺省:'' -> + 可选值:不限 +## ssObject ``` { - 'type': 'ss', - 'server': ..., - 'port': ..., - 'method': ..., - 'passwd': ..., - 'plugin': ... + 'server': ---, + 'port': ---, + 'method': ---, + 'passwd': ---, + 'plugin': ---, } ``` -**server** +### server + 类型:*str* -+ 说明:服务器地址 ++ 说明:Shadowsocks服务地址 + 缺省:必选 -+ 可选值:合法的IP地址或域名 ++ 限制:IP地址或域名 -**port** +### port + 类型:*int* -+ 说明:服务器端口 ++ 说明:Shadowsocks服务端口 + 缺省:必选 -+ 可选值:1 ~ 65535 ++ 限制:1 ~ 65535 -**method** +### method + 类型:*str* + 说明:Shadowsocks加密方式 + 缺省:必选 -+ 可选值:`aes-128-gcm`,`aes-192-gcm`,`aes-256-gcm`,`aes-128-ctr`,`aes-192-ctr`,`aes-256-ctr`,`aes-128-ocb`,`aes-192-ocb`,`aes-256-ocb`,`aes-128-ofb`,`aes-192-ofb`,`aes-256-ofb`,`aes-128-cfb`,`aes-192-cfb`,`aes-256-cfb`,`aes-128-cfb1`,`aes-192-cfb1`,`aes-256-cfb1`,`aes-128-cfb8`,`aes-192-cfb8`,`aes-256-cfb8`,`aes-128-cfb128`,`aes-192-cfb128`,`aes-256-cfb128`,`camellia-128-cfb`,`camellia-192-cfb`,`camellia-256-cfb`,`camellia-128-cfb128`,`camellia-192-cfb128`,`camellia-256-cfb128`,`plain`,`none`,`table`,`rc4`,`rc4-md5`,`rc2-cfb`,`bf-cfb`,`cast5-cfb`,`des-cfb`,`idea-cfb`,`seed-cfb`,`salsa20`,`salsa20-ctr`,`xchacha20`,`chacha20`,`chacha20-ietf`,`chacha20-poly1305`,`chacha20-ietf-poly1305`,`xchacha20-ietf-poly1305` -+ 建议值:`aes-256-gcm`,`aes-128-gcm`,`chacha20-ietf-poly1305` ++ 限制:(以下69种加密方式) + +`aes-128-ccm`, `aes-256-ccm` + +`aes-128-gcm-siv`, `aes-256-gcm-siv` + +`aes-128-gcm`, `aes-192-gcm`, `aes-256-gcm` + +`aes-128-ctr`, `aes-192-ctr`, `aes-256-ctr` + +`aes-128-ocb`, `aes-192-ocb`, `aes-256-ocb` + +`aes-128-ofb`, `aes-192-ofb`, `aes-256-ofb` + +`aes-128-cfb`, `aes-192-cfb`, `aes-256-cfb` + +`aes-128-cfb1`, `aes-192-cfb1`, `aes-256-cfb1` + +`aes-128-cfb8`, `aes-192-cfb8`, `aes-256-cfb8` + +`aes-128-cfb128`, `aes-192-cfb128`, `aes-256-cfb128` + +`camellia-128-ctr`, `camellia-192-ctr`, `camellia-256-ctr` + +`camellia-128-ofb`, `camellia-192-ofb`, `camellia-256-ofb` + +`camellia-128-cfb`, `camellia-192-cfb`, `camellia-256-cfb` -**passwd** +`camellia-128-cfb1`, `camellia-192-cfb1`, `camellia-256-cfb1` + +`camellia-128-cfb8`, `camellia-192-cfb8`, `camellia-256-cfb8` + +`camellia-128-cfb128`, `camellia-192-cfb128`, `camellia-256-cfb128` + +`none`, `plain`, `table`, `rc4`, `rc4-md5` + +`bf-cfb`, `des-cfb`, `rc2-cfb`, `idea-cfb`, `seed-cfb`, `cast5-cfb` + +`salsa20`, `chacha20`, `xchacha20`, `salsa20-ctr`, `chacha20-ietf` + +`chacha20-poly1305`, `chacha20-ietf-poly1305`, `xchacha20-ietf-poly1305` + +`2022-blake3-aes-128-gcm`, `2022-blake3-aes-256-gcm` + +`2022-blake3-chacha8-poly1305`, `2022-blake3-chacha20-poly1305` + +### passwd + 类型:*str* + 说明:Shadowsocks连接密码 + 缺省:必选 -+ 可选值:不限 ++ 限制:无 -**plugin** +### plugin -+ 类型:*None* / *pluginObject* ++ 类型:*None* / [*pluginObject*](#pluginobject) + 说明:SIP003插件 -+ 缺省:None -+ 可选值:不限 ++ 缺省:`None` ++ 限制:无 -### pluginObject +## pluginObject ``` { - 'type': ..., - 'param': ... + 'type': ---, + 'param': ---, } ``` -**type** +### type + 类型:*str* -+ 说明:SIP003插件名称 ++ 说明:插件名称 + 缺省:必选 -+ 可选值:`obfs-local`,`simple-tls`,`v2ray-plugin`,`xray-plugin`,`kcptun-client`,`gost-plugin`,`ck-client`,`gq-client`,`mtt-client`,`rabbit-plugin`,`qtun-client`,`gun-plugin` ++ 限制:(以下12种插件名称) + +`obfs-local`, `simple-tls` + +`kcptun-client`, `qtun-client`, `gun-plugin` + +`v2ray-plugin`, `xray-plugin`, `gost-plugin` + +`ck-client`, `gq-client`, `mtt-client`, `rabbit-plugin` -**param** +### param + 类型:*str* -+ 说明:SIP003插件参数 -+ 缺省:'' -+ 可选值:不限 ++ 说明:插件参数 ++ 缺省:`空` ++ 限制:无 diff --git a/docs/ProxyObject/ShadowsocksR.md b/docs/ProxyObject/ShadowsocksR.md index c14ebda..a6fab5c 100644 --- a/docs/ProxyObject/ShadowsocksR.md +++ b/docs/ProxyObject/ShadowsocksR.md @@ -1,85 +1,110 @@ -## ShadowsocksR - -> **remark** -> -> + 类型:*str* -> + 说明:节点备注名称 -> + 缺省:'' -> + 可选值:不限 - -> **group** -> -> + 类型:*str* -> + 说明:节点所属群组 -> + 缺省:'' -> + 可选值:不限 +## ssrObject ``` { - 'type': 'ssr', - 'server': ..., - 'port': ..., - 'method': ..., - 'passwd': ..., - 'protocol': ..., - 'protocolParam': ..., - 'obfs': ..., - 'obfsParam': ... + 'server': ---, + 'port': ---, + 'method': ---, + 'passwd': ---, + 'protocol': ---, + 'protocolParam': ---, + 'obfs': ---, + 'obfsParam': ---, } ``` -**server** +### server + 类型:*str* -+ 说明:服务器地址 ++ 说明:ShadowsocksR服务地址 + 缺省:必选 -+ 可选值:合法的IP地址或域名 ++ 限制:IP地址或域名 -**port** +### port + 类型:*int* -+ 说明:服务器端口 ++ 说明:ShadowsocksR服务端口 + 缺省:必选 -+ 可选值:1 ~ 65535 ++ 限制:1 ~ 65535 -**method** +### method + 类型:*str* + 说明:ShadowsocksR加密方式 + 缺省:必选 -+ 可选值:`aes-128-cfb`,`aes-192-cfb`,`aes-256-cfb`,`aes-128-cfb1`,`aes-192-cfb1`,`aes-256-cfb1`,`aes-128-cfb8`,`aes-192-cfb8`,`aes-256-cfb8`,`aes-128-ctr`,`aes-192-ctr`,`aes-256-ctr`,`aes-128-gcm`,`aes-192-gcm`,`aes-256-gcm`,`aes-128-ofb`,`aes-192-ofb`,`aes-256-ofb`,`camellia-128-cfb`,`camellia-192-cfb`,`camellia-256-cfb`,`none`,`table`,`rc4`,`rc4-md5`,`rc4-md5-6`,`bf-cfb`,`cast5-cfb`,`des-cfb`,`idea-cfb`,`seed-cfb`,`rc2-cfb`,`salsa20`,`xsalsa20`,`chacha20`,`xchacha20`,`chacha20-ietf` ++ 限制:(以下37种加密方式) -**passwd** +`none`, `table` + +`rc4`, `rc4-md5`, `rc4-md5-6` + +`bf-cfb`, `cast5-cfb`, `des-cfb` + +`idea-cfb`, `seed-cfb`, `rc2-cfb` + +`aes-128-gcm`, `aes-192-gcm`, `aes-256-gcm` + +`aes-128-ctr`, `aes-192-ctr`, `aes-256-ctr` + +`aes-128-ofb`, `aes-192-ofb`, `aes-256-ofb` + +`aes-128-cfb`, `aes-192-cfb`, `aes-256-cfb` + +`aes-128-cfb1`, `aes-192-cfb1`, `aes-256-cfb1` + +`aes-128-cfb8`, `aes-192-cfb8`, `aes-256-cfb8` + +`camellia-128-cfb`, `camellia-192-cfb`, `camellia-256-cfb` + +`salsa20`, `xsalsa20`, `chacha20`, `xchacha20`, `chacha20-ietf` + +### passwd + 类型:*str* + 说明:ShadowsocksR连接密码 + 缺省:必选 -+ 可选值:不限 ++ 限制:无 -**protocol** +### protocol + 类型:*str* + 说明:ShadowsocksR连接协议 -+ 缺省:'origin' -+ 可选值:`origin`,`verify_sha1`,`verify_simple`,`verify_deflate`,`auth_simple`,`auth_sha1`,`auth_sha1_v2`,`auth_sha1_v4`,`auth_aes128`,`auth_aes128_md5`,`auth_aes128_sha1`,`auth_chain_a`,`auth_chain_b`,`auth_chain_c`,`auth_chain_d`,`auth_chain_e`,`auth_chain_f` ++ 缺省:`origin` ++ 限制:(以下17种连接协议) + +`origin`, `auth_simple` + +`auth_sha1`, `auth_sha1_v2`, `auth_sha1_v4` + +`auth_chain_a`, `auth_chain_b`, `auth_chain_c` -**protocolParam** +`auth_chain_d`, `auth_chain_e`, `auth_chain_f` + +`auth_aes128`, `auth_aes128_md5`, `auth_aes128_sha1` + +`verify_sha1`, `verify_simple`, `verify_deflate` + +### protocolParam + 类型:*str* + 说明:ShadowsocksR协议参数 -+ 缺省:'' -+ 可选值:不限 ++ 缺省:`空` ++ 限制:无 -**obfs** +### obfs + 类型:*str* + 说明:ShadowsocksR混淆方式 -+ 缺省:'plain' -+ 可选值:`plain`,`http_post`,`http_simple`,`tls_simple`,`tls1.2_ticket_auth`,`tls1.2_ticket_fastauth`,`random_head` ++ 缺省:`plain` ++ 限制:(以下7种混淆方式) + +`plain`, `http_post`, `http_simple`, `random_head` + +`tls_simple`, `tls1.2_ticket_auth`, `tls1.2_ticket_fastauth` -**obfsParam** +### obfsParam + 类型:*str* + 说明:ShadowsocksR混淆参数 -+ 缺省:'' -+ 可选值:不限 ++ 缺省:`空` ++ 限制:无 diff --git a/docs/ProxyObject/VMess.md b/docs/ProxyObject/VMess.md index 5b2e393..812493a 100644 --- a/docs/ProxyObject/VMess.md +++ b/docs/ProxyObject/VMess.md @@ -1,331 +1,308 @@ -## VMess - -> **remark** -> -> + 类型:*str* -> + 说明:节点备注名称 -> + 缺省:'' -> + 可选值:不限 +## vmessObject ``` { - 'type': 'vmess', - 'server': ..., - 'port': ..., - 'method': ..., - 'id': ..., - 'aid' ..., - 'stream': ... + 'server': ---, + 'port': ---, + 'method': ---, + 'id': ---, + 'aid' ---, + 'stream': ---, } ``` -**server** +### server + 类型:*str* -+ 说明:服务器地址 ++ 说明:VMess服务地址 + 缺省:必选 -+ 可选值:合法的IP地址或域名 ++ 限制:IP地址或域名 -**port** +### port + 类型:*int* -+ 说明:服务器端口 ++ 说明:VMess服务端口 + 缺省:必选 -+ 可选值:1 ~ 65535 ++ 限制:1 ~ 65535 -**method** +### method + 类型:*str* + 说明:VMess加密方式 -+ 缺省:'auto' -+ 可选值:`aes-128-gcm`,`chacha20-poly1305`,`auto`,`none`,`zero` -+ 建议值:'auto' ++ 缺省:`auto` ++ 限制:`aes-128-gcm`, `chacha20-poly1305`, `auto`, `none`, `zero` -**id** +### id + 类型:*str* + 说明:VMess认证ID + 缺省:必选 -+ 可选值:不限 -+ 建议值:合法的UUID ++ 限制:无 -**aid** +### aid + 类型:*int* + 说明:VMess额外ID -+ 缺省:0 -+ 可选值:0 ~ 65535 -+ 建议值:0 ++ 缺省:`0` ++ 限制:0 ~ 65535 -**stream** +### stream -+ 类型:*tcpObject* / *kcpObject* / *wsObject* / *h2Object* / *quicObject* / *grpcObject* -+ 说明:VMess底层传输方式 -+ 缺省:tcpObject -+ 可选值:不限 ++ 类型:[*tcpObject*](#tcpobject) / [*kcpObject*](#kcpobject) / [*wsObject*](#wsobject) / [*h2Object*](#h2object) / [*quicObject*](#quicobject) / [*grpcObject*](#grpcobject) ++ 说明:VMess传输方式 ++ 缺省:`tcpObject` ++ 限制:无 -### tcpObject +## tcpObject ``` { 'type': 'tcp', - 'obfs': ..., - 'secure': ... + 'obfs': ---, + 'secure': ---, } ``` -**obfs** +### obfs -+ 类型:*None* / *obfsObject* -+ 说明:http伪装 -+ 缺省:None -+ 可选值:不限 ++ 类型:*None* / [*obfsObject*](#obfsobject) ++ 说明:http伪装选项 ++ 缺省:`None` ++ 限制:无 -**secure** +### secure -+ 类型:*None* / *secureObject* -+ 说明:TLS加密 -+ 缺省:None -+ 可选值:不限 ++ 类型:*None* / [*secureObject*](#secureobject) ++ 说明:TLS加密选项 ++ 缺省:`None` ++ 限制:无 -### kcpObject +## kcpObject ``` { 'type': 'kcp', - 'seed': ..., - 'obfs': ..., - 'secure': ... + 'seed': ---, + 'obfs': ---, + 'secure': ---, } ``` -**seed** +### seed + 类型:*None* / *str* + 说明:mKCP混淆密码 -+ 缺省:None -+ 可选值:不限 ++ 缺省:`None` ++ 限制:无 -**obfs** +### obfs + 类型:*str* + 说明:数据包头部伪装类型 -+ 缺省:'none' -+ 可选值:`none`,`srtp`,`utp`,`wechat-video`,`dtls`,`wireguard` ++ 缺省:`none` ++ 限制:`none`, `srtp`, `utp`, `wechat-video`, `dtls`, `wireguard` -**secure** +### secure -+ 类型:*None* / *secureObject* -+ 说明:TLS加密 -+ 缺省:None -+ 可选值:不限 ++ 类型:*None* / [*secureObject*](#secureobject) ++ 说明:TLS加密选项 ++ 缺省:`None` ++ 限制:无 -### wsObject +## wsObject ``` { 'type': 'ws', - 'host': ..., - 'path': ..., - 'ed': ..., - 'secure': ... + 'host': ---, + 'path': ---, + 'ed': ---, + 'secure': ---, } ``` -**host** +### host + 类型:*str* + 说明:Websocket连接域名 -+ 缺省:'' -+ 可选值:不限 -+ 建议值:合法域名 ++ 缺省:`空` ++ 限制:无 -**path** +### path + 类型:*str* + 说明:Websocket连接路径 -+ 缺省:'/' -+ 可选值:不限 -+ 建议值:以`/`开头的合法路径 ++ 缺省:`/` ++ 限制:无 -**ed** +### ed + 类型:*None* / *int* -+ 说明:`Early Data`长度阈值 -+ 缺省:None -+ 可选值:>0 -+ 建议值:2048 ++ 说明:Early Data长度阈值 ++ 缺省:`None` ++ 限制:>0 -**secure** +### secure -+ 类型:*None* / *secureObject* -+ 说明:TLS加密 -+ 缺省:None -+ 可选值:不限 ++ 类型:*None* / [*secureObject*](#secureobject) ++ 说明:TLS加密选项 ++ 缺省:`None` ++ 限制:无 -### h2Object +## h2Object ``` { 'type': 'h2', - 'host': ..., - 'path': ..., - 'secure': ... + 'host': ---, + 'path': ---, + 'secure': ---, } ``` -**host** +### host + 类型:*str* -+ 说明:HTTP/2通讯域名 -+ 缺省:'' -+ 可选值:不限 -+ 建议值:合法域名列表(逗号隔开) ++ 说明:HTTP/2连接域名 ++ 缺省:`空` ++ 限制:无 -**path** +### path + 类型:*str* -+ 说明:HTTP/2通讯路径 -+ 缺省:'/' -+ 可选值:不限 -+ 建议值:以`/`开头的合法路径 ++ 说明:HTTP/2连接路径 ++ 缺省:`/` ++ 限制:无 -**secure** +### secure -+ 类型:*secureObject* -+ 说明:TLS加密 -+ 缺省:None -+ 可选值:不限 ++ 类型:[*secureObject*](#secureobject) ++ 说明:TLS加密选项 ++ 缺省:`None` ++ 限制:无 -### quicObject +## quicObject ``` { 'type': 'quic', - 'method': ..., - 'passwd': ..., - 'obfs': ..., - 'secure': ... + 'method': ---, + 'passwd': ---, + 'obfs': ---, + 'secure': ---, } ``` -**method** +### method + 类型:*str* + 说明:QUIC加密方式 -+ 缺省:'none' -+ 可选值:`none`,`aes-128-gcm`,`chacha20-poly1305` ++ 缺省:`none` ++ 限制:`none`, `aes-128-gcm`, `chacha20-poly1305` -**passwd** +### passwd + 类型:*str* + 说明:QUIC连接密码 -+ 缺省:'' -+ 可选值:不限 ++ 缺省:`空` ++ 限制:无 -**obfs** +### obfs + 类型:*str* + 说明:数据包头部伪装类型 -+ 缺省:'none' -+ 可选值:`none`,`srtp`,`utp`,`wechat-video`,`dtls`,`wireguard` ++ 缺省:`none` ++ 限制:`none`,`srtp`,`utp`,`wechat-video`,`dtls`,`wireguard` -**secure** +### secure -+ 类型:*secureObject* -+ 说明:TLS加密 -+ 缺省:secureObject -+ 可选值:不限 ++ 类型:[*secureObject*](#secureobject) ++ 说明:TLS加密选项 ++ 缺省:`secureObject` ++ 限制:无 -### grpcObject +## grpcObject ``` { 'type': 'grpc', - 'service': ..., - 'mode': ..., - 'secure': ... + 'service': ---, + 'mode': ---, + 'secure': ---, } ``` -**service** +### service + 类型:*str* + 说明:gRPC服务名称 + 缺省:必选 -+ 可选值:不限 -+ 建议值:英文大小写字母、数字、下划线及英文句号组成 ++ 限制:无 -**mode** +### mode + 类型:*str* + 说明:gRPC传输模式 -+ 缺省:'gun' -+ 可选值:`gun`,`multi` -+ 建议值:'multi' ++ 缺省:`gun` ++ 限制:`gun`,`multi` -**secure** +### secure -+ 类型:*None* / *secureObject* -+ 说明:TLS加密 -+ 缺省:None -+ 可选值:不限 ++ 类型:*None* / [*secureObject*](#secureobject) ++ 说明:TLS加密选项 ++ 缺省:`None` ++ 限制:无 -### obfsObject +## obfsObject ``` { - 'host': ..., - 'path': ... + 'host': ---, + 'path': ---, } ``` -**host** +### host + 类型:*str* + 说明:http伪装域名 -+ 缺省:'' -+ 可选值:不限 -+ 建议值:合法域名列表(逗号隔开) ++ 缺省:`空` ++ 限制:无 -**path** +### path + 类型:*str* + 说明:http伪装路径 -+ 缺省:'/' -+ 可选值:不限 -+ 建议值:以`/`开头的合法路径 ++ 缺省:`/` ++ 限制:无 -### secureObject +## secureObject ``` { - 'sni': ..., - 'alpn': ..., - 'verify': ... + 'sni': ---, + 'alpn': ---, + 'verify': ---, } ``` -**sni** +### sni + 类型:*str* + 说明:TLS握手SNI字段 -+ 缺省:obfsObject.host[0] / wsObject.host / h2Object.host[0] / '' -+ 可选值:不限 -+ 建议值:合法域名 ++ 缺省:`obfsObject.host[0]` / `wsObject.host` / `h2Object.host[0]` / `空` ++ 限制:无 -**alpn** +### alpn + 类型:*None* / *str* + 说明:TLS握手协商协议 -+ 缺省:None -+ 可选值:`h2`,`http/1.1`,`h2,http/1.1` -+ 建议值:'h2,http/1.1' ++ 缺省:`None` ++ 限制:`h2`, `http/1.1`, `h2,http/1.1` -**verify** +### verify + 类型:*bool* + 说明:是否验证服务端证书 -+ 缺省:True -+ 可选值:不限 -+ 建议值:True ++ 缺省:`True` ++ 限制:无