近来想测试一个防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</
|