mirror of https://github.com/dnomd343/ProxyC
dnomd343
2 years ago
3 changed files with 137 additions and 2 deletions
@ -0,0 +1,132 @@ |
|||
#!/usr/bin/env python3 |
|||
# -*- coding: utf-8 -*- |
|||
|
|||
import os |
|||
import json |
|||
from Tester import Xray |
|||
from Builder import Trojan |
|||
from Basis.Logger import logging |
|||
from Basis.Process import Process |
|||
from Basis.Functions import md5Sum |
|||
from Basis.Methods import xtlsFlows |
|||
from Basis.Functions import genFlag |
|||
from Basis.Functions import getAvailablePort |
|||
|
|||
settings = { |
|||
'serverBind': '127.0.0.1', |
|||
'clientBind': '127.0.0.1', |
|||
# 'serverBind': '::1', |
|||
# 'clientBind': '::1', |
|||
'workDir': '/tmp/ProxyC', |
|||
'host': '343.re', |
|||
'cert': '/etc/ssl/certs/343.re/fullchain.pem', |
|||
'key': '/etc/ssl/certs/343.re/privkey.pem', |
|||
} |
|||
|
|||
|
|||
def loadServer(configFile: str, proxyInfo: dict, streamConfig: dict, xtlsFlow: str or None) -> Process: |
|||
trojanConfig = Xray.loadConfig({ |
|||
'protocol': 'trojan', |
|||
'listen': proxyInfo['server'], |
|||
'port': proxyInfo['port'], |
|||
'settings': { |
|||
'clients': [{**{ |
|||
'password': proxyInfo['passwd'], |
|||
}, **({} if xtlsFlow is None else { |
|||
'flow': xtlsFlow |
|||
})}], |
|||
}, |
|||
'streamSettings': streamConfig |
|||
}) |
|||
serverFile = os.path.join(settings['workDir'], configFile) |
|||
return Process(settings['workDir'], cmd = ['xray', '-c', serverFile], file = { |
|||
'path': serverFile, |
|||
'content': json.dumps(trojanConfig) |
|||
}, isStart = False) |
|||
|
|||
|
|||
def loadClient(configFile: str, proxyInfo: dict, socksInfo: dict) -> Process: # load client process |
|||
clientFile = os.path.join(settings['workDir'], configFile) |
|||
trojanCommand, trojanConfig, _ = Trojan.load(proxyInfo, socksInfo, clientFile) |
|||
return Process(settings['workDir'], cmd = trojanCommand, file = { |
|||
'path': clientFile, |
|||
'content': trojanConfig |
|||
}, isStart = False) |
|||
|
|||
|
|||
def loadBasicTest(tcpTlsStream: dict) -> dict: |
|||
proxyInfo = { # connection info |
|||
'server': settings['serverBind'], |
|||
'port': getAvailablePort(), |
|||
'passwd': genFlag(length = 8), # random password |
|||
'stream': tcpTlsStream['info'] |
|||
} |
|||
socksInfo = { # socks5 interface for test |
|||
'addr': settings['clientBind'], |
|||
'port': getAvailablePort() |
|||
} |
|||
trojanConfig = { |
|||
'run_type': 'server', |
|||
'local_addr': proxyInfo['server'], |
|||
'local_port': proxyInfo['port'], |
|||
'password': [proxyInfo['passwd']], |
|||
'log_level': 0, # 0 -> ALL / 1 -> INFO / 2 -> WARN / 3 -> ERROR / 4 -> FATAL / 5 -> OFF |
|||
'ssl': { |
|||
'cert': settings['cert'], |
|||
'key': settings['key'] |
|||
} |
|||
} |
|||
serverFile = os.path.join(settings['workDir'], 'trojan_basic_server.json') |
|||
trojanServer = Process(settings['workDir'], cmd = ['trojan', '-c', serverFile], file = { |
|||
'path': serverFile, |
|||
'content': json.dumps(trojanConfig) |
|||
}, isStart = False) |
|||
testInfo = { # release test info |
|||
'title': 'Trojan test: basic connection', |
|||
'client': loadClient('trojan_basic_client.json', proxyInfo, socksInfo), |
|||
'server': trojanServer, |
|||
'socks': socksInfo, # exposed socks5 address |
|||
'interface': { |
|||
'addr': proxyInfo['server'], |
|||
'port': proxyInfo['port'], |
|||
} |
|||
} |
|||
logging.debug('New trojan test -> %s' % testInfo) |
|||
return testInfo |
|||
|
|||
|
|||
def loadTest(stream: dict) -> dict: |
|||
proxyInfo = { # connection info |
|||
'server': settings['serverBind'], |
|||
'port': getAvailablePort(), |
|||
'passwd': genFlag(length = 8), # random password |
|||
'stream': stream['info'] |
|||
} |
|||
socksInfo = { # socks5 interface for test |
|||
'addr': settings['clientBind'], |
|||
'port': getAvailablePort() |
|||
} |
|||
xtlsFlow = None |
|||
if stream['info']['secure'] is not None and stream['info']['secure']['type'] == 'xtls': # with XTLS secure |
|||
xtlsFlow = xtlsFlows[stream['info']['secure']['flow']] |
|||
xtlsFlow = xtlsFlow.replace('splice', 'direct') # XTLS on server should use xtls-rprx-direct flow |
|||
configName = 'trojan_%s' % (md5Sum(stream['caption'])[:8]) |
|||
testInfo = { # release test info |
|||
'title': 'Trojan test: %s' % stream['caption'], |
|||
'client': loadClient(configName + '_client.json', proxyInfo, socksInfo), |
|||
'server': loadServer(configName + '_server.json', proxyInfo, stream['server'], xtlsFlow), |
|||
'socks': socksInfo, # exposed socks5 address |
|||
'interface': { |
|||
'addr': proxyInfo['server'], |
|||
'port': proxyInfo['port'], |
|||
} |
|||
} |
|||
logging.debug('New trojan test -> %s' % testInfo) |
|||
return testInfo |
|||
|
|||
|
|||
def load(): |
|||
streams = Xray.loadStream() # load xray-core stream list |
|||
yield loadBasicTest(streams[1]) # Trojan basic test -> TCP stream with TLS |
|||
for stream in streams: # test all stream cases |
|||
yield loadTest(stream) |
Loading…
Reference in new issue