libiptc 之数据包利器
(2012-06-27 14:08:27)
标签:
鼎鼎大名开发包数据包源代码环境 |
分类: Linux |
libiptc是netfilter的一个开发包,鼎鼎大名的iptables就是在它的基础上做的开发。
以下我是在SUSE 64位环境下做的实验(Ubuntu环境下一直有问题):
源代码:
以下我是在SUSE 64位环境下做的实验(Ubuntu环境下一直有问题):
源代码:
#include <stdio.h>
#include <libiptc/libiptc.h>
int main(void){
char *tab = "filter";
struct iptc_handle *handle;
在SUSE 32位环境下,在调用iptc_first_chain时会出现段错误(Segmentation fault)。哪位大侠知道错误原因的话,还望多多指点,谢谢。
以下是我利用libiptc做的一个程序原代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <libiptc/libiptc.h>
#include <iptables.h>
#include <lib_netfilter.h>
#include <net/netfilter/nf_nat.h>
#include <linux/netfilter/xt_time.h>
//#define X64 1
//#define SHELL 1
#define TABS 12
#define MIN_PORT 0
#define MAX_PORT 65535
#define ipt_time xt_time_info
#define D_NO -1
#define D_DEBUG 0
#define RULE ipt_entry
//#define DEBUG D_DEBUG
#define XT_TIME_ALL_MONTHDAYS
0XFFFFFFFE
#define XT_TIME_ALL_WEEKDAYS
0XFE
#define XT_TIME_MIN_DAYTIME
0
#define
XT_TIME_MAX_DAYTIME
24 * 60 * 60 - 1
#define XT_TIME_LOOCAL_TZ
1 << 0
static char tables[][TABS] = {"filter", "mangle", "nat"};
static enum
{
F_TIME_START
= 1 << 2,
F_TIME_STOP =
1 << 3,
};
static enum
{
MATCH_TCP = 1
<< 0,
MATCH_UDP = 1
<< 1,
MATCH_TIME =
1 << 2,
MATCH_LIMIT =
1 << 3,
};
static unsigned int time_parse_minutes(const char *str)
{
unsigned int
hour, minute, secound = 0;
char
*e;
char *s =
str;
hour =
strtoul(s, &e, 10);
if(*e != ':'
|| hour > 23)
{
goto
error;
}
s = e +
1;
minute =
strtoul(s, &e, 10);
if((*e !=
':' && *e != '\0') || minute
> 59)
{
goto
error;
}
if(*e ==
'\0')
{
goto
success;
}
s = e +
1;
secound =
strtoul(s, &e, 10);
if(*e !=
'\0' || secound > 59)
{
goto
error;
}
success:
return 60 *
60 * hour + 60 * minute + secound;
error:
return
0;
}
static void r_time_parse_minutes(int time, char *t_str)
{
int t =
time;
sprintf(t_str, "%d", t / 3600);
t %=
3600;
sprintf(t_str, "%s:%d", t_str, t / 60);
t %=
60;
if(t
> 0)
{
sprintf(t_str, "%s:%d", t_str, t);
}
t_str[strlen(t_str)] = '\0';
}
static void fill_rule_match(JNIEnv *env, jobject j_match, struct ipt_entry_match *match)
{
jclass
match_cls = (*env)->FindClass(env,
"org/linux/lib/netfilter/Match");
jmethodID
match_getType_id = (*env)->GetMethodID(env,
match_cls, "getType", "()I");
jmethodID
match_setType_id = (*env)->GetMethodID(env,
match_cls, "setType", "(I)V");
jmethodID
match_setSport_id = (*env)->GetMethodID(env,
match_cls, "setSport", "(I)V");
jmethodID
match_setDport_id = (*env)->GetMethodID(env,
match_cls, "setDport", "(I)V");
jmethodID
match_setTimeStart_id = (*env)->GetMethodID(env,
match_cls, "setTimeStart", "(Ljava/lang/String;)V");
jmethodID
match_setTimeStop_id = (*env)->GetMethodID(env,
match_cls, "setTimeStop", "(Ljava/lang/String;)V");
jmethodID
match_setMtu_id = (*env)->GetMethodID(env,
match_cls, "setMtu", "(I)V");
const char
*match_name = match->u.user.name;
if(strcmp(match_name, "tcp") == 0)
{
struct
ipt_tcp *m_tcp = (struct ipt_tcp*)match->data;
if(m_tcp->spts[0] ==
m_tcp->spts[1])
{
(*env)->CallObjectMethod(env, j_match,
match_setSport_id, m_tcp->spts[0]);
#include <libiptc/libiptc.h>
int main(void){
char *tab = "filter";
struct iptc_handle *handle;
const char *chain;
handle = iptc_init(tab); //初始化table
chain = iptc_first_chain(handle); //获取该table中的第一个chain
printf("chain : %s\n", chain);
return 1;
}
编译:
}
编译:
gcc -liptc test.c -o test
备注:
编译时候,是需要头文件libiptc.h和动态链接库libiptc.so
在SUSE 32位环境下,在调用iptc_first_chain时会出现段错误(Segmentation fault)。哪位大侠知道错误原因的话,还望多多指点,谢谢。
以下是我利用libiptc做的一个程序原代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <libiptc/libiptc.h>
#include <iptables.h>
#include <lib_netfilter.h>
#include <net/netfilter/nf_nat.h>
#include <linux/netfilter/xt_time.h>
//#define X64 1
//#define SHELL 1
#define TABS 12
#define MIN_PORT 0
#define MAX_PORT 65535
#define ipt_time xt_time_info
#define D_NO -1
#define D_DEBUG 0
#define RULE ipt_entry
//#define DEBUG D_DEBUG
#define XT_TIME_ALL_MONTHDAYS
#define XT_TIME_ALL_WEEKDAYS
#define XT_TIME_MIN_DAYTIME
#define
#define XT_TIME_LOOCAL_TZ
static char tables[][TABS] = {"filter", "mangle", "nat"};
static enum
{
};
static enum
{
};
static unsigned int time_parse_minutes(const char *str)
{
success:
error:
}
static void r_time_parse_minutes(int time, char *t_str)
{
}
static void fill_rule_match(JNIEnv *env, jobject j_match, struct ipt_entry_match *match)
{

加载中…