diff --git a/ProxyTester/Brook.py b/ProxyTester/Brook.py deleted file mode 100644 index e92dc3e..0000000 --- a/ProxyTester/Brook.py +++ /dev/null @@ -1,98 +0,0 @@ -#!/usr/bin/python -# -*- coding:utf-8 -*- - -import copy - -testConfig = {} - - -def __originConfig() -> dict: - return { - 'caption': 'Brook original', - 'client': { - 'type': 'brook', - 'server': testConfig['addr'], - 'port': testConfig['port'], - 'passwd': testConfig['passwd'] - }, - 'server': [ - 'brook', 'server', - '--listen', testConfig['bind'] + ':' + str(testConfig['port']), - '--password', testConfig['passwd'] - ] - } - - -def __wsConfig() -> dict: - return { - 'caption': 'Brook websocket', - 'client': { - 'type': 'brook', - 'server': testConfig['addr'], - 'port': testConfig['port'], - 'passwd': testConfig['passwd'], - 'ws': { - 'host': testConfig['host'], - 'path': testConfig['path'] - } - }, - 'server': [ - 'brook', 'wsserver', - '--listen', testConfig['bind'] + ':' + str(testConfig['port']), - '--password', testConfig['passwd'], - '--path', testConfig['path'] - ] - } - - -def __wssConfig() -> dict: - return { - 'caption': 'Brook websocket with TLS', - 'client': { - 'type': 'brook', - 'server': testConfig['addr'], - 'port': testConfig['port'], - 'passwd': testConfig['passwd'], - 'ws': { - 'host': testConfig['host'], - 'path': testConfig['path'], - 'secure': { - 'verify': True - } - } - }, - 'server': [ - 'brook', 'wssserver', - '--domainaddress', testConfig['bind'] + ':' + str(testConfig['port']), - '--cert', testConfig['cert'], - '--certkey', testConfig['key'], - '--password', testConfig['passwd'], - '--path', testConfig['path'] - ] - } - - -def __brookConfig(brookConfig: dict) -> dict: - return { - 'caption': brookConfig['caption'], - 'proxy': brookConfig['client'], - 'server': { - 'startCommand': brookConfig['server'], - 'fileContent': None, - 'filePath': None, - 'envVar': {} - }, - 'aider': None - } - - -def test(config: dict) -> list: - global testConfig - testConfig = copy.deepcopy(config) - if testConfig['bind'].find(':') >= 0: - testConfig['bind'] = '[' + testConfig['bind'] + ']' - return [ - __brookConfig(__originConfig()), - __brookConfig(__wsConfig()), - __brookConfig(__wssConfig()), - ] diff --git a/ProxyTester/Hysteria.py b/ProxyTester/Hysteria.py deleted file mode 100644 index 95b190b..0000000 --- a/ProxyTester/Hysteria.py +++ /dev/null @@ -1,69 +0,0 @@ -#!/usr/bin/python -# -*- coding:utf-8 -*- - -import copy -import json - -testConfig = {} - -hysteriaProtocolList = [ - 'udp', - 'wechat-video', - 'faketcp', -] - - -def __hysteriaConfig(protocol: str, isObfs: bool, isAuth: bool) -> dict: - caption = 'Hysteria protocol ' + protocol - proxyInfo = { - 'type': 'hysteria', - 'server': testConfig['addr'], - 'port': testConfig['port'], - 'protocol': protocol, - 'sni': testConfig['host'] - } - serverConfig = { - 'listen': testConfig['bind'] + ':' + str(testConfig['port']), - 'protocol': protocol, - 'cert': testConfig['cert'], - 'key': testConfig['key'], - } - - if isObfs: - caption += ' (with obfs)' - proxyInfo['obfs'] = testConfig['passwd'] - serverConfig['obfs'] = testConfig['passwd'] - if isAuth: - caption += ' (with auth)' - proxyInfo['auth'] = testConfig['passwd'] - serverConfig['auth'] = { - 'mode': 'passwords', - 'config': [testConfig['passwd']] - } - - return { - 'caption': caption, - 'proxy': proxyInfo, - 'server': { - 'startCommand': ['hysteria', '-c', testConfig['file'], 'server'], - 'fileContent': json.dumps(serverConfig), - 'filePath': testConfig['file'], - 'envVar': {} - }, - 'aider': None - } - - -def test(config: dict) -> list: - global testConfig - testConfig = copy.deepcopy(config) - if testConfig['bind'].find(':') >= 0: - testConfig['bind'] = '[' + testConfig['bind'] + ']' - - testList = [] - for protocol in hysteriaProtocolList: - testList.append(__hysteriaConfig(protocol, False, False)) - testList.append(__hysteriaConfig(protocol, False, True)) - testList.append(__hysteriaConfig(protocol, True, False)) - testList.append(__hysteriaConfig(protocol, True, True)) - return testList diff --git a/ProxyTester/Plugin.py b/ProxyTester/Plugin.py deleted file mode 100644 index 7e8ea36..0000000 --- a/ProxyTester/Plugin.py +++ /dev/null @@ -1,288 +0,0 @@ -#!/usr/bin/python -# -*- coding:utf-8 -*- - -import re -import json - -gqConfig = { - 'key': 'dnomd343' -} - -ckConfig = { - 'BypassUID': [ - 'Q3iw2bAbC3KZvpm58XR6+Q==' - ], - 'RedirAddr': 'www.bing.com', - 'PrivateKey': 'SFMUZ2g7e0jqzXXhBh5/rh/Odslnyu8A3LuZqH4ySVM=' -} - -pluginConfig = { - 'obfs-local': [ - { - 'caption': 'http mode', - 'server': '--plugin obfs-server --plugin-opts "obfs=http"', - 'client': '--plugin obfs-local --plugin-opts "obfs=http;obfs-host=www.bing.com"', - }, - { - 'caption': 'tls mode', - 'server': '--plugin obfs-server --plugin-opts "obfs=tls"', - 'client': '--plugin obfs-local --plugin-opts "obfs=tls;obfs-host=www.bing.com"', - }, - { - 'caption': 'http mode with URI', - 'server': '--plugin obfs-server --plugin-opts "obfs=http"', - 'client': '--plugin obfs-local --plugin-opts "obfs=http;obfs-host=www.bing.com;obfs-uri=/test"', - }, - { - 'caption': 'http mode with POST method', - 'server': '--plugin obfs-server --plugin-opts "obfs=http"', - 'client': '--plugin obfs-local --plugin-opts "obfs=http;http-method=POST;obfs-host=www.bing.com"', - } - ], - 'simple-tls': [ - { - 'caption': 'basic mode', - 'server': '--plugin simple-tls --plugin-opts "s;n=$HOST"', - 'client': '--plugin simple-tls --plugin-opts "n=$HOST;no-verify"', - }, - { - 'caption': 'with auth key', - 'server': '--plugin simple-tls --plugin-opts "s;n=$HOST;auth=dnomd343"', - 'client': '--plugin simple-tls --plugin-opts "n=$HOST;no-verify;auth=dnomd343"', - }, - { - 'caption': 'wss mode', - 'server': '--plugin simple-tls --plugin-opts "s;n=$HOST;ws;ws-path=/test"', - 'client': '--plugin simple-tls --plugin-opts "n=$HOST;no-verify;ws;ws-path=/test"', - } - ], - 'v2ray-plugin': [ - { - 'caption': 'basic mode', - 'server': '--plugin v2ray-plugin --plugin-opts "server"', - 'client': '--plugin v2ray-plugin', - }, - { - 'caption': 'basic with path', - 'server': '--plugin v2ray-plugin --plugin-opts "server;path=/test"', - 'client': '--plugin v2ray-plugin --plugin-opts "path=/test"', - }, - { - 'caption': 'basic mode with tls', - 'server': '--plugin v2ray-plugin --plugin-opts "server;tls;host=$HOST;cert=$CERT;key=$KEY"', - 'client': '--plugin v2ray-plugin --plugin-opts "tls;host=$HOST"', - }, - { - 'caption': 'quic mode', - 'server': '--plugin v2ray-plugin --plugin-opts "server;mode=quic;host=$HOST;cert=$CERT;key=$KEY"', - 'client': '--plugin v2ray-plugin --plugin-opts "mode=quic;host=$HOST"', - } - ], - 'xray-plugin': [ - { - 'caption': 'basic mode', - 'server': '--plugin xray-plugin --plugin-opts "server"', - 'client': '--plugin xray-plugin', - }, - { - 'caption': 'basic mode with tls', - 'server': '--plugin xray-plugin --plugin-opts "server;tls;host=$HOST;cert=$CERT;key=$KEY"', - 'client': '--plugin xray-plugin --plugin-opts "tls;host=$HOST"', - }, - { - 'caption': 'quic mode', - 'server': '--plugin xray-plugin --plugin-opts "server;mode=quic;host=$HOST;cert=$CERT;key=$KEY"', - 'client': '--plugin xray-plugin --plugin-opts "mode=quic;host=$HOST"', - }, - { - 'caption': 'grpc mode', - 'server': '--plugin xray-plugin --plugin-opts "server;mode=grpc;host=$HOST;cert=$CERT;key=$KEY"', - 'client': '--plugin xray-plugin --plugin-opts "mode=grpc"', - }, - { - 'caption': 'grpc mode with tls', - 'server': '--plugin xray-plugin --plugin-opts "server;tls;mode=grpc;host=$HOST;cert=$CERT;key=$KEY"', - 'client': '--plugin xray-plugin --plugin-opts "tls;mode=grpc;host=$HOST"', - } - ], - 'kcptun-client': [ - { - 'caption': 'basic mode', - 'server': '--plugin kcptun-server', - 'client': '--plugin kcptun-client', - }, - { - 'caption': 'with nocomp', - 'server': '--plugin kcptun-server --plugin-opts "nocomp"', - 'client': '--plugin kcptun-client --plugin-opts "nocomp"', - }, - { - 'caption': 'with key', - 'server': '--plugin kcptun-server --plugin-opts "key=dnomd343"', - 'client': '--plugin kcptun-client --plugin-opts "key=dnomd343"', - }, - { - 'caption': 'fast3 mode with twofish crypt', - 'server': '--plugin kcptun-server --plugin-opts "crypt=twofish;mode=fast3"', - 'client': '--plugin kcptun-client --plugin-opts "crypt=twofish;mode=fast3"', - } - ], - 'gost-plugin': [ - { - 'caption': 'ws mode', - 'server': '--plugin gost-plugin --plugin-opts "server;mode=ws"', - 'client': '--plugin gost-plugin --plugin-opts "mode=ws"', - }, - { - 'caption': 'mws mode', - 'server': '--plugin gost-plugin --plugin-opts "server;mode=mws"', - 'client': '--plugin gost-plugin --plugin-opts "mode=mws;mux=1"', - }, - { - 'caption': 'tls mode', - 'server': '--plugin gost-plugin --plugin-opts "server;cert=$CERT;key=$KEY;mode=tls"', - 'client': '--plugin gost-plugin --plugin-opts "serverName=$HOST;mode=tls"', - }, - { - 'caption': 'xtls mode', - 'server': '--plugin gost-plugin --plugin-opts "server;cert=$CERT;key=$KEY;mode=xtls"', - 'client': '--plugin gost-plugin --plugin-opts "serverName=$HOST;mode=xtls"', - }, - { - 'caption': 'mtls mode', - 'server': '--plugin gost-plugin --plugin-opts "server;cert=$CERT;key=$KEY;mode=mtls"', - 'client': '--plugin gost-plugin --plugin-opts "serverName=$HOST;mode=mtls;mux=1"', - }, - { - 'caption': 'h2 mode', - 'server': '--plugin gost-plugin --plugin-opts "server;cert=$CERT;key=$KEY;mode=h2"', - 'client': '--plugin gost-plugin --plugin-opts "serverName=$HOST;mode=h2"', - }, - { - 'caption': 'wss mode', - 'server': '--plugin gost-plugin --plugin-opts "server;cert=$CERT;key=$KEY;mode=wss"', - 'client': '--plugin gost-plugin --plugin-opts "serverName=$HOST;mode=wss"', - }, - { - 'caption': 'mwss mode', - 'server': '--plugin gost-plugin --plugin-opts "server;cert=$CERT;key=$KEY;mode=mwss"', - 'client': '--plugin gost-plugin --plugin-opts "serverName=$HOST;mode=mwss;mux=1"', - }, - { - 'caption': 'quic mode', - 'server': '--plugin gost-plugin --plugin-opts "server;cert=$CERT;key=$KEY;mode=quic"', - 'client': '--plugin gost-plugin --plugin-opts "serverName=$HOST;mode=quic"', - }, - { - 'caption': 'grpc mode', - 'server': '--plugin gost-plugin --plugin-opts "server;cert=$CERT;key=$KEY;mode=grpc"', - 'client': '--plugin gost-plugin --plugin-opts "serverName=$HOST;mode=grpc"', - } - ], - 'ck-client': [ - { - 'caption': 'basic mode', - 'server': '--plugin ck-server --plugin-opts "$CONFIG"', - 'client': '--plugin ck-client --plugin-opts "UID=Q3iw2bAbC3KZvpm58XR6+Q==;' - 'PublicKey=xTbqKW4Sg/xjDXDhys26ChXUQSrgxO+mBflTUeQpfWQ=;' - 'ServerName=www.bing.com;BrowserSig=chrome;' - 'NumConn=4;EncryptionMethod=plain;StreamTimeout=300"', - } - ], - 'gq-client': [ - { - 'caption': 'basic mode', - 'server': '--plugin gq-server --plugin-opts "$CONFIG"', - 'client': '--plugin gq-client --plugin-opts "ServerName=www.bing.com;' - 'key=dnomd343;TicketTimeHint=300;Browser=chrome"', - } - ], - 'mtt-client': [ - { - 'caption': 'basic mode', - 'server': '--plugin mtt-server --plugin-opts "cert=$CERT;key=$KEY"', - 'client': '--plugin mtt-client --plugin-opts "n=$HOST"', - }, - { - 'caption': 'wss mode', - 'server': '--plugin mtt-server --plugin-opts "wss;cert=$CERT;key=$KEY"', - 'client': '--plugin mtt-client --plugin-opts "wss;n=$HOST"', - }, - { - 'caption': 'wss mode with path', - 'server': '--plugin mtt-server --plugin-opts "wss;wss-path=/test;cert=$CERT;key=$KEY"', - 'client': '--plugin mtt-client --plugin-opts "wss;wss-path=/test;n=$HOST"', - } - ], - 'qtun-client': [ - { - 'caption': 'basic mode', - 'server': '--plugin qtun-server --plugin-opts "cert=$CERT;key=$KEY"', - 'client': '--plugin qtun-client --plugin-opts "host=$HOST"', - } - ], - 'gun-plugin': [ - { - 'caption': 'basic mode', - 'server': '--plugin gun-plugin --plugin-opts "server:cleartext"', - 'client': '--plugin gun-plugin --plugin-opts "client:cleartext"', - }, - { - 'caption': 'basic mode with tls', - 'server': '--plugin gun-plugin --plugin-opts "server:$CERT:$KEY"', - 'client': '--plugin gun-plugin --plugin-opts "client:$HOST"', - } - ] -} - - -def loadPluginConfig(plugin: str, host: str, cert: str, key: str) -> list: # without rabbit-tcp - result = [] - filePath = None - fileContent = None - if plugin == 'ck-client': # Cloak - filePath = '/tmp/ck-test.json' - fileContent = json.dumps(ckConfig) - if plugin == 'gq-client': # GoQuiet - filePath = '/tmp/gq-test.json' - fileContent = json.dumps(gqConfig) - - for pluginInfo in pluginConfig[plugin]: - pluginInfo['server'] = pluginInfo['server'].replace('$HOST', host).replace('$CERT', cert).replace('$KEY', key) - pluginInfo['client'] = pluginInfo['client'].replace('$HOST', host).replace('$CERT', cert).replace('$KEY', key) - if filePath is not None: - pluginInfo['server'] = pluginInfo['server'].replace('$CONFIG', filePath) - - content = re.search(r'^--plugin ([\s\S]*) --plugin-opts "([\s\S]*)"$', pluginInfo['server']) - if content is None: - content = re.search(r'^--plugin ([\s\S]*)$', pluginInfo['server']) - serverOption = { - 'type': content[1], - 'param': '' - } - else: - serverOption = { - 'type': content[1], - 'param': content[2] - } - content = re.search(r'^--plugin ([\s\S]*) --plugin-opts "([\s\S]*)"$', pluginInfo['client']) - if content is None: - content = re.search(r'^--plugin ([\s\S]*)$', pluginInfo['client']) - clientOption = { - 'type': content[1], - 'param': '' - } - else: - clientOption = { - 'type': content[1], - 'param': content[2] - } - - result.append({ - 'caption': pluginInfo['caption'], - 'server': serverOption, - 'client': clientOption, - 'file': fileContent, - 'path': filePath - }) - return result diff --git a/ProxyTester/Shadowsocks.py b/ProxyTester/Shadowsocks.py deleted file mode 100644 index a791d0d..0000000 --- a/ProxyTester/Shadowsocks.py +++ /dev/null @@ -1,209 +0,0 @@ -#!/usr/bin/python -# -*- coding:utf-8 -*- - -import copy -import ProxyTester.Plugin as sip003 - -testConfig = {} - -ssMethodList = [ - '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' -] - -sip003PluginList = [ # 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' -] - - -def __ssServerConfig(method: str, plugin: str or None) -> list: - rabbitPort = 20191 - proxyInfo = { - 'type': 'ss', - 'server': testConfig['addr'], - 'port': testConfig['port'], - 'passwd': testConfig['passwd'], - 'method': method - } - caption = 'Shadowsocks method ' + method - if method in ['plain', 'none']: # plain / none -> ss-rust - serverAddr = testConfig['bind'] - if not serverAddr.find(':') < 0: - serverAddr = '[' + serverAddr + ']' - serverCommand = [ - 'ss-rust-server', - '-s', serverAddr + ':' + str(testConfig['port']), - '-k', testConfig['passwd'], - '-m', method - ] - elif method == 'salsa20-ctr': # salsa20-ctr -> ss-python-legacy - serverCommand = [ - 'ss-bootstrap-server', '--no-udp', - '--shadowsocks', 'ss-python-legacy-server', - '-s', testConfig['bind'], - '-p', str(testConfig['port']), - '-k', testConfig['passwd'], - '-m', method - ] - else: # others -> ss-python - mbedtlsMethods = [ - 'aes-128-cfb128', - 'aes-192-cfb128', - 'aes-256-cfb128', - 'camellia-128-cfb128', - 'camellia-192-cfb128', - 'camellia-256-cfb128', - ] - if method in mbedtlsMethods: - method = 'mbedtls:' + method - serverCommand = [ - 'ss-bootstrap-server', '--no-udp', - '--shadowsocks', 'ss-python-server', - '-s', testConfig['bind'], - '-p', str(testConfig['port']), - '-k', testConfig['passwd'], - '-m', method - ] - if method == 'idea-cfb' or method == 'seed-cfb': - serverCommand.append('--libopenssl=libcrypto.so.1.0.0') - - if plugin is None: # 无插件模式 - return [{ - 'caption': caption, - 'proxy': proxyInfo, - 'server': { - 'startCommand': serverCommand, - 'fileContent': None, - 'filePath': None, - 'envVar': {} - }, - 'aider': None - }] - - if plugin == 'rabbit-plugin': # rabbit-tcp - serverAddr = testConfig['bind'] - if not serverAddr.find(':') < 0: # IPv6 - serverAddr = '[' + serverAddr + ']' - proxyInfo['port'] = rabbitPort - proxyInfo['plugin'] = { - 'type': 'rabbit-plugin', - 'param': 'serviceAddr=' + serverAddr + ':' + str(testConfig['port']) + ';password=' + testConfig['passwd'] - } - return [{ - 'proxy': proxyInfo, - 'caption': 'Shadowsocks plugin rabbit-plugin (basic mode)', - 'server': { - 'startCommand': serverCommand, - 'fileContent': None, - 'filePath': None, - 'envVar': {} - }, - 'aider': { - 'startCommand': [ - 'rabbit', - '-mode', 's', - '-password', testConfig['passwd'], - '-rabbit-addr', ':' + str(rabbitPort) - ], - 'fileContent': None, - 'filePath': None, - 'envVar': {} - } - }] - - # others plugin - result = [] - pluginConfig = sip003.loadPluginConfig( # 载入插件配置 - plugin, testConfig['host'], testConfig['cert'], testConfig['key'] - ) - serverBaseCommand = copy.deepcopy(serverCommand) - for pluginOption in pluginConfig: - serverCommand = copy.deepcopy(serverBaseCommand) - serverCommand.append('--plugin') - serverCommand.append(pluginOption['server']['type']) - serverCommand.append('--plugin-opts') - serverCommand.append(pluginOption['server']['param']) - proxyInfo['plugin'] = pluginOption['client'] - result.append(copy.deepcopy({ - 'proxy': proxyInfo, - 'caption': 'Shadowsocks plugin ' + proxyInfo['plugin']['type'] + ' (' + pluginOption['caption'] + ')', - 'server': { - 'startCommand': serverCommand, - 'fileContent': pluginOption['file'], - 'filePath': pluginOption['path'], - 'envVar': {} - }, - 'aider': None - })) - return result - - -def test(config: dict) -> list: - global testConfig - testConfig = config - - testList = [] - for method in ssMethodList: # all Shadowsocks methods - testList += __ssServerConfig(method, None) - for plugin in sip003PluginList: # all SIP003 plugin - testList += __ssServerConfig('aes-256-ctr', plugin) - - return testList diff --git a/ProxyTester/ShadowsocksR.py b/ProxyTester/ShadowsocksR.py deleted file mode 100644 index 5806d1b..0000000 --- a/ProxyTester/ShadowsocksR.py +++ /dev/null @@ -1,119 +0,0 @@ -#!/usr/bin/python -# -*- coding:utf-8 -*- - -testConfig = {} - -ssrMethodList = [ - "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", -] - -ssrProtocolList = [ - "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", -] - -ssrObfsList = [ - "plain", - "http_post", - "http_simple", - "tls_simple", - "tls1.2_ticket_auth", - "tls1.2_ticket_fastauth", - "random_head", -] - -def __ssrServerConfig(method: str, protocol: str, obfs: str, caption: str) -> list: - proxyInfo = { - 'type': 'ssr', - 'server': testConfig['addr'], - 'port': testConfig['port'], - 'passwd': testConfig['passwd'], - 'method': method, - 'protocol': protocol, - 'obfs': obfs - } - serverCommand = [ - 'ssr-server', - '-s', testConfig['bind'], - '-p', str(testConfig['port']), - '-k', testConfig['passwd'], - '-m', method, - '-O', protocol, - '-o', obfs - ] - return [{ - 'caption': caption, - 'proxy': proxyInfo, - 'server': { - 'startCommand': serverCommand, - 'fileContent': None, - 'filePath': None, - 'envVar': {} - }, - 'aider': None - }] - -def test(config: dict) -> list: - global testConfig - testConfig = config - - testList = [] - for method in ssrMethodList: # all ShadowsocksR methods - testList += __ssrServerConfig(method, 'origin', 'plain', 'ShadowsocksR method ' + method) - - for protocol in ssrProtocolList: # all ShadowsocksR protocol and obfs - for obfs in ssrObfsList: - testList += __ssrServerConfig('table', protocol, obfs, 'ShadowsocksR protocol ' + protocol + ' obfs ' + obfs) - - return testList diff --git a/ProxyTester/Trojan.py b/ProxyTester/Trojan.py deleted file mode 100644 index 4001f0c..0000000 --- a/ProxyTester/Trojan.py +++ /dev/null @@ -1,149 +0,0 @@ -#!/usr/bin/python -# -*- coding:utf-8 -*- - -import json -from ProxyTester import Xray - -testConfig = {} - - -def trojanBasicTest() -> dict: - serverConfig = { - 'run_type': 'server', - 'local_addr': testConfig['bind'], - 'local_port': testConfig['port'], - 'password': [ - testConfig['passwd'] - ], - 'ssl': { - 'cert': testConfig['cert'], - 'key': testConfig['key'] - } - } - return { - 'caption': 'Trojan basic', - 'proxy': { - 'type': 'trojan', - 'server': testConfig['addr'], - 'port': testConfig['port'], - 'passwd': testConfig['passwd'], - 'stream': { - 'type': 'tcp', - 'secure': { - 'type': 'tls', - 'sni': testConfig['host'] - } - } - }, - 'server': { - 'startCommand': ['trojan', '-c', testConfig['file']], - 'fileContent': json.dumps(serverConfig), - 'filePath': testConfig['file'], - 'envVar': {} - }, - 'aider': None - } - - -def loadTrojanStream(streamInfo: dict, xtlsFlow: str or None) -> dict: - proxyInfo = { - 'type': 'trojan', - 'server': testConfig['addr'], - 'port': testConfig['port'], - 'passwd': testConfig['passwd'], - 'stream': streamInfo['client'] - } - inboundConfig = { - 'protocol': 'trojan', - 'listen': testConfig['bind'], - 'port': testConfig['port'], - 'settings': { - 'clients': [ - { - 'password': testConfig['passwd'] - } - ] - }, - 'streamSettings': streamInfo['server'] - } - if xtlsFlow is not None: # add XTLS flow option - inboundConfig['settings']['clients'][0]['flow'] = xtlsFlow - return { - 'caption': 'Trojan network ' + streamInfo['caption'], - 'proxy': proxyInfo, - 'server': { - 'startCommand': ['xray', '-c', testConfig['file']], - 'fileContent': Xray.xrayConfig(inboundConfig), - 'filePath': testConfig['file'], - 'envVar': {} - }, - 'aider': None - } - - -def test(config: dict) -> list: - global testConfig - testConfig = config - testList = [trojanBasicTest()] # basic test - - # TCP stream - streamInfo = Xray.loadTcpStream(False, '', '') - testList.append(loadTrojanStream(streamInfo, None)) - streamInfo = Xray.addTlsConfig(streamInfo, config['cert'], config['key'], config['host']) - testList.append(loadTrojanStream(streamInfo, None)) - for flow in Xray.xtlsFlowList: - streamInfo = Xray.loadTcpStream(False, '', '') - xtlsFlow, streamInfo = Xray.addXtlsConfig(streamInfo, config['cert'], config['key'], config['host'], flow) - testList.append(loadTrojanStream(streamInfo, xtlsFlow)) - - streamInfo = Xray.loadTcpStream(True, config['host'], '/') - testList.append(loadTrojanStream(streamInfo, None)) - streamInfo = Xray.addTlsConfig(streamInfo, config['cert'], config['key'], config['host']) - testList.append(loadTrojanStream(streamInfo, None)) - - # mKCP stream - for obfs in Xray.udpObfsList: - streamInfo = Xray.loadKcpStream(config['passwd'], obfs) - testList.append(loadTrojanStream(streamInfo, None)) - streamInfo = Xray.addTlsConfig(streamInfo, config['cert'], config['key'], config['host']) - testList.append(loadTrojanStream(streamInfo, None)) - for flow in Xray.xtlsFlowList: - streamInfo = Xray.loadKcpStream(config['passwd'], obfs) - xtlsFlow, streamInfo = Xray.addXtlsConfig(streamInfo, config['cert'], config['key'], config['host'], flow) - testList.append(loadTrojanStream(streamInfo, xtlsFlow)) - - # WebSocket stream - streamInfo = Xray.loadWsStream(config['host'], config['path'], False) - testList.append(loadTrojanStream(streamInfo, None)) - streamInfo = Xray.addTlsConfig(streamInfo, config['cert'], config['key'], config['host']) - testList.append(loadTrojanStream(streamInfo, None)) - - streamInfo = Xray.loadWsStream(config['host'], config['path'], True) - testList.append(loadTrojanStream(streamInfo, None)) - streamInfo = Xray.addTlsConfig(streamInfo, config['cert'], config['key'], config['host']) - testList.append(loadTrojanStream(streamInfo, None)) - - # HTTP/2 stream - streamInfo = Xray.loadH2Stream(config['host'], config['path']) - streamInfo = Xray.addTlsConfig(streamInfo, config['cert'], config['key'], config['host']) - testList.append(loadTrojanStream(streamInfo, None)) - - # QUIC stream - for method in Xray.quicMethodList: - for obfs in Xray.udpObfsList: - streamInfo = Xray.loadQuicStream(method, config['passwd'], obfs) - streamInfo = Xray.addTlsConfig(streamInfo, config['cert'], config['key'], config['host']) - testList.append(loadTrojanStream(streamInfo, None)) - - # GRPC stream - streamInfo = Xray.loadGrpcStream(config['service']) - testList.append(loadTrojanStream(streamInfo, None)) - streamInfo = Xray.addTlsConfig(streamInfo, config['cert'], config['key'], config['host']) - testList.append(loadTrojanStream(streamInfo, None)) - - streamInfo = Xray.loadGrpcStream(config['service'], multiMode = True) - testList.append(loadTrojanStream(streamInfo, None)) - streamInfo = Xray.addTlsConfig(streamInfo, config['cert'], config['key'], config['host']) - testList.append(loadTrojanStream(streamInfo, None)) - - return testList diff --git a/ProxyTester/TrojanGo.py b/ProxyTester/TrojanGo.py deleted file mode 100644 index 2e7354e..0000000 --- a/ProxyTester/TrojanGo.py +++ /dev/null @@ -1,169 +0,0 @@ -#!/usr/bin/python -# -*- coding:utf-8 -*- - -import copy -import json -from ProxyTester import Plugin - -testConfig = {} - -trojanGoMethod = [ - 'AES-128-GCM', - 'AES-256-GCM', - 'CHACHA20-IETF-POLY1305' -] - -sip003PluginList = [ # 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' -] - - -def loadTrojanGo(isWs: bool, ssMethod: str or None) -> dict: - caption = 'Trojan-Go original' - serverConfig = { - 'run_type': 'server', - 'local_addr': testConfig['bind'], - 'local_port': testConfig['port'], - 'remote_addr': '127.0.0.1', # only for shadowsocks fallback - 'remote_port': 343, - 'password': [ - testConfig['passwd'] - ], - 'disable_http_check': True, - 'ssl': { - 'cert': testConfig['cert'], - 'key': testConfig['key'] - } - } - proxyInfo = { - 'type': 'trojan-go', - 'server': testConfig['addr'], - 'port': testConfig['port'], - 'passwd': testConfig['passwd'], - 'sni': testConfig['host'], - } - if ssMethod is not None: # add Shadowsocks encrypt - caption += ' ' + ssMethod + ' encrypt' - serverConfig['shadowsocks'] = { - 'enabled': True, - 'method': ssMethod, - 'password': testConfig['passwd'] - } - proxyInfo['ss'] = { - 'method': ssMethod, - 'passwd': testConfig['passwd'] - } - if isWs: # add WebSocket config - caption += ' (websocket)' - serverConfig['websocket'] = { - 'enabled': True, - 'host': testConfig['host'], - 'path': testConfig['path'] - } - proxyInfo['ws'] = { - 'host': testConfig['host'], - 'path': testConfig['path'] - } - return { - 'caption': caption, - 'client': proxyInfo, - 'server': serverConfig, - 'file': None, - 'path': None - } - - -def loadTrojanGoPlugin(plugin: str) -> list: - result = [] - rabbitPort = 20191 - trojanBaseConfig = loadTrojanGo(False, None) - - if plugin == 'rabbit-plugin': # rabbit-tcp - serverAddr = testConfig['bind'] - if not serverAddr.find(':') < 0: # IPv6 - serverAddr = '[' + serverAddr + ']' - trojanBaseConfig['caption'] = 'Trojan-Go rabbit-plugin (basic mode)' - trojanBaseConfig['client']['port'] = rabbitPort - trojanBaseConfig['client']['plugin'] = { - 'type': 'rabbit-plugin', - 'param': 'serviceAddr=' + serverAddr + ':' + str(testConfig['port']) + ';password=' + testConfig['passwd'] - } - trojanBaseConfig['server']['transport_plugin'] = { - 'enabled': True, - 'type': 'other', - 'command': 'rabbit', - 'arg': [ - '-mode', 's', - '-password', testConfig['passwd'], - '-rabbit-addr', ':' + str(rabbitPort) - ] - } - trojanBaseConfig['file'] = None - trojanBaseConfig['path'] = None - return [trojanBaseConfig] - - # other plugin - pluginConfig = Plugin.loadPluginConfig(plugin, testConfig['host'], testConfig['cert'], testConfig['key']) # 载入插件配置 - for pluginOption in pluginConfig: - trojanConfig = copy.deepcopy(trojanBaseConfig) - trojanConfig['caption'] = 'Trojan-Go plugin ' + plugin + ' (' + pluginOption['caption'] + ')' - trojanConfig['client']['plugin'] = pluginOption['client'] - trojanConfig['server']['transport_plugin'] = { - 'enabled': True, - 'type': 'shadowsocks', - 'command': pluginOption['server']['type'], - 'option': pluginOption['server']['param'] - } - trojanConfig['file'] = pluginOption['file'] - trojanConfig['path'] = pluginOption['path'] - result.append(trojanConfig) - return result - - -def loadTrojanGoConfig(trojanGoConfigList: list) -> list: - result = [] - for trojanGoConfig in trojanGoConfigList: - result.append({ - 'caption': trojanGoConfig['caption'], - 'proxy': trojanGoConfig['client'], - 'server': { - 'startCommand': ['trojan-go', '-config', testConfig['file']], - 'fileContent': json.dumps(trojanGoConfig['server']), - 'filePath': testConfig['file'], - 'envVar': {'PATH': '/usr/bin'} - }, - 'aider': { - 'startCommand': None, - 'fileContent': trojanGoConfig['file'], - 'filePath': trojanGoConfig['path'], - 'envVar': {} - } - }) - return result - - -def test(config: dict) -> list: - global testConfig - testConfig = config - testList = [] - - testList += loadTrojanGoConfig([loadTrojanGo(False, None)]) # basic test - testList += loadTrojanGoConfig([loadTrojanGo(True, None)]) - for ssMethod in trojanGoMethod: - testList += loadTrojanGoConfig([loadTrojanGo(False, ssMethod)]) # basic test with shadowsocks - testList += loadTrojanGoConfig([loadTrojanGo(True, ssMethod)]) - for plugin in sip003PluginList: # plugin test -> cause zombie process (imperfect trojan-go) - testList += loadTrojanGoConfig(loadTrojanGoPlugin(plugin)) - - return testList diff --git a/ProxyTester/V2ray.py b/ProxyTester/V2ray.py deleted file mode 100644 index b7a38b5..0000000 --- a/ProxyTester/V2ray.py +++ /dev/null @@ -1,257 +0,0 @@ -#!/usr/bin/python -# -*- coding:utf-8 -*- - -import copy -import json - -httpHeader = { - 'version': '1.1', - 'status': '200', - 'reason': 'OK', - 'headers': { - 'Content-Type': [ - 'application/octet-stream', - 'video/mpeg' - ], - 'Transfer-Encoding': [ - 'chunked' - ], - 'Connection': [ - 'keep-alive' - ], - 'Pragma': 'no-cache' - } -} - -kcpSetting = { - 'mtu': 1350, - 'tti': 20, - 'uplinkCapacity': 5, - 'downlinkCapacity': 20, - 'congestion': False, - 'readBufferSize': 1, - 'writeBufferSize': 1, -} - -udpObfsList = [ - 'none', - 'srtp', - 'utp', - 'wechat-video', - 'dtls', - 'wireguard' -] - -quicMethodList = [ - 'none', - 'aes-128-gcm', - 'chacha20-poly1305', -] - - -def loadTcpStream(isObfs: bool, host: str, path: str) -> dict: - streamConfig = { - 'network': 'tcp', - 'tcpSettings': { - 'type': 'none' - } - } - if not isObfs: # 不带http混淆 - return { - 'caption': 'TCP', - 'client': { - 'type': 'tcp', - 'secure': None - }, - 'server': streamConfig - } - - streamConfig['tcpSettings'] = { # http混淆配置 - 'header': { - 'type': 'http', - 'response': httpHeader - } - } - return { - 'caption': 'TCP with http obfs', - 'client': { - 'type': 'tcp', - 'obfs': { - 'host': host, - 'path': path - }, - 'secure': None - }, - 'server': streamConfig - } - - -def loadKcpStream(seed: str, obfs: str) -> dict: - kcpSetting['header'] = { - 'type': obfs - } - kcpSetting['seed'] = seed - return { - 'caption': 'mKCP obfs ' + obfs, - 'client': { - 'type': 'kcp', - 'seed': seed, - 'obfs': obfs, - 'secure': None - }, - 'server': { - 'network': 'kcp', - 'kcpSettings': kcpSetting - } - } - - -def loadWsStream(host: str, path: str, isEd: bool) -> dict: - wsSetting = { - 'path': path, - 'headers': { - 'Host': host - } - } - if not isEd: # 不带Early Data - return { - 'caption': 'WebSocket', - 'client': { - 'type': 'ws', - 'host': host, - 'path': path, - 'secure': None - }, - 'server': { - 'network': 'ws', - 'wsSettings': wsSetting - } - } - wsSetting['maxEarlyData'] = 2048 - wsSetting['earlyDataHeaderName'] = 'Sec-WebSocket-Protocol' - return { - 'caption': 'WebSocket Max-Early-Data 2048', - 'client': { - 'type': 'ws', - 'host': host, - 'path': path, - 'ed': 2048, - 'secure': None - }, - 'server': { - 'network': 'ws', - 'wsSettings': wsSetting - } - } - - -def loadH2Stream(host: str, path: str) -> dict: - return { - 'caption': 'HTTP/2', - 'client': { - 'type': 'h2', - 'host': host, - 'path': path, - 'secure': None - }, - 'server': { - 'network': 'http', - 'httpSettings': { - 'host': [host], - 'path': path - } - } - } - - -def loadQuicStream(method: str, passwd: str, obfs: str) -> dict: - return { - 'caption': 'QUIC method ' + method + ' obfs ' + obfs, - 'client': { - 'type': 'quic', - 'method': method, - 'passwd': passwd, - 'obfs': obfs, - 'secure': None - }, - 'server': { - 'network': 'quic', - 'quicSettings': { - 'security': method, - 'key': passwd, - 'header': { - 'type': obfs - } - } - } - } - - -def loadGrpcStream(service: str, multiMode: bool = False) -> dict: - if not multiMode: - return { - 'caption': 'gRPC', - 'client': { - 'type': 'grpc', - 'service': service, - 'secure': None - }, - 'server': { - 'network': 'grpc', - 'grpcSettings': { - 'serviceName': service - } - } - } - return { - 'caption': 'gRPC multi-mode', - 'client': { - 'type': 'grpc', - 'service': service, - 'mode': 'multi', - 'secure': None - }, - 'server': { - 'network': 'grpc', - 'grpcSettings': { - 'serviceName': service, - 'multiMode': True # gRPC multi-mode not work in v2fly-core - } - } - } - - -def addSecureConfig(rawStreamInfo: dict, cert: str, key: str, sni: str) -> dict: - streamInfo = copy.deepcopy(rawStreamInfo) - streamInfo['caption'] += ' (tls)' - streamInfo['client']['secure'] = { - 'sni': sni - } - streamInfo['server']['security'] = 'tls' - streamInfo['server']['tlsSettings'] = { - 'alpn': [ - 'h2', - 'http/1.1' - ], - 'certificates': [ - { - 'certificateFile': cert, - 'keyFile': key - } - ] - } - return streamInfo - - -def v2rayConfig(inboundConfig: dict) -> str: - return json.dumps({ - 'log': { - 'loglevel': 'warning' - }, - 'inbounds': [inboundConfig], - 'outbounds': [ - { - 'protocol': 'freedom' - } - ] - }) diff --git a/ProxyTester/VLESS.py b/ProxyTester/VLESS.py deleted file mode 100644 index 6132df8..0000000 --- a/ProxyTester/VLESS.py +++ /dev/null @@ -1,111 +0,0 @@ -#!/usr/bin/python -# -*- coding:utf-8 -*- - -from ProxyTester import Xray - -testConfig = {} - - -def loadVlessStream(streamInfo: dict, xtlsFlow: str or None) -> dict: - proxyInfo = { - 'type': 'vless', - 'server': testConfig['addr'], - 'port': testConfig['port'], - 'id': testConfig['id'], - 'stream': streamInfo['client'] - } - inboundConfig = { - 'protocol': 'vless', - 'listen': testConfig['bind'], - 'port': testConfig['port'], - 'settings': { - 'clients': [ - { - 'id': testConfig['id'] - } - ], - 'decryption': 'none' - }, - 'streamSettings': streamInfo['server'] - } - if xtlsFlow is not None: # add XTLS flow option - inboundConfig['settings']['clients'][0]['flow'] = xtlsFlow - return { - 'caption': 'VLESS network ' + streamInfo['caption'], - 'proxy': proxyInfo, - 'server': { - 'startCommand': ['xray', '-c', testConfig['file']], - 'fileContent': Xray.xrayConfig(inboundConfig), - 'filePath': testConfig['file'], - 'envVar': {} - }, - 'aider': None - } - - -def test(config: dict) -> list: - global testConfig - testConfig = config - testList = [] - - # TCP stream - streamInfo = Xray.loadTcpStream(False, '', '') - testList.append(loadVlessStream(streamInfo, None)) - streamInfo = Xray.addTlsConfig(streamInfo, config['cert'], config['key'], config['host']) - testList.append(loadVlessStream(streamInfo, None)) - for flow in Xray.xtlsFlowList: - streamInfo = Xray.loadTcpStream(False, '', '') - xtlsFlow, streamInfo = Xray.addXtlsConfig(streamInfo, config['cert'], config['key'], config['host'], flow) - testList.append(loadVlessStream(streamInfo, xtlsFlow)) - - streamInfo = Xray.loadTcpStream(True, config['host'], '/') - testList.append(loadVlessStream(streamInfo, None)) - streamInfo = Xray.addTlsConfig(streamInfo, config['cert'], config['key'], config['host']) - testList.append(loadVlessStream(streamInfo, None)) - - # mKCP stream - for obfs in Xray.udpObfsList: - streamInfo = Xray.loadKcpStream(config['passwd'], obfs) - testList.append(loadVlessStream(streamInfo, None)) - streamInfo = Xray.addTlsConfig(streamInfo, config['cert'], config['key'], config['host']) - testList.append(loadVlessStream(streamInfo, None)) - for flow in Xray.xtlsFlowList: - streamInfo = Xray.loadKcpStream(config['passwd'], obfs) - xtlsFlow, streamInfo = Xray.addXtlsConfig(streamInfo, config['cert'], config['key'], config['host'], flow) - testList.append(loadVlessStream(streamInfo, xtlsFlow)) - - # WebSocket stream - streamInfo = Xray.loadWsStream(config['host'], config['path'], False) - testList.append(loadVlessStream(streamInfo, None)) - streamInfo = Xray.addTlsConfig(streamInfo, config['cert'], config['key'], config['host']) - testList.append(loadVlessStream(streamInfo, None)) - - streamInfo = Xray.loadWsStream(config['host'], config['path'], True) - testList.append(loadVlessStream(streamInfo, None)) - streamInfo = Xray.addTlsConfig(streamInfo, config['cert'], config['key'], config['host']) - testList.append(loadVlessStream(streamInfo, None)) - - # HTTP/2 stream - streamInfo = Xray.loadH2Stream(config['host'], config['path']) - streamInfo = Xray.addTlsConfig(streamInfo, config['cert'], config['key'], config['host']) - testList.append(loadVlessStream(streamInfo, None)) - - # QUIC stream - for method in Xray.quicMethodList: - for obfs in Xray.udpObfsList: - streamInfo = Xray.loadQuicStream(method, config['passwd'], obfs) - streamInfo = Xray.addTlsConfig(streamInfo, config['cert'], config['key'], config['host']) - testList.append(loadVlessStream(streamInfo, None)) - - # GRPC stream - streamInfo = Xray.loadGrpcStream(config['service']) - testList.append(loadVlessStream(streamInfo, None)) - streamInfo = Xray.addTlsConfig(streamInfo, config['cert'], config['key'], config['host']) - testList.append(loadVlessStream(streamInfo, None)) - - streamInfo = Xray.loadGrpcStream(config['service'], multiMode = True) - testList.append(loadVlessStream(streamInfo, None)) - streamInfo = Xray.addTlsConfig(streamInfo, config['cert'], config['key'], config['host']) - testList.append(loadVlessStream(streamInfo, None)) - - return testList diff --git a/ProxyTester/VMess.py b/ProxyTester/VMess.py deleted file mode 100644 index 97d2467..0000000 --- a/ProxyTester/VMess.py +++ /dev/null @@ -1,150 +0,0 @@ -#!/usr/bin/python -# -*- coding:utf-8 -*- - -from ProxyTester import V2ray - -testConfig = {} - -vmessMethodList = [ - 'aes-128-gcm', - 'chacha20-poly1305', - 'auto', - 'none', - 'zero', -] - -def vmessBasicTest(method: str, alterId: int) -> dict: - inboundConfig = { - 'protocol': 'vmess', - 'listen': testConfig['bind'], - 'port': testConfig['port'], - 'settings': { - 'clients': [ - { - 'id': testConfig['id'], - 'alterId': alterId - } - ] - } - } - - caption = 'VMess method ' + method - if alterId == 0: - envVar = {} - caption += ' (AEAD)' - else: - envVar = { - 'v2ray.vmess.aead.forced': 'false' - } - caption += ' (alterId ' + str(alterId) + ')' - - return { - 'caption': caption, - 'proxy': { - 'type': 'vmess', - 'server': testConfig['addr'], - 'port': testConfig['port'], - 'method': method, - 'id': testConfig['id'], - 'aid': alterId - }, - 'server': { - 'startCommand': ['v2ray', '-c', testConfig['file']], - 'fileContent': V2ray.v2rayConfig(inboundConfig), - 'filePath': testConfig['file'], - 'envVar': envVar - }, - 'aider': None - } - -def loadVmessStream(streamInfo: dict) -> dict: - proxyInfo = { - 'type': 'vmess', - 'server': testConfig['addr'], - 'port': testConfig['port'], - 'id': testConfig['id'], - 'stream': streamInfo['client'] - } - inboundConfig = { - 'protocol': 'vmess', - 'listen': testConfig['bind'], - 'port': testConfig['port'], - 'settings': { - 'clients': [ - { - 'id': testConfig['id'] - } - ] - }, - 'streamSettings': streamInfo['server'] - } - return { - 'caption': 'VMess network ' + streamInfo['caption'], - 'proxy': proxyInfo, - 'server': { - 'startCommand': ['v2ray', '-c', testConfig['file']], - 'fileContent': V2ray.v2rayConfig(inboundConfig), - 'filePath': testConfig['file'], - 'envVar': {} - }, - 'aider': None - } - -def test(config: dict) -> list: - global testConfig - testConfig = config - testList = [] - - # Basic test - for method in vmessMethodList: # methods and AEAD/MD5+AES test - testList.append(vmessBasicTest(method, 0)) - testList.append(vmessBasicTest(method, 64)) - - # TCP stream - streamInfo = V2ray.loadTcpStream(False, '', '') - testList.append(loadVmessStream(streamInfo)) - streamInfo = V2ray.addSecureConfig(streamInfo, config['cert'], config['key'], config['host']) - testList.append(loadVmessStream(streamInfo)) - - streamInfo = V2ray.loadTcpStream(True, config['host'], '/') - testList.append(loadVmessStream(streamInfo)) - streamInfo = V2ray.addSecureConfig(streamInfo, config['cert'], config['key'], config['host']) - testList.append(loadVmessStream(streamInfo)) - - # mKCP stream - for obfs in V2ray.udpObfsList: - streamInfo = V2ray.loadKcpStream(config['passwd'], obfs) - testList.append(loadVmessStream(streamInfo)) - streamInfo = V2ray.addSecureConfig(streamInfo, config['cert'], config['key'], config['host']) - testList.append(loadVmessStream(streamInfo)) - - # WebSocket stream - streamInfo = V2ray.loadWsStream(config['host'], config['path'], False) - testList.append(loadVmessStream(streamInfo)) - streamInfo = V2ray.addSecureConfig(streamInfo, config['cert'], config['key'], config['host']) - testList.append(loadVmessStream(streamInfo)) - - streamInfo = V2ray.loadWsStream(config['host'], config['path'], True) - testList.append(loadVmessStream(streamInfo)) - streamInfo = V2ray.addSecureConfig(streamInfo, config['cert'], config['key'], config['host']) - testList.append(loadVmessStream(streamInfo)) - - # HTTP/2 stream - streamInfo = V2ray.loadH2Stream(config['host'], config['path']) - streamInfo = V2ray.addSecureConfig(streamInfo, config['cert'], config['key'], config['host']) - testList.append(loadVmessStream(streamInfo)) - - # QUIC stream - for method in V2ray.quicMethodList: - for obfs in V2ray.udpObfsList: - streamInfo = V2ray.loadQuicStream(method, config['passwd'], obfs) - streamInfo = V2ray.addSecureConfig(streamInfo, config['cert'], config['key'], config['host']) - testList.append(loadVmessStream(streamInfo)) - - # GRPC stream - streamInfo = V2ray.loadGrpcStream(config['service']) - testList.append(loadVmessStream(streamInfo)) - streamInfo = V2ray.addSecureConfig(streamInfo, config['cert'], config['key'], config['host']) - testList.append(loadVmessStream(streamInfo)) - - return testList diff --git a/ProxyTester/Xray.py b/ProxyTester/Xray.py deleted file mode 100644 index 6638569..0000000 --- a/ProxyTester/Xray.py +++ /dev/null @@ -1,116 +0,0 @@ -#!/usr/bin/python -# -*- coding:utf-8 -*- - -import copy -from ProxyTester import V2ray - -xtlsFlowList = [ - 'xtls-origin', - 'xtls-direct', - 'xtls-splice', -] - -udpObfsList = V2ray.udpObfsList -quicMethodList = V2ray.quicMethodList - -xrayConfig = V2ray.v2rayConfig -loadTcpStream = V2ray.loadTcpStream -loadKcpStream = V2ray.loadKcpStream -loadH2Stream = V2ray.loadH2Stream -loadQuicStream = V2ray.loadQuicStream -loadGrpcStream = V2ray.loadGrpcStream - - -def loadWsStream(host: str, path: str, isEd: bool) -> dict: - if not isEd: # without Early-Data - return { - 'caption': 'WebSocket', - 'client': { - 'type': 'ws', - 'host': host, - 'path': path, - 'secure': None - }, - 'server': { - 'network': 'ws', - 'wsSettings': { - 'path': path, - 'headers': { - 'Host': host - } - } - } - } - return { - 'caption': 'WebSocket Max-Early-Data 2048', - 'client': { - 'type': 'ws', - 'host': host, - 'path': path, - 'ed': 2048, - 'secure': None - }, - 'server': { - 'network': 'ws', - 'wsSettings': { - 'path': path + '?ed=2048', - 'headers': { - 'Host': host - } - } - } - } - - -def addTlsConfig(rawStreamInfo: dict, cert: str, key: str, sni: str) -> dict: - streamInfo = copy.deepcopy(rawStreamInfo) - streamInfo['caption'] += ' (tls)' - streamInfo['client']['secure'] = { - 'type': 'tls', - 'sni': sni - } - streamInfo['server']['security'] = 'tls' - streamInfo['server']['tlsSettings'] = { - 'alpn': [ - 'h2', - 'http/1.1' - ], - 'certificates': [ - { - 'certificateFile': cert, - 'keyFile': key - } - ] - } - return streamInfo - - -def addXtlsConfig(rawStreamInfo: dict, cert: str, key: str, sni: str, xtlsFlow: str) -> tuple[str, dict]: - streamInfo = copy.deepcopy(rawStreamInfo) - streamInfo['caption'] += ' (' + xtlsFlow + ')' - streamInfo['client']['secure'] = { - 'type': 'xtls', - 'sni': sni, - 'flow': xtlsFlow - } - streamInfo['server']['security'] = 'xtls' - streamInfo['server']['xtlsSettings'] = { - 'alpn': [ - 'h2', - 'http/1.1' - ], - 'certificates': [ - { - 'certificateFile': cert, - 'keyFile': key - } - ] - } - if xtlsFlow == 'xtls-origin': - return 'xtls-rprx-origin', streamInfo - elif xtlsFlow == 'xtls-direct': - return 'xtls-rprx-direct', streamInfo - elif xtlsFlow == 'xtls-splice': - return 'xtls-rprx-direct', streamInfo - else: - raise Exception('Unknown XTLS flow') diff --git a/ProxyTester/__init__.py b/ProxyTester/__init__.py deleted file mode 100644 index eab51b3..0000000 --- a/ProxyTester/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/python -# -*- coding:utf-8 -*- - -from ProxyTester.tester import * - -__all__ = ['test'] diff --git a/ProxyTester/tester.py b/ProxyTester/tester.py deleted file mode 100644 index 240ae73..0000000 --- a/ProxyTester/tester.py +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/python -# -*- coding:utf-8 -*- - -from ProxyTester import Shadowsocks -from ProxyTester import ShadowsocksR -from ProxyTester import VMess -from ProxyTester import VLESS -from ProxyTester import Trojan -from ProxyTester import TrojanGo -from ProxyTester import Brook -from ProxyTester import Hysteria - -def test(key: str, config: dict) -> list: - if key in ['ss', 'shadowsocks']: - testObj = Shadowsocks - elif key in ['ssr', 'shadowsocksr']: - testObj = ShadowsocksR - elif key == 'vmess': - testObj = VMess - elif key == 'vless': - testObj = VLESS - elif key == 'trojan': - testObj = Trojan - elif key == 'trojan-go': - testObj = TrojanGo - elif key == 'brook': - testObj = Brook - elif key == 'hysteria': - testObj = Hysteria - else: - return [] - return testObj.test(config) diff --git a/Test.py b/Test.py deleted file mode 100644 index af6b85f..0000000 --- a/Test.py +++ /dev/null @@ -1,93 +0,0 @@ -#!/usr/bin/python -# -*- coding:utf-8 -*- - -import os -import sys -import time -import signal -import subprocess - -import Check as Checker -import ProxyTester as Tester - -testConfig = { - 'bind': '::1', - 'addr': '::1', - 'port': 12345, - 'passwd': 'dnomd343', - 'host': 'local.343.re', - 'path': '/test', - 'service': 'dnomd343', - 'file': '/tmp/proxycTest.json', - 'id': '1f7aa040-94d8-4b53-ae85-af6946d550bb', - 'cert': '/etc/ssl/certs/343.re/fullchain.pem', - 'key': '/etc/ssl/certs/343.re/privkey.pem', -} - -def testBuild(config: dict): # load file and start process - if config['filePath'] is not None: - with open(config['filePath'], 'w') as fileObject: # save file - fileObject.write(config['fileContent']) - if config['startCommand'] is None: - return None - return subprocess.Popen( # start process - config['startCommand'], - env = config['envVar'], - stdout = subprocess.DEVNULL, - stderr = subprocess.DEVNULL, - preexec_fn = os.setpgrp # new process group - ) - -def testDestroy(config: dict, process): # remove file and kill process - if process is not None and process.poll() is None: # still alive - os.killpg(os.getpgid(process.pid), signal.SIGTERM) # kill process group - while process.poll() is None: # wait for exit - process.terminate() # SIGTERM - time.sleep(0.2) - if config['filePath'] is not None: - os.remove(config['filePath']) # remove file - -def testObject(option: dict) -> None: # test target object - aiderProcess = None - serverProcess = testBuild(option['server']) # start server process - if option['aider'] is not None: - aiderProcess = testBuild(option['aider']) # start aider process - - checkResult = Checker.proxyTest({ # http check - 'check': ['http'], - 'info': option['proxy'] - }, startDelay = 0.5) - print(option['caption'], end=' -> ') - if not checkResult['success']: # client build error - print('\n--------------------------------------------------------------------------------------------------------------------------------') - print(option) - print('--------------------------------------------------------------------------------------------------------------------------------\n') - testDestroy(option['server'], serverProcess) # destroy and exit - if option['aider'] is not None: - testDestroy(option['aider'], aiderProcess) - raise Exception('check error') - delay = checkResult['check']['http']['delay'] # get http delay - if delay > 0: - print(format(delay, '.2f') + 'ms') - else: - print('ERROR') - - testDestroy(option['server'], serverProcess) # destroy server process - if option['aider'] is not None: - testDestroy(option['aider'], aiderProcess) # destroy aider process - -if len(sys.argv) == 1: # no param - print('Unknown test type') - sys.exit(1) -testList = Tester.test(sys.argv[1].lower().strip(), testConfig) # get test list - -if len(sys.argv) == 2: # test all - for i in range(0, len(testList)): - print(str(i), end = ': ') - testObject(testList[i]) - sys.exit(0) - -if len(sys.argv) == 3: # test target index - testObject(testList[int(sys.argv[2])]) -else: - print('Too many options')