suricata 3.1 源码分析31 (RespondReject)
2016-10-14 16:09
741 查看
简介
RespondReject工作在worker线程,在FlowWorker模块之后对数据包进行处理。此处主要的作用是直接对符合过滤规则的数据包进行阻断并回复,从而使得数据包不会流入后续的操作模块。个人理解这点在IPS模式时会十分有用,可以阻断网络攻击、爬虫等。
原码分析
函数RespondRejectFunc只支持IPv4和IPv6的数据包回复,因此其中只调用了4个函数:RejectSendIPv4TCP、RejectSendIPv4ICMP、RejectSendIPv6TCP、RejectSendIPv6ICMP。
下面主要分析一下RejectSendIPv4TCP函数。
注:这里有一个我开始不是很明白。对原端来的数据包进行回复很好理解,对阻断的包做一个响应,仅仅是通知一下对方“我收到你的包了”。可对目的端发送数据包就有点不好理解了,后来还是同事提醒我的,如果在我们阻断之前原端和目地端已经建立了连接,那么单方面阻断原端数据会使得目地端长时间处于等待数据包的状态,占用系统资源,这时我们给上地端发送数据,告诉目地端“现在连接结束,可以释放资源了”,这样就能够减少系统的资源占用。
后续3处分支都调用RejectSendLibnet11L3IPv4TCP函数,这个函数就是通过libnet进行组包,然后发出,当然其中会对需要发关到的地址进行编辑。
RespondReject工作在worker线程,在FlowWorker模块之后对数据包进行处理。此处主要的作用是直接对符合过滤规则的数据包进行阻断并回复,从而使得数据包不会流入后续的操作模块。个人理解这点在IPS模式时会十分有用,可以阻断网络攻击、爬虫等。
原码分析
函数RespondRejectFunc只支持IPv4和IPv6的数据包回复,因此其中只调用了4个函数:RejectSendIPv4TCP、RejectSendIPv4ICMP、RejectSendIPv6TCP、RejectSendIPv6ICMP。
下面主要分析一下RejectSendIPv4TCP函数。
int RejectSendIPv4TCP(ThreadVars *tv, Packet *p, void *data) { SCEnter(); int r = 0; if (PACKET_TEST_ACTION(p, ACTION_REJECT)) { //将数据发送回原端 r = RejectSendLibnet11L3IPv4TCP(tv, p, data, REJECT_DIR_SRC,NULL,0); SCReturnInt(r); } else if (PACKET_TEST_ACTION(p, ACTION_REJECT_DST)) { //将数据发送到目地端 r = RejectSendLibnet11L3IPv4TCP(tv, p, data, REJECT_DIR_DST,NULL,0); SCReturnInt(r); } else if(PACKET_TEST_ACTION(p, ACTION_REJECT_BOTH)) { //同时对原端和目地端进行回复 int ret; ret = RejectSendLibnet11L3IPv4TCP(tv, p, data, REJECT_DIR_SRC,NULL,0); if (RejectSendLibnet11L3IPv4TCP(tv, p, data, REJECT_DIR_DST,NULL,0) == 0) { SCReturnInt(0); } else { SCReturnInt(ret); } } SCReturnInt(0); }
注:这里有一个我开始不是很明白。对原端来的数据包进行回复很好理解,对阻断的包做一个响应,仅仅是通知一下对方“我收到你的包了”。可对目的端发送数据包就有点不好理解了,后来还是同事提醒我的,如果在我们阻断之前原端和目地端已经建立了连接,那么单方面阻断原端数据会使得目地端长时间处于等待数据包的状态,占用系统资源,这时我们给上地端发送数据,告诉目地端“现在连接结束,可以释放资源了”,这样就能够减少系统的资源占用。
后续3处分支都调用RejectSendLibnet11L3IPv4TCP函数,这个函数就是通过libnet进行组包,然后发出,当然其中会对需要发关到的地址进行编辑。
相关文章推荐
- suricata 3.1 源码分析27 (数据包IPv4解码)
- suricata 3.1 源码分析29 (数据包队列)
- suricata 3.1 源码分析17 (流管理2)
- suricata 3.1 源码分析33 (FlowWorker处理流程2 - FlowHandlePacket)
- suricata 3.1 源码分析34 (FlowWorker处理流程3 - 流重用)
- suricata 3.1 源码分析25 (数据包以太层解码)
- suricata 3.1 源码分析12
- suricata 3.1 源码分析10
- suricata 3.1 源码分析11
- suricata 3.1 源码分析18 (模块注册及初始化)
- suricata 3.1 源码分析6
- suricata 3.1 源码分析16 (流管理1)
- suricata 3.1 源码分析7
- suricata 3.1 源码分析35 (FlowWorker处理流程4 - 流重用函数)
- suricata 3.1 源码分析26 (数据包VLAN解码)
- suricata 3.1 源码分析30 (packet_pool处理流程)
- suricata 3.1 源码分析23 (数据包解码模块注册及初始化)
- suricata 3.1 源码分析8
- suricata 3.1 源码分析13 (流初始化)
- suricata 3.1 源码分析14 (流查找分配)