mirror of https://github.com/dnomd343/ProxyC
Dnomd343
3 years ago
11 changed files with 585 additions and 200 deletions
@ -0,0 +1,287 @@ |
|||||
|
#!/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 |
@ -0,0 +1,200 @@ |
|||||
|
#!/usr/bin/python |
||||
|
# -*- coding:utf-8 -*- |
||||
|
|
||||
|
import copy |
||||
|
import ProxyTester.Plugin as sip003 |
||||
|
|
||||
|
defaultHost = 'dns.343.re' |
||||
|
defaultCert = '/etc/ssl/certs/dns.343.re/certificate.crt' |
||||
|
defaultKey = '/etc/ssl/certs/dns.343.re/private.key' |
||||
|
|
||||
|
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: |
||||
|
port = 12345 |
||||
|
rabbitPort = 20191 |
||||
|
passwd = 'dnomd343' |
||||
|
|
||||
|
proxyInfo = { |
||||
|
'type': 'ss', |
||||
|
'server': '127.0.0.1', |
||||
|
'port': port, |
||||
|
'passwd': passwd, |
||||
|
'method': method |
||||
|
} |
||||
|
serverCommand = [] |
||||
|
caption = 'Shadowsocks method ' + method |
||||
|
if method in ['plain', 'none']: # plain / none -> ss-rust |
||||
|
serverCommand = [ |
||||
|
'ss-rust-server', |
||||
|
'-s', '0.0.0.0:' + str(port), |
||||
|
'-k', passwd, |
||||
|
'-m', method |
||||
|
] |
||||
|
elif method == 'salsa20-ctr': # salsa20-ctr -> ss-python-legacy |
||||
|
serverCommand = [ |
||||
|
'ss-bootstrap-server', '--no-udp', |
||||
|
'--shadowsocks', 'ss-python-legacy-server', |
||||
|
'-p', str(port), |
||||
|
'-k', 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', |
||||
|
'-p', str(port), |
||||
|
'-k', 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 |
||||
|
proxyInfo['port'] = rabbitPort |
||||
|
proxyInfo['plugin'] = { |
||||
|
'type': 'rabbit-plugin', |
||||
|
'param': 'serviceAddr=127.0.0.1:' + str(port) + ';password=' + 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', passwd, |
||||
|
'-rabbit-addr', ':' + str(rabbitPort) |
||||
|
], |
||||
|
'fileContent': None, |
||||
|
'filePath': None, |
||||
|
'envVar': {} |
||||
|
} |
||||
|
}] |
||||
|
|
||||
|
# others plugin |
||||
|
result = [] |
||||
|
pluginConfig = sip003.loadPluginConfig(plugin, defaultHost, defaultCert, defaultKey) # 载入插件配置 |
||||
|
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 ssTest() -> list: |
||||
|
result = [] |
||||
|
for method in ssMethodList: |
||||
|
result += __ssServerConfig(method, None) |
||||
|
for plugin in sip003PluginList: |
||||
|
result += __ssServerConfig('aes-256-ctr', plugin) |
||||
|
# result += __ssServerConfig('aes-256-gcm', None) |
||||
|
return result |
@ -0,0 +1,6 @@ |
|||||
|
#!/usr/bin/python |
||||
|
# -*- coding:utf-8 -*- |
||||
|
|
||||
|
from ProxyTester.tester import * |
||||
|
|
||||
|
__all__ = ['test'] |
@ -0,0 +1,20 @@ |
|||||
|
#!/usr/bin/python |
||||
|
# -*- coding:utf-8 -*- |
||||
|
|
||||
|
from ProxyTester import Shadowsocks |
||||
|
|
||||
|
testInfo = { |
||||
|
'type': 'ss', |
||||
|
'method': 'aes-256-ctr', |
||||
|
'plugin': None |
||||
|
} |
||||
|
|
||||
|
def test(key: str) -> list: |
||||
|
if key == 'ss': |
||||
|
return Shadowsocks.ssTest() |
||||
|
elif key == 'ssr': |
||||
|
pass |
||||
|
elif key == 'vmess': |
||||
|
pass |
||||
|
else: |
||||
|
return [] |
@ -1,55 +1,66 @@ |
|||||
#!/usr/bin/python |
#!/usr/bin/python |
||||
# -*- coding:utf-8 -*- |
# -*- coding:utf-8 -*- |
||||
|
|
||||
import sys |
import os |
||||
import time |
import time |
||||
import subprocess |
import subprocess |
||||
|
import Checker |
||||
|
import ProxyTester as Tester |
||||
|
|
||||
import test as Tester |
def testBuild(config: dict): |
||||
import ProxyBuilder as Builder |
if config['filePath'] is not None: |
||||
import ProxyChecker as Checker |
with open(config['filePath'], 'w') as fileObject: # 保存文件 |
||||
|
fileObject.write(config['fileContent']) |
||||
defaultPort = 10808 |
return subprocess.Popen( # 进程启动 |
||||
defaultPasswd = 'dnomd343' |
config['startCommand'], |
||||
|
env = config['envVar'], |
||||
def startTest(testList): |
stdout = subprocess.DEVNULL, |
||||
for field in testList: |
stderr = subprocess.DEVNULL |
||||
serverProcess = subprocess.Popen( |
) |
||||
field['serverCommand'], |
|
||||
stdout = subprocess.DEVNULL, |
def testDestroy(config: dict, process): |
||||
stderr = subprocess.DEVNULL) |
if process.poll() is None: # 未死亡 |
||||
time.sleep(0.1) # 等待进程启动 |
while process.poll() is None: # 等待退出 |
||||
if serverProcess.poll() != None: # 服务端启动失败 |
process.terminate() # SIGTERM |
||||
print("server unexpected exit") |
time.sleep(0.2) |
||||
continue |
if config['filePath'] is not None: |
||||
print(field['caption'] + ' => ', end = '') |
os.remove(config['filePath']) # 删除文件 |
||||
status, client = Builder.build(field['proxyInfo'], '/tmp/ProxyC') |
|
||||
time.sleep(0.5) # 等待初始化完成 |
testList = Tester.test('ss') |
||||
if Builder.check(client) != True: |
|
||||
print("client unexpected exit") # 客户端启动失败 |
aiderProcess = None |
||||
else: |
serverProcess = None |
||||
status, delay = Checker.httpPing(client['port']) |
for testMethod in testList: |
||||
if status == True: |
# print() |
||||
print(format(delay, '.2f') + 'ms') |
# print() |
||||
else: |
# print(testMethod) |
||||
print(delay) |
# continue |
||||
Builder.destroy(client) # 关闭客户端 |
print(testMethod['caption'], end = ' -> ') |
||||
time.sleep(0.1) |
|
||||
serverProcess.terminate() # 关闭服务端 |
serverProcess = testBuild(testMethod['server']) |
||||
time.sleep(0.1) |
if testMethod['aider'] is not None: |
||||
print() |
aiderProcess = testBuild(testMethod['aider']) |
||||
|
|
||||
if len(sys.argv) <= 1: |
ret = Checker.proxyTest({ |
||||
print("no param") |
'check': ['http'], |
||||
sys.exit(0) |
'info': testMethod['proxy'] |
||||
|
}) |
||||
testName = sys.argv[1] |
if not ret['success']: |
||||
if testName == 'ss': |
print('check error') |
||||
testList = Tester.Shadowsocks(defaultPort, defaultPasswd) |
delay = ret['check']['http']['delay'] |
||||
elif testName == 'ssr': |
print(str(delay) + 'ms') |
||||
testList = Tester.ShadowsocksR(defaultPort, defaultPasswd) |
|
||||
else: |
testDestroy(testMethod['server'], serverProcess) |
||||
print("unknown test name") |
if testMethod['aider'] is not None: |
||||
sys.exit(1) |
testDestroy(testMethod['aider'], aiderProcess) |
||||
|
|
||||
startTest(testList) |
# testName = sys.argv[1] |
||||
|
# if testName == 'ss': |
||||
|
# testList = Tester.Shadowsocks(defaultPort, defaultPasswd) |
||||
|
# elif testName == 'ssr': |
||||
|
# testList = Tester.ShadowsocksR(defaultPort, defaultPasswd) |
||||
|
# else: |
||||
|
# print("unknown test name") |
||||
|
# sys.exit(1) |
||||
|
# |
||||
|
# startTest(testList) |
||||
|
@ -1,130 +0,0 @@ |
|||||
#!/usr/bin/python |
|
||||
# -*- coding:utf-8 -*- |
|
||||
|
|
||||
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' |
|
||||
] |
|
||||
|
|
||||
def test(port, password): |
|
||||
testList = [] |
|
||||
for method in ssMethodList: |
|
||||
proxyInfo = { |
|
||||
'type': 'ss', |
|
||||
'server': '127.0.0.1', |
|
||||
'port': int(port), |
|
||||
'password': password, |
|
||||
'method': method, |
|
||||
'plugin': '', |
|
||||
'pluginParam': '', |
|
||||
} |
|
||||
testInfo = 'Shadowsocks method ' + method |
|
||||
if method == 'plain' or method == 'none': |
|
||||
serverCommand = [ |
|
||||
'ss-rust-server', '-U', |
|
||||
'-s', '0.0.0.0:' + str(port), |
|
||||
'-k', password, |
|
||||
'-m', method |
|
||||
] |
|
||||
elif method == 'salsa20-ctr': |
|
||||
serverCommand = [ |
|
||||
'ss-bootstrap-server', |
|
||||
'--shadowsocks', 'ss-python-legacy-server', |
|
||||
'-p', str(port), |
|
||||
'-k', password, |
|
||||
'-m', method |
|
||||
] |
|
||||
else: |
|
||||
specialMethods = [ |
|
||||
'aes-128-cfb128', |
|
||||
'aes-192-cfb128', |
|
||||
'aes-256-cfb128', |
|
||||
'camellia-128-cfb128', |
|
||||
'camellia-192-cfb128', |
|
||||
'camellia-256-cfb128', |
|
||||
] |
|
||||
if method in specialMethods: |
|
||||
method = 'mbedtls:' + method |
|
||||
serverCommand = [ |
|
||||
'ss-bootstrap-server', |
|
||||
'--shadowsocks', 'ss-python-server', |
|
||||
'-p', str(port), |
|
||||
'-k', password, |
|
||||
'-m', method |
|
||||
] |
|
||||
if method == 'idea-cfb' or method == 'seed-cfb': |
|
||||
serverCommand.append('--libopenssl=libcrypto.so.1.0.0') |
|
||||
testList.append({ |
|
||||
'caption': testInfo, |
|
||||
'proxyInfo': proxyInfo, |
|
||||
'serverCommand': serverCommand |
|
||||
}) |
|
||||
testList.append({ |
|
||||
'caption': 'Shadowsocks SIP003 plugin', |
|
||||
'proxyInfo': { |
|
||||
'type': 'ss', |
|
||||
'server': '127.0.0.1', |
|
||||
'port': int(port), |
|
||||
'password': password, |
|
||||
'method': 'aes-256-ctr', |
|
||||
'plugin': 'obfs-local', |
|
||||
'pluginParam': 'obfs=http;obfs-host=www.bing.com', |
|
||||
}, |
|
||||
'serverCommand': [ |
|
||||
'ss-bootstrap-server', |
|
||||
'--shadowsocks', 'ss-python-server', |
|
||||
'-p', str(port), |
|
||||
'-k', password, |
|
||||
'-m', 'aes-256-ctr', |
|
||||
'--plugin', 'obfs-server', |
|
||||
'--plugin-opts', 'obfs=http' |
|
||||
] |
|
||||
}) |
|
||||
return testList |
|
@ -1,5 +0,0 @@ |
|||||
#!/usr/bin/python |
|
||||
# -*- coding:utf-8 -*- |
|
||||
|
|
||||
from test.entry import Shadowsocks |
|
||||
from test.entry import ShadowsocksR |
|
@ -1,11 +0,0 @@ |
|||||
#!/usr/bin/python |
|
||||
# -*- coding:utf-8 -*- |
|
||||
|
|
||||
import test.Shadowsocks as ss |
|
||||
import test.ShadowsocksR as ssr |
|
||||
|
|
||||
def Shadowsocks(port, password): |
|
||||
return ss.test(port, password) |
|
||||
|
|
||||
def ShadowsocksR(port, password): |
|
||||
return ssr.test(port, password) |
|
Loading…
Reference in new issue