mirror of https://github.com/dnomd343/ProxyC
Dnomd343
3 years ago
6 changed files with 353 additions and 0 deletions
@ -0,0 +1,121 @@ |
|||||
|
#!/usr/bin/python |
||||
|
# -*- coding:utf-8 -*- |
||||
|
|
||||
|
pluginList = [ # 插件列表 |
||||
|
'obfs-local', |
||||
|
'simple-tls', |
||||
|
'v2ray-plugin', |
||||
|
'xray-plugin', |
||||
|
'kcptun-client', |
||||
|
'gost-plugin', |
||||
|
'ck-client', |
||||
|
'gq-client', |
||||
|
'mtt-client', |
||||
|
'rabbit-plugin', |
||||
|
'qtun-client', |
||||
|
'gun-plugin' |
||||
|
] |
||||
|
|
||||
|
pluginAlias = { # 插件别名 |
||||
|
'obfs-local': [ |
||||
|
'obfs', |
||||
|
'obfs-plugin', |
||||
|
'obfs-client', |
||||
|
'obfs-server', |
||||
|
'simple-obfs', |
||||
|
], |
||||
|
'simple-tls': [ |
||||
|
'tls-local', |
||||
|
'tls-client', |
||||
|
'tls-server', |
||||
|
'tls-plugin', |
||||
|
'simple-tls-local', |
||||
|
'simple-tls-client', |
||||
|
'simple-tls-server', |
||||
|
'simple-tls-plugin', |
||||
|
], |
||||
|
'v2ray-plugin': [ |
||||
|
'v2ray', |
||||
|
'v2ray-local', |
||||
|
'v2ray-client', |
||||
|
'v2ray-server', |
||||
|
], |
||||
|
'xray-plugin': [ |
||||
|
'xray', |
||||
|
'xray-local', |
||||
|
'xray-client', |
||||
|
'xray-server', |
||||
|
], |
||||
|
'kcptun-client': [ |
||||
|
'kcptun', |
||||
|
'kcptun-local', |
||||
|
'kcptun-server', |
||||
|
'kcptun-plugin', |
||||
|
], |
||||
|
'gost-plugin': [ |
||||
|
'gost', |
||||
|
'gost-local', |
||||
|
'gost-client', |
||||
|
'gost-server', |
||||
|
], |
||||
|
'ck-client': [ |
||||
|
'ck', |
||||
|
'ck-local', |
||||
|
'ck-server', |
||||
|
'ck-plugin', |
||||
|
'cloak', |
||||
|
'cloak-local', |
||||
|
'cloak-client', |
||||
|
'cloak-server', |
||||
|
'cloak-plugin', |
||||
|
], |
||||
|
'gq-client': [ |
||||
|
'gq', |
||||
|
'gq-local', |
||||
|
'gq-server', |
||||
|
'gq-plugin', |
||||
|
'goquiet', |
||||
|
'goquiet-local', |
||||
|
'goquiet-client', |
||||
|
'goquiet-server', |
||||
|
'goquiet-plugin', |
||||
|
], |
||||
|
'mtt-client': [ |
||||
|
'mtt', |
||||
|
'mtt-local', |
||||
|
'mtt-server', |
||||
|
'mtt-plugin', |
||||
|
'mos-tls-tunnel', |
||||
|
'mos-tls-tunnel-local', |
||||
|
'mos-tls-tunnel-client', |
||||
|
'mos-tls-tunnel-server', |
||||
|
'mos-tls-tunnel-plugin', |
||||
|
], |
||||
|
'rabbit-plugin': [ |
||||
|
'rabbit', |
||||
|
'rabbit-tcp', |
||||
|
'rabbit-local', |
||||
|
'rabbit-client', |
||||
|
'rabbit-server', |
||||
|
], |
||||
|
'qtun-client': [ |
||||
|
'qtun', |
||||
|
'qtun-local', |
||||
|
'qtun-server', |
||||
|
'qtun-plugin', |
||||
|
], |
||||
|
'gun-plugin': [ |
||||
|
'gun', |
||||
|
'gun-local', |
||||
|
'gun-client', |
||||
|
'gun-server', |
||||
|
] |
||||
|
} |
||||
|
|
||||
|
def pluginFormat(plugin): # 插件格式化 |
||||
|
plugin = plugin.replace('_', '-').lower().strip() |
||||
|
if not plugin in pluginList: # 非标插件名 |
||||
|
for pluginName in pluginAlias: |
||||
|
if plugin in pluginAlias[pluginName]: # 匹配别名列表 |
||||
|
return pluginName |
||||
|
return plugin |
@ -0,0 +1,141 @@ |
|||||
|
#!/usr/bin/python |
||||
|
# -*- coding:utf-8 -*- |
||||
|
|
||||
|
from ProxyFilter import baseFunc |
||||
|
from ProxyFilter import Plugin as sip003 |
||||
|
|
||||
|
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' |
||||
|
] |
||||
|
|
||||
|
pluginList = [ |
||||
|
'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 __ssFormat(raw): # 容错性格式化 |
||||
|
try: |
||||
|
raw['server'] = raw['server'].strip() |
||||
|
raw['port'] = int(raw['port']) |
||||
|
raw['method'] = raw['method'].replace('_', '-').lower().strip() |
||||
|
raw['plugin'] = sip003.pluginFormat(raw['plugin']) |
||||
|
except: |
||||
|
pass |
||||
|
return raw |
||||
|
|
||||
|
def ssFilter(raw): |
||||
|
''' |
||||
|
Shadowsocks节点合法性检查 |
||||
|
|
||||
|
不合法: |
||||
|
return False, {reason} |
||||
|
|
||||
|
合法: |
||||
|
return True, { |
||||
|
'type': 'ss', |
||||
|
'server': '...', |
||||
|
'port': ..., |
||||
|
'password': '...', |
||||
|
'method": '...', |
||||
|
'plugin": '...', |
||||
|
'pluginParam": '...' |
||||
|
} |
||||
|
''' |
||||
|
try: |
||||
|
result = {} |
||||
|
result['type'] = 'ss' |
||||
|
raw = __ssFormat(raw) |
||||
|
|
||||
|
if not 'server' in raw: |
||||
|
return False, 'Missing `server` option' |
||||
|
if not 'port' in raw: |
||||
|
return False, 'Missing `port` option' |
||||
|
if not 'password' in raw: |
||||
|
return False, 'Missing `password` option' |
||||
|
if not 'method' in raw: |
||||
|
return False, 'Missing `method` option' |
||||
|
|
||||
|
if baseFunc.isHost(raw['server']): |
||||
|
result['server'] = raw['server'] |
||||
|
else: |
||||
|
return False, 'Illegal `server` option' |
||||
|
if baseFunc.isPort(raw['port']): |
||||
|
result['port'] = raw['port'] |
||||
|
else: |
||||
|
return False, 'Illegal `port` option' |
||||
|
result['password'] = raw['password'] |
||||
|
if raw['method'] in ssMethodList: |
||||
|
result['method'] = raw['method'] |
||||
|
else: |
||||
|
return False, 'Unknown shadowsocks method' |
||||
|
|
||||
|
if (not 'plugin' in raw) or raw['plugin'] == '': |
||||
|
result['plugin'] = '' |
||||
|
result['pluginParam'] = '' |
||||
|
else: |
||||
|
if raw['plugin'] in pluginList: |
||||
|
result['plugin'] = raw['plugin'] |
||||
|
result['pluginParam'] = raw['pluginParam'] |
||||
|
else: |
||||
|
return False, 'Unknown sip003 plugin' |
||||
|
except: |
||||
|
return False, 'Unknown error' |
||||
|
return True, result |
@ -0,0 +1,6 @@ |
|||||
|
#!/usr/bin/python |
||||
|
# -*- coding:utf-8 -*- |
||||
|
|
||||
|
from ProxyFilter.filter import * |
||||
|
|
||||
|
__all__ = [ 'filter' ] |
@ -0,0 +1,39 @@ |
|||||
|
import re |
||||
|
import IPy |
||||
|
|
||||
|
def isHost(host: str) -> bool: |
||||
|
''' |
||||
|
判断host是否合法 |
||||
|
|
||||
|
IPv4 / IPv6 / Domain |
||||
|
|
||||
|
合法: return True |
||||
|
|
||||
|
不合法: return False |
||||
|
''' |
||||
|
try: |
||||
|
IPy.IP(host) |
||||
|
if host.find('/') != -1: # filter CIDR |
||||
|
return False |
||||
|
return True |
||||
|
except: # not IP address |
||||
|
pass |
||||
|
return (re.search(r'^(?=^.{3,255}$)[a-zA-Z0-9_][a-zA-Z0-9_-]{0,62}(\.[a-zA-Z0-9_][a-zA-Z0-9_-]{0,62})+$', host) != None) |
||||
|
|
||||
|
def isPort(port) -> bool: |
||||
|
''' |
||||
|
判断端口是否合法 |
||||
|
|
||||
|
1 ~ 65535 |
||||
|
|
||||
|
合法: return True |
||||
|
|
||||
|
不合法: return False |
||||
|
''' |
||||
|
try: |
||||
|
if isinstance(port, (int, str)): |
||||
|
if int(port) >= 1 and int(port) <= 65535: |
||||
|
return True |
||||
|
except: # illegal |
||||
|
pass |
||||
|
return False |
@ -0,0 +1,30 @@ |
|||||
|
#!/usr/bin/python |
||||
|
# -*- coding:utf-8 -*- |
||||
|
|
||||
|
from ProxyFilter import Shadowsocks |
||||
|
|
||||
|
def filter(raw): |
||||
|
''' |
||||
|
代理信息过滤并格式化 |
||||
|
|
||||
|
参数无效: |
||||
|
return False, {reason} |
||||
|
|
||||
|
参数有效: |
||||
|
return True, { |
||||
|
'...': '...', |
||||
|
'...': '...', |
||||
|
... |
||||
|
} |
||||
|
|
||||
|
''' |
||||
|
try: |
||||
|
if not 'type' in raw: |
||||
|
return False, 'Missing `type` option' |
||||
|
if raw['type'] == 'ss': |
||||
|
return Shadowsocks.ssFilter(raw) |
||||
|
else: |
||||
|
return False, 'Unknown proxy type' |
||||
|
except: |
||||
|
pass |
||||
|
return False, 'Unknown error' |
@ -0,0 +1,16 @@ |
|||||
|
#!/usr/bin/python |
||||
|
# -*- coding:utf-8 -*- |
||||
|
|
||||
|
import ProxyFilter as Filter |
||||
|
|
||||
|
info = { |
||||
|
"type": "ss", |
||||
|
"server": "127.0.0.1 ", |
||||
|
"port": 12345, |
||||
|
"password": "dnomd343", |
||||
|
"method": "aes_256-ctr", |
||||
|
"plugin": "obfs", |
||||
|
"pluginParam": "obfs=http;host=www.bing.com" |
||||
|
} |
||||
|
|
||||
|
print(Filter.filter(info)) |
Loading…
Reference in new issue