tc_net_secu 使用手册
简介
tc_net_secu 是一款基于 inpfw 和 NPF 的电力网络安全应用。它能从基于 SylixOS 的嵌入式设备网卡中分析有问题的设备和报文并对其进行针对性防御。
功能介绍
当前 tc_net_secu 版本为 1.0,支持如下功能:
- 支持使用配置文件设置防御策略;
- 支持多网口防御配置;
- 支持 cli 程序,可以与 tc_net_secu 主控程序交互;
- 支持以太网广播风暴防御;
- 支持 UDP 广播风暴防御;
- 支持 ICMP 请求泛洪防御;
- 支持 SMURF 防御;
- 支持 TCP SYN 防御;
- 支持 ARP 欺骗防御;
原理简介
tc_net_secu 防御基础原理如下图所示,即由 inpfw 框架去截获从网卡驱动发往协议栈的网络报文,之后 inpfw 将初步解析过的报文发送给 tc_net_secu,由 tc_net_secu 来进行报文的统计与分析,最后,如果发生攻击,tc_net_secu 则会根据配置文件生成防御策略。这里的防御策略主要是黑名单 + 白名单的机制。黑白名单的生成借助 SylixOS 自带的 NPF 工具。
配置文件和防御策略简介
配置文件的作用,就是为了在发生攻击时,让 tc_net_secu 知道如何生成防御策略。防御的逻辑如下图所示;
配置文件如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<!--防御配置 -->
<ETH_STORM_DEFENSE>
<!--en1 网口 -->
<support_en name="en1">
<!--防御策略配置 -->
<!-- 注:singledevmax blacklistcountlimit 这些数字参数标签,如果不写,则其值默认为 -1 ,表示此项无效 -->
<!--singledevmax : 每秒收到单个设备发的此类报文的个数限制,一旦超过这个限制,则开启黑名单防御,这个设备会被拉近黑名单,超时时间:blacklisttimeout -->
<!--alldevmax : 每秒收到总的此类报文的个数限制,一旦超过这个限制,则启动白名单 -->
<!--blacklistcountlimit : 黑名单个数限制,一旦超过这个限制,则启动白名单. 如果设置为 -1, 则无限制 -->
<!--blacklisttimeout : 黑名单超时时间(分钟). 设置为 0, 表示永不删除 -->
<!--allpkttimeout : 所有报文过滤超时时间(分钟). 设置为 0, 表示永久过滤 -->
<!-- 综上: 1、当 singledevmax 值有效时,则会对单个设备发送的此类报文进行统计分析,超过此值,就拉黑,拉黑个数超过 blacklistcountlimit 就启动白名单,以后只允许白名单中的通过 ;
2、当 alldevmax 值有效时,则会对所有设备发送的此类报文进行统计分析,超过此值,就启动白名单,以后只允许白名单中的通过 ;
3、如果没有指定白名单,那上述两种情况发生时,就会对所有此类报文进行过滤,过滤时间为 allpkttimeout ,超时后,会重新开始计数统计;
4、如果所有白名单超时后,自动删除了,会重新开始计数统计 -->
<defense_policy
singledevmax="100"
alldevmax="100"
blacklistcountlimit="1"
blacklisttimeout="1"
allpkttimeout="1">
</defense_policy>
<!--白名单类型 : -->
<!--MAC 类型 : 只允许 MAC 地址相同的报文通过 -->
<!--IP 类型 : 只允许 IP 地址段内的报文通过 -->
<!--TCP / UDP 类型 : 只允许 IP 地址段和端口段内的报文通过 -->
<!-- 白名单示例: -->
<white_list>
<item type="IP" in_out="in" ip_addr_s="10.9.0.19" ip_addr_e="10.9.0.19" timeout="1"/>
<item type="IP" in_out="in" ip_addr_s="10.9.1.120" ip_addr_e="10.9.1.120" timeout="0"/>
</white_list>
</support_en>
<!--en2 网口 -->
<support_en name="en2">
<defense_policy
singledevmax="40"
alldevmax="100"
blacklistcountlimit="1"
blacklisttimeout="2"
allpkttimeout="1">
</defense_policy>
<white_list>
</white_list>
</support_en>
</ETH_STORM_DEFENSE>
配置文件中的注释与流程图描述一致,需要注意的是,如果需要添加多网卡支持,只需在配置文件中,添加一个 “support_en” 即可完成对需要网卡的配置。
使用方法
tc_net_secu 依赖如下内容:
- xtimer(ko);
- inpfw (ko);
- arpSpoofDefense (ko);
- libnanomsg (so);
- libxml2(so);
操作步骤:
- 按如下顺序编译上述内容:
xtimer(不需要要单独编译,xtimer 本身在 base 编译好后就有) --> libnanomsg --> libxml2 --> inpfw --> arpSpoofDefense -->tc_net_secu; - 将上述编译好的内容部署到板子中;
- 编写配置文件,主要有如下 4 个配置文件;
- 将配置文件放到对应板子的 etc 目录下(注:配置文件的名字和路径不要更改)
- 依次加载如下 ko 程序:
xtimer --> inpfw --> arpSpoofDefense - 使用 inpfw 提供的命令,开启 inpfw 对网卡的截获操作,如需要开启对 en1 的截获,即输入以下内容:
inpfw en1 1
- 运行 tc_net_secu 应用程序,开启防御。
注:tc_net_secu 正常使用的前提是,inpfw 已经使用第 6 步提到的命令对对应的网卡开启了截获。具体 inpfw 的使用操作可以看其工作目录下的使用文档。
tc_net_secu_cli
cli 程序用于与当前的 tc_net_secu 主程序进行交互;
编译方法
tc_net_secu 工程可以编译生成两个对应的可执行程序,一个是 tc_net_secu 程序,还是有一个是 tc_net_secu_cli 程序。需要在 tc_net_secu 工程里的 Makefile 文件中找到 DST_APP 并进行对应的配置即可。如下所示:
#*********************************************************************************************************
# 如果需要编译 cli 程序,则将下面的 DST_APP 的值改为 tc_net_secu_cli
#*********************************************************************************************************
DST_APP := tc_net_secu_cli
使用方法
- 在上述 tc_net_secu 使用成功之后,编译 tc_net_secu_cli 程序并部署到板子中;
- 运行 tc_net_secu_cli 程序,进行特定的 shell 交互界面;
shell 交互
tc_net_secu_cli 的交互采用 :OPT + OBJ + CON 的命令组合方式,即 动作 + 对象 + 内容。
默认情况下,shell 交互处于默认的 “default” 交互界面,此界面下你可以使用如下命令:
获取当前的版本信息
CMD: get version
退出 cli 程序
CMD:quit
获取当前所有防御工作状态
CMD: get state
启动所有防御模块
CMD:start
关闭所有防御模块
CMD:stop
重启所有防御模块
CMD:restart
使用如下命令可以进入对应的防御模块交互界面,从而可以单独对某一个防御模块进行操作
nsdefense : 以太网 / UDP 广播风暴防御
sfdefense : SYN 泛洪防御
smdefense : ICMP 请求 / smurf 防御
asdefense : ARP 欺骗防御
在对应的交互里同样可以使用如下命令操作:
start:启动
stop:停止
restart:重启
get state:获取当前模块工作状态
回退到 default 界面
default