suricata 3.1 源码分析31 (RespondReject)

本文深入解析RespondReject模块的工作原理及核心功能,特别是该模块如何针对特定数据包进行阻断及回复操作,有效防止网络攻击和资源浪费。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高晓伟_Steven

相逢即是有缘,动力源于金钱。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值