snort_inline中与防火墙联动的实现以及代码inline.c分析

     近来想测试一个防ddos的算法的性能怎么样,但是这总要用代码实现啊,一开始是想在netfiler中实现,即在某个钩子函数下注册一个模块,但是还没怎么开始就停止了,原因就是内核编程可以使你想跳楼!其次想在iptables下实现,因为想到既然iptables能建立一些规则来阻止攻击包,那么至少iptables中应该可以见到内核的包,另外就是有权限控制包的去留,但是要改iptables的代码也不是很好扩展。
     今天在snort的官方主页上见到有是snort-inline,以前用过snort,也见别人用过无线下的snort(wireless snort),但是这个snort绝对不同,因为可以用 它和iptables实现IPS!!! 而且它可以设置成nf_queue模式,即它分析的包都是防火墙内核中返回到用户态的,只要加这样的命令iptables -A INPUT -p icmp -j QUEUE 即可,其实这归根于Netfiler的NF_queue功能(暂时这么说吧,只是内核于用户态通信的一个机制) ,当然少不了iptables中libipq库的支持,libipq提供一些函数直接和netfilter通信。
    首先我们要下载snort-inline,它要libnet的支持以及libipq的支持,版本问题也要注意,网上有安装这个的一些解答但相对较少。
    其次我们要知道snort-inline是怎么实现于防火墙的通信的。看inline.h和inline.c
inline.h:

void InitInlinePostConfig(void);

#ifndef IPFW
void IpqLoop();
#else
void IpfwLoop();
#endif /* IPFW */

int InlineDrop(); /* call to drop current packet */
int InlineReject(Packet *); /* call to reject current packet */
int InlineAccept();
int InlineReplace();
int InlineMode();

#else
#define InlineMode(a)    (0)
#endif /* GIDS */


#endif /* __INLINE_H__ */

其实由inlilne.h可以看出来以后要DROP只需在你的头文件中包括inline.h然后调用相关的InlineDrop(); 即可。

inline.c部分代码

 

// $Id: inline.c,v 1.3 2003/02/15 21:46:14 redmaze Exp $

#ifdef GIDS
#include "inline.h"
#include "rules.h"
#include <pcap.h>
#include <string.h>
#include <stdlib.h>
#include <libnet.h>

#define PKT_BUFSIZE 65536

/* Most of the code related to libnet (resets and icmp unreach) was
 * taken from sp_respond.c */


/* vars */
int libnet_nd; /* libnet descriptor */
char errbuf[LIBNET_ERRBUF_SIZE];

Packet *tmpP;

char *l_tcp, *l_icmp;

/* predeclarations */
#ifndef IPFW
void HandlePacket(ipq_packet_msg_t *);
void TranslateToPcap(ipq_packet_msg_t *, struct pcap_pkthdr *);
#else
void HandlePacket();
void TranslateToPcap(struct pcap_pkthdr *phdr, ssize_t len);
#endif /* IPFW */
void ResetIV(void);


/**
 * InlineMode - determine if we are in inline mode
 *
 * @returns 1 if we are in inline mode, 0 otherwise
 */

int InlineMode()
{
    if (pv.inline_flag)    /*设置了inline模试flag就等于1*/
        return 1;

    return 0;
}


#ifndef IPFW
void TranslateToPcap(ipq_packet_msg_t *m, struct pcap_pkthdr *phdr)
{
    static struct timeval t;
    if</

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值