A-A+

suricata 3.1 源码分析31 (RespondReject)

2018年12月06日 suricata 暂无评论

简介
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进行组包,然后发出,当然其中会对需要发关到的地址进行编辑。

标签:

给我留言

Copyright © 九毛的官方博客 保留所有权利.   Theme  Ality

用户登录