우분투 브릿지 모드에서 패킷 캡쳐
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//#include
#define NF_IP_LOCAL_IN 1
static struct proc_dir_entry *packet_dir=NULL;
static struct proc_dir_entry *packets=NULL;
static char proc_buf[100];
static int proc_buf_size=0;
/*static void print_str(char *str) {
struct tty_struct *my_tty;
my_tty = current->signal->tty;
if(my_tty != NULL)
((my_tty->driver)->write(my_tty,str,strlen(str)));
}*/
/*
static int readproc(char * page, char **start, off_t off, int count, int *eof, void *data){
memcpy(page, proc_buf, proc_buf_size);
return proc_buf_size;
}*/
/*
static int writeproc(struct file *file, const char *buffer, unsigned long count, void *data) {
copy_from_user(proc_buf, buffer, count);
return count;
}*/
unsigned int hook_simple(unsigned int hook_no, struct sk_buff *skb, const struct net_device *dev_in, const struct net_device *dev_out, int (*handler)(struct sk_buff *)) {
struct iphdr *iph = ip_hdr(skb);
struct tcphdr *th = tcp_hdr(skb);
/*
if(iph->protocol == 6) printk(KERN_ERR "TCP\n");
if(iph->protocol == 17) return NF_DROP;
//printk(KERN_ERR "UDP\n");*/
char *data = NULL;
int ctr=0;
unsigned int length=0;
unsigned long saddr=0, daddr=0;
unsigned short sport=0, dport=0;
length = ((skb)->len) - (iph->ihl*4) - (th->doff*4); // data size
length = ((skb)->data_len);
data = kmalloc(length, GFP_KERNEL);
saddr = iph->saddr;
proc_buf_size += sprintf(proc_buf, "%lu.%lu.%lu.%lu\n",
(saddr&0xFF000000)>>24, (saddr&0x00FF0000)>>16,
(saddr&0x0000FF00)>>8 , (saddr&0x000000FF));
daddr = iph->daddr;
sport = th->source;
dport = th->dest;
memset(data, 0, length);
memcpy(data, (unsigned char *)th + th->doff*4, length);
saddr = ntohl(iph->saddr);
daddr = ntohl(iph->daddr);
sport = th->source;
dport = th->dest;
/*
printk(KERN_ALERT "%lu.%lu.%lu.%lu:%5u --> %lu.%lu.%lu.%lu:%5u \n",
(saddr&0xFF000000)>>24, (saddr&0x00FF0000)>>16,
(saddr&0x0000FF00)>>8 , (saddr&0x000000FF), sport,
(daddr&0xFF000000)>>24, (daddr&0x00FF0000)>>16,
(daddr&0x0000FF00)>>8 , (daddr&0x000000FF), dport);
*/
for(ctr=0; ctrlen);
kfree(data);
return NF_ACCEPT;
}
static struct nf_hook_ops nfilter = {
.hook = hook_simple,
.pf = PF_INET,
.hooknum = NF_IP_LOCAL_IN,
.priority = NF_IP_PRI_FIRST
};
int nfilter_init(void) {
int ret;
packet_dir = proc_mkdir("packets", NULL);
packets = create_proc_entry("packet", 0, packet_dir);
//packets->read_proc = readproc;
//packets->write_proc = writeproc;
ret = nf_register_hook(&nfilter);
if (ret < 0){
printk(KERN_ALERT "netfilter init error!. \n");
return ret;
}else {
printk(KERN_ALERT "netfilter start. \n");
return 0;
}
}
void nfilter_exit(void) {
nf_unregister_hook(&nfilter);
remove_proc_entry("packet", packet_dir);
remove_proc_entry("packets", 0);
printk(KERN_ALERT "netfilter finish. \n");
}
module_init(nfilter_init);
module_exit(nfilter_exit);
이게 소스인데요 이렇게 해서 패킷은 보이는데 저는 브릿지 유틸을 이용해서 브릿지 역할을 하는 컴퓨터로 패킷을 잡으려고 하거든요 근데 자기에게 오는 브로드캐스트나 유니캐스트는 다 신호가 잡히는네 이 컴퓨터에 연결한 내부 내트워크고 들어가는 다른 지나가는 패킷은 잡히지가 않습니다 문제가 무엇일까요?
어떤분이 hook이 local_in 이라 그렇다는데 그럼 자기에게 오는게 아니라 자기를 통해 지나가는 패킷도 캡쳐 하려면 어떻게 해야 할까요 ? 친절한 답변 부탁드립니다
NF_IP_LOCAL_IN을 NF_IP_FORWARD로
참조 : http://wiki.kldp.org/Translations/html/Netfilter-hacking-KLDP/net-arch.html
댓글 달기