mirror of https://github.com/dnomd343/ProxyC
Dnomd343
3 years ago
10 changed files with 403 additions and 59 deletions
@ -0,0 +1,223 @@ |
|||||
|
#!/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' |
||||
|
}, |
||||
|
'server': streamConfig |
||||
|
} |
||||
|
|
||||
|
streamConfig['tcpSettings'] = { # http混淆配置 |
||||
|
'header': { |
||||
|
'type': 'http', |
||||
|
'response': httpHeader |
||||
|
} |
||||
|
} |
||||
|
return { |
||||
|
'caption': 'TCP with http obfs', |
||||
|
'client': { |
||||
|
'type': 'tcp', |
||||
|
'obfs': { |
||||
|
'host': host, |
||||
|
'path': path |
||||
|
} |
||||
|
}, |
||||
|
'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 |
||||
|
}, |
||||
|
'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 |
||||
|
}, |
||||
|
'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 |
||||
|
}, |
||||
|
'server': { |
||||
|
'network': 'ws', |
||||
|
'wsSettings': wsSetting |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
def loadH2Stream(host: str, path: str) -> dict: |
||||
|
return { |
||||
|
'caption': 'HTTP/2', |
||||
|
'client': { |
||||
|
'type': 'h2', |
||||
|
'host': host, |
||||
|
'path': path |
||||
|
}, |
||||
|
'server': { |
||||
|
'network': 'h2', |
||||
|
'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 |
||||
|
}, |
||||
|
'server': { |
||||
|
'network': 'quic', |
||||
|
'quicSettings': { |
||||
|
"security": method, |
||||
|
"key": passwd, |
||||
|
"header": { |
||||
|
"type": obfs |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
def loadGrpcStream(service: str) -> dict: |
||||
|
return { |
||||
|
'caption': 'gRPC', |
||||
|
'client': { |
||||
|
'type': 'grpc', |
||||
|
'service': service |
||||
|
}, |
||||
|
'server': { |
||||
|
'network': 'grpc', |
||||
|
'grpcSettings': { |
||||
|
"serviceName": service |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
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' |
||||
|
} |
||||
|
] |
||||
|
}) |
Loading…
Reference in new issue