mirror of https://github.com/dnomd343/ProxyC
dnomd343
2 years ago
6 changed files with 198 additions and 8 deletions
@ -0,0 +1,89 @@ |
|||||
|
#!/usr/bin/env python3 |
||||
|
# -*- coding: utf-8 -*- |
||||
|
|
||||
|
import os |
||||
|
import json |
||||
|
from Tester import Xray |
||||
|
from Builder import VLESS |
||||
|
from Basis.Logger import logging |
||||
|
from Basis.Process import Process |
||||
|
from Basis.Functions import md5Sum |
||||
|
from Basis.Functions import genUUID |
||||
|
from Basis.Methods import xtlsFlows |
||||
|
from Basis.Functions import getAvailablePort |
||||
|
|
||||
|
settings = { |
||||
|
'serverBind': '127.0.0.1', |
||||
|
'clientBind': '127.0.0.1', |
||||
|
# 'serverBind': '::1', |
||||
|
# 'clientBind': '::1', |
||||
|
'workDir': '/tmp/ProxyC', |
||||
|
} |
||||
|
|
||||
|
|
||||
|
def loadServer(configFile: str, proxyInfo: dict, streamConfig: dict, xtlsFlow: str or None) -> Process: |
||||
|
vlessConfig = Xray.loadConfig({ |
||||
|
'protocol': 'vless', |
||||
|
'listen': proxyInfo['server'], |
||||
|
'port': proxyInfo['port'], |
||||
|
'settings': { |
||||
|
'clients': [{**{ |
||||
|
'id': proxyInfo['id'], |
||||
|
}, **({} if xtlsFlow is None else { |
||||
|
'flow': xtlsFlow |
||||
|
})}], |
||||
|
'decryption': 'none' |
||||
|
}, |
||||
|
'streamSettings': streamConfig |
||||
|
}) |
||||
|
serverFile = os.path.join(settings['workDir'], configFile) |
||||
|
return Process(settings['workDir'], cmd = ['xray', '-c', serverFile], file = { |
||||
|
'path': serverFile, |
||||
|
'content': json.dumps(vlessConfig) |
||||
|
}, isStart = False) |
||||
|
|
||||
|
|
||||
|
def loadClient(configFile: str, proxyInfo: dict, socksInfo: dict) -> Process: # load client process |
||||
|
clientFile = os.path.join(settings['workDir'], configFile) |
||||
|
vlessCommand, vlessConfig, _ = VLESS.load(proxyInfo, socksInfo, clientFile) |
||||
|
return Process(settings['workDir'], cmd = vlessCommand, file = { |
||||
|
'path': clientFile, |
||||
|
'content': vlessConfig |
||||
|
}, isStart = False) |
||||
|
|
||||
|
|
||||
|
def loadTest(stream: dict) -> dict: |
||||
|
proxyInfo = { # connection info |
||||
|
'server': settings['serverBind'], |
||||
|
'port': getAvailablePort(), |
||||
|
'method': 'none', |
||||
|
'id': genUUID(), # random uuid v5 |
||||
|
'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 = 'vless_%s' % (md5Sum(stream['caption'])[:8]) |
||||
|
testInfo = { # release test info |
||||
|
'title': 'VLESS 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 vless test -> %s' % testInfo) |
||||
|
return testInfo |
||||
|
|
||||
|
|
||||
|
def load(): |
||||
|
streams = Xray.loadStream() # load xray-core stream list |
||||
|
for stream in streams: # test all stream cases |
||||
|
yield loadTest(stream) |
@ -0,0 +1,98 @@ |
|||||
|
#!/usr/bin/env python3 |
||||
|
# -*- coding: utf-8 -*- |
||||
|
|
||||
|
import copy |
||||
|
import itertools |
||||
|
|
||||
|
from Tester import V2ray |
||||
|
from Basis.Methods import xtlsFlows |
||||
|
from Basis.Functions import genFlag |
||||
|
from Basis.Methods import quicMethods |
||||
|
from Basis.Methods import udpObfuscations |
||||
|
|
||||
|
loadConfig = V2ray.loadConfig |
||||
|
tcpStream = V2ray.tcpStream |
||||
|
kcpStream = V2ray.kcpStream |
||||
|
h2Stream = V2ray.h2Stream |
||||
|
quicStream = V2ray.quicStream |
||||
|
grpcStream = V2ray.grpcStream |
||||
|
|
||||
|
settings = { |
||||
|
'site': 'www.bing.com', |
||||
|
'host': '343.re', |
||||
|
'cert': '/etc/ssl/certs/343.re/fullchain.pem', |
||||
|
'key': '/etc/ssl/certs/343.re/privkey.pem', |
||||
|
} |
||||
|
|
||||
|
|
||||
|
def addSecure(streamConfig: dict, xtlsFlow: str or None = None, isUdp443: bool = False) -> dict: # add TLS or XTLS |
||||
|
streamConfig['caption'] += ' (with %s)' % ( |
||||
|
'tls' if xtlsFlow is None else (xtlsFlow + ('-udp443' if isUdp443 else '')) |
||||
|
) |
||||
|
streamConfig['info']['secure'] = {**{ # secure options for client |
||||
|
'type': 'tls' if xtlsFlow is None else 'xtls', |
||||
|
'sni': settings['host'], |
||||
|
'alpn': None, |
||||
|
'verify': True, |
||||
|
}, **({} if xtlsFlow is None else { |
||||
|
'flow': xtlsFlow, |
||||
|
'udp443': isUdp443, |
||||
|
})} |
||||
|
streamConfig['server']['security'] = 'tls' if xtlsFlow is None else 'xtls' |
||||
|
streamConfig['server']['%sSettings' % streamConfig['server']['security']] = { # cert and key for server |
||||
|
'alpn': ['h2', 'http/1.1'], |
||||
|
'certificates': [{ |
||||
|
'certificateFile': settings['cert'], |
||||
|
'keyFile': settings['key'], |
||||
|
}] |
||||
|
} |
||||
|
return streamConfig |
||||
|
|
||||
|
|
||||
|
def wsStream(isEd: bool) -> dict: |
||||
|
path = '/' + genFlag(length = 6) # random websocket path |
||||
|
return { |
||||
|
'caption': 'WebSocket stream' + (' (Max-Early-Data 2048)' if isEd else ''), |
||||
|
'info': { |
||||
|
'type': 'ws', |
||||
|
'host': settings['host'], |
||||
|
'path': path, |
||||
|
'ed': 2048 if isEd else None, |
||||
|
'secure': None, |
||||
|
}, |
||||
|
'server': { |
||||
|
'network': 'ws', |
||||
|
'wsSettings': { |
||||
|
'path': path + ('?ed=2048' if isEd else ''), |
||||
|
'headers': { |
||||
|
'Host': settings['host'] |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
def loadStream() -> list: |
||||
|
streams = [] |
||||
|
addStream = lambda x: streams.append(copy.deepcopy(x)) |
||||
|
for isObfs in [False, True]: |
||||
|
addStream(tcpStream(isObfs)) # TCP stream |
||||
|
addStream(addSecure(tcpStream(isObfs))) # TCP stream with TLS |
||||
|
if isObfs: continue # can't use XTLS when enable obfs |
||||
|
for xtlsFlow, udp443 in itertools.product(xtlsFlows, [False, True]): |
||||
|
addStream(addSecure(tcpStream(isObfs = False), xtlsFlow, udp443)) # TCP stream with XTLS |
||||
|
for udpObfs in udpObfuscations: |
||||
|
addStream(kcpStream(udpObfs)) # mKCP stream |
||||
|
addStream(addSecure(kcpStream(udpObfs))) # mKCP stream with TLS |
||||
|
for xtlsFlow, udp443 in itertools.product(xtlsFlows, [False, True]): |
||||
|
addStream(addSecure(kcpStream(udpObfs), xtlsFlow, udp443)) # mKCP stream with XTLS |
||||
|
for isEd in [False, True]: |
||||
|
addStream(wsStream(isEd)) # WebSocket stream |
||||
|
addStream(addSecure(wsStream(isEd))) # WebSocket stream with TLS |
||||
|
addStream(addSecure(h2Stream())) # HTTP/2 stream with TLS |
||||
|
for quicMethod, quicObfs in itertools.product(quicMethods, udpObfuscations): |
||||
|
addStream(addSecure(quicStream(quicMethod, quicObfs))) # QUIC stream with TLS |
||||
|
for isMulti in [False, True]: |
||||
|
addStream(grpcStream(isMulti)) # gRPC stream |
||||
|
addStream(addSecure(grpcStream(isMulti))) # gRPC stream with TLS |
||||
|
return streams |
Loading…
Reference in new issue