新坑之Bad Proxy(私有协议代理)
Python实现的客户端+服务端私有协议代理
- [X] 用户 <- http(s) -> 代理 <- http(s) -> 终端
- [X] 用户 <- http(s) -> 客户端 <- raw data -> 服务端 <- http(s) -> 终端
- [X] 用户 <- http(s) -> 客户端 <- raw data -> 服务端 <- http(s) -> 终端
- [X] 用户 <- http(s) -> 客户端 <- 私有协议 (BTP) -> 服务端 <- http(s) -> 终端
- [X] 用户 <- http(s) -> 客户端 <- BTPS (over TLS) -> 服务端 <- http(s) -> 终端
- [X] 测试🎉️竟然能用
- [X] domain list
- [ ] websocket(支持nginx代理)
- [ ] websocket(支持nginx代理)
- [ ] 路由功能?也许
我把这个项目命名为Bad Proxy,传输协议就叫Bad Transfer Protocol,说明这很可能是个垃圾程序+垃圾协议
安全性
被动检测
-
数据安全
-
参考了vless和Trojan,不自己加密而是使用TLS,额外加密引入额外特征
- 参考vmess,抛弃md5,使用更加先进的算法,用key和消息一起摘要,认证的同时防御篡改
-
特征检测
-
参考Trojan使用,无状态方案,并把首包附在请求头后面以模仿HTTPS流量
- 参考vless,加入随机长度混淆字段以规避包长检测
-
参考vmess,时间戳随机为真实时间前后30秒,不过我的实现比较麻瓜,不是这么搞的
直接带上了时间戳,感觉还是会引入规律数据,这个得管一下,要不tmd把时间戳拆一下吧 - 客户端等引入的各种指纹,暂时没管,将来要搞的像Chrome发出的请求才对 - 高端口问题由nginx的tcp sni分流解决,不过相比websocket还是不够隐蔽,不能共用一个域名,只能复用端口,而websocket里包含的路径是经过tls加密而不可见的。
主动探测
- 长延迟重放
数据包中带上时间戳,服务端检查如果超时一定时间则直接返回http应答 - 短延迟重放
每个协议头带有哈希值,服务端将合法请求的哈希值存入lru,其容量保证一个合法协议头超时之前接收到的其他合法请求不会把它的哈希值挤出缓存丢弃 - 协议回落
检测到非BTP连接则尝试解析HTTP请求,解析成功则返回HTTP应答,否则断连,将来应支持回落到nginx或其他网站
实现
路由
其实没啥路由,只有一个进站一个出站,用select监听转发,也许未来会用epoll+多个进出站(后来试了一下python的async,感觉无必要,主要是async不能无缝衔接ssl socket,要用tls的话要把整个程序改成异步,懒)
lru
简单的链表+哈希集合实现,二十四万的容量大约占不到100M内存,其实有点多......要不要减少一下,毕竟1000qps的目标性能有点太高了,感觉500够够的 (现在改成了十二万容量,只占到40~MB的内存,总共大约50MB,完全可以接收)
域名识别
客户端建一个哈希表,读取大概十几个文件一共八千多个域名,占50M左右内存,对客户端来说50M根本感知不到,本来怕每次启动都读一堆文件会不会慢,都做好C++实现的准备了,不过python还是比想象中的快的多,倒是每次连接都会读一下哈希表,这个操作可能会慢
国内服务器做了一下测试,确实能用,希望这个东西能一直做下去,预期持续维护五年吧