[TOC]
这是一个CoLoR网络架构下的代理系统,有一个简单的界面和一个监听进程,主语言是python,前端使用了pyqt5以及相关的一些库,后端使用了scapy库绑定网卡直接发自定义格式包。
该前端是一个简易的文件共享系统,支持“生产者”注册文件,然后“消费者”抓取文件。主界面分为两大部分,上方是文件列表,支持基本文件操作,下方是网络拓扑,支持基本图形操作以及一些与文件列表的结合操作,下方右边是一些信息反馈以及控制相关,将所有不太适合做在拓扑图里的功能放在这里,并且通过标签页切换。
以上是项目功能的基础展示,为了更好地体现CoLoR的特性,诸如溯源、防止攻击等。接下来将罗列一些待添加或待改进的功能。
- 收包显示
- AS统计信息
- 攻击溯源
- 数据包泄露检测
- 视频流数据传输
- 数据库查询
- 安全认证
以Json格式存储 1、基本数据条目,二维结构;2、拓扑图;3、其余一些客户端代理配置信息
{
"base data":[
[ "name", "path", "SID",
false,//is register
false, //is download
"secret level",
"white list"
],
[...]
],
"topo map":{
"nodes": [
{"type","name","size","nid","pos","font","color"}, //all attributes
{"type":0(AS), "size": 384, "tfont":, "tcolor":}, //tfont和tcolor用于AS通量统计
{"type":1(RM), "nid":"11111111111111111111111111111111"},
{"type":2(BR), "nid":"11111111111111112222222222222222"},
{"type":3(normal router)}
{"type":4(Switch)}
{"type":5(agent-me), "nid":"11111111111111111111111111111110"}
],
"edges":[
[1, 3, "px", "font", "color"],
[2, 4]
],
"ASinfo":{
"2":[1,3]
}
},
"user info":{
"filetmppath":"D:/CodeHub/CoLoRagent/.tmp/",
"myNID":"11111111111111111111111111111110",
"RMIPv4":"10.0.0.1",
"myIPv4":"192.168.50.192"
}
}
注意:topo map中nodes第一组为完整格式说明,接下来6组分别举例了各类型节点必要属性,其余属性可不添加,另外nodes里pos属性如果存在那么所有节点都存在。
"base data"每列含义(./SourceCode/serviceTable.py)如下:
COLUMN = ['文件名', '路径', 'SID', '是否通告', '是否下载', '密级指定', '白名单']
"topo map"中"nodes"."type"含义如下:
NodeType = ['cloud', 'RM', 'BR', 'router', 'switch', 'PC']
查看源码
graph LR
A[/main/]--->|main thread|B[mainwindow]
A-.->|new thread|C[CoLoRMonitor]
B---D[File list]
B---E[topological graph]
C-.->|show message|D
C-.->|show receive package|E
D--->|action|F{need time?}
E--->|action|F
F--->|Yes|G[new thread to do]
F--->|No|H[do it right now]
G-.->I{loop}
H-.->I
I-.->|Yes|B
I-.->|No|J[/End/]
查看源码
graph TD
A[main.py] ---> b[logInWindow.py]
b ---> B[MainWindow.py]
B ---> C[AddItemWindow.py]
B ---> D[GraphicWindow.py]
B ---> E[FileData.py]
B ---> F[serviceList.py]
B ---> G[serviceTable.py]
F ---> E
G ---> E
B ---> H[worker.py]
D ---> I[topoGraphView.py]
D ---> J[topoGraphScene.py]
J ---> K[NodeEdge.py]
I ---> J
I ---> K
B ---> rc[/resource_rc.py/]
K ---> rc
b ---> logIn[/logInDialog.py/]
B ---> main[/MainPage.py/]
C ---> add[/addItemDialog.py/]
me[主要书写代码]
notme[/工具生成代码/]
这部分非本人负责,主要功能集中在ColorMonitor.py和Proxylib.py两个文件里。主要包含了一套发包系统,一个简单的停等协议,特殊功能有视频流传输和数据库操作。
查看源码
graph LR
A[/main/]--->|start thread|B[CoLoRMonitor]
B--->|listen|C{package.type?}
C--get--> D[check database then send]
C--data--> E[store database]
C--control--> F[change option]
D---> G{next?}
E---> G
F---> G
G-.->|Yes|C
G--->|No|H[/End/]
- def Sha1Hash(path) #计算文件hash,path为文件路径。
- def AddCacheSidUnit(path, AM, N, L, I, level) #将通告加入缓存,path为文件路径,AM表示通告单元动作类型(新增0x1、更新0x2、注销0x3),N、L、I分别表示n_sid,l_sid,nid能否省略,level表示信息级别(密级通告?),可暂时不理。
- def DeleteCacheSidUnit(path) #删除通告缓存,删除对应缓存文件,path为文件路径。暂时缺少应用场景。
- def SidAnn(ttl, publickey, P) #发送通告文件,所有参数均为默认值
- def Get(SID, path, ttl, publickey, QoS, SegId) #获取文件,SID为服务ID,path为存放路径,后边参数暂时设为默认值,不管
AddCacheSidUnit(path, AM, N, L, I, level=-1)详细说明
功能:生成SID策略单元并缓存于cache。
path:文件路径
AM:含义同announce_unit的AM字段(详见:包格式文档)。int类型,可为1~3。
N:含义同announce_unit的N字段。int类型,可为0~1。
L:含义同announce_unit的L字段。int类型,可为0~1。
I:含义同announce_unit的I字段。int类型,可为0~1。
level:可选策略字段,标注当前SidUnit等级。int类型,可为1~10,或不填。
SidAnn(ttl=64, PublicKey='', P=1)详细说明
功能:从待通告cache中整合已生成SID策略单元,向RM发送对应ANN报文。
ttl:可选字段,含义同通告包的ttl字段。int类型,可为0~255。
PublicKey:可选字段,含义同通告包的Public_key字段。String类型,规定内含字符为16进制字符(0~9,a~f),字符串长度为2的倍数,最短长度为2。
P:可选字段,含义同通告包的P字段。int类型,可为0~1。
Get(SID, path, ttl=64, PublicKey='', QoS='', SegID=-1, A=1)详细说明
功能:发送Get报文,从网络中获取特定SID对应的内容,存储到规定位置。
SID:希望从网络中获取内容的SID。String类型,规定内含字符为16进制字符(0~9,a~f),长度为32(仅N_sid)、40(仅L_sid)或72(完整SID)。
path:从网络获取内容后期望存储的位置(含文件名!)。格式同此前path。
ttl:可选字段,含义同get包的ttl字段。int类型,可为0~255。
A:可选字段,含义同get包的A字段。int类型,可为0~1。
CacheSidUnits = {key:value}
功能:暂存通过AddCacheSidUnit生成,但尚未调用SidAnn进行通告的SID通告单元。
Key: String类型,调用AddCacheSidUnit时使用的文件路径。
Value:通过AddCacheSidUnit生成的通告单元类(class SidUnit,记录了通告单元信息)。
AnnSidUnits = {key:value}
功能:记录已向网络中通告的SID,以及对应的通告策略。
Key:SID。String类型,规定内含字符为16进制字符(0~9,a~f),长度为32(仅N_sid)、40(仅L_sid)或72(完整SID)。
Value:通告单元,格式同CacheSidUnits的Value。
gets = {key:value}
功能:记录当前请求中(即发送了get但暂未完全接收到)的SID信息。
Key:SID。格式同上。
Value:目标存储路径(含文件名),String类型。
- asset 图片素材
- doc 学习文档
- config 配置文件
- src 代码源文件
- CoLoRProtocol 自定义color协议栈
- Backend 后端代码
- Frontend 前端代码
- PageUI QT绘制的界面
- Test 测试文件
- VPPPlugin vpp插件
Icon/文件夹内有一个resource.qrc记录了图标文件,以及它们的重命名,这个文件主要用于qt,编译成二进制码后(src中的resource_rc.py文件)就可以摆脱主机图片格式的限制,便于运行和分发。
test/文件夹下写了color的get、data、control包解析器,存储了两份与物理拓扑对应的json拓扑数据记录,还有json格式转换的两个小程序,其余一些文件是端到端安全认证的一些测试文件。
python3.9.1
cryptography 3.4.7
opencv-python 4.5.3.56
PyQt5 5.15.4
pyqtgraph 0.11.1
pyqt5-tools 5.15.2.3.0.2
qdarkstyle 3.0.2
scapy 2.4.4
为了有较好的qt编程体验建议安装pyqt5-stubs,然后配置vscode中的pylint,这样可以让编译器联想和提示库函数。
使用python autopep8
类型名:每个单词首字母大写,即PascalCase
函数名:除第一个单词首字母大写,即camelCase
变量名:小写+下划线,即snake_case
其他按照各个库的习惯写