LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1664|回复: 9

用linuxsniffer在Fedora3下运行,网卡设为混杂模式,却只能得到本地IP,还有些组广播地

[复制链接]
发表于 2005-8-24 15:45:25 | 显示全部楼层 |阅读模式
/**********************************结果如下:********************/
2005-8-24 15:25:58
length:216
Source host : 218.193.10.123
Dest host : 218.193.10.255
Source,Dest ports : 138,138
Layer-4 protocol : 17

2
2005-8-24 15:25:59
length:92
Source host : 218.193.10.123
Dest host : 218.193.10.255
Source,Dest ports : 137,137
Layer-4 protocol : 17

3
2005-8-24 15:25:59
length:92
Source host : 218.193.10.20
Dest host : 218.193.10.255
Source,Dest ports : 137,137
Layer-4 protocol : 17

/***************************************源代码:*******************/
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <linux/in.h>
#include <linux/if_ether.h>
#include <net/if.h>
#include <time.h>

int
main(int argc, char **argv) {

int                           wholength;
int                          sock, n,step=0;
char                      buffer[4096];   
unsigned char    *iphead , *ethhead;
struct                    ifreq ethreq;  /* the strcut of the ether */
time_t                  timep; /*get the system time */
int                         td[11];

struct                    tm *p;
FILE                     *fp;/*store the data*/
void                          settd(struct tm *p,int *td);

/* open the file */
if( ( fp=fopen("hh.log","a") ) == NULL)
        {
                fprintf(stderr, "can not open log\n");
                exit(0);
        }

/* open a socket to get the data */
if ( (sock=socket(PF_PACKET, SOCK_RAW,htons(ETH_P_IP)))<0) {
perror("socket");
exit(1);
}

/* Set the network card in promiscuos mode */
strncpy(ethreq.ifr_name,"eth0",IFNAMSIZ);
if (ioctl(sock,SIOCGIFFLAGS,&ethreq)==-1) {
perror("ioctl");
close(sock);
exit(1);
}
ethreq.ifr_flags|=IFF_PROMISC;
if (ioctl(sock,SIOCSIFFLAGS,&ethreq)==-1) {
perror("ioctl");
close(sock);
exit(1);
}
while (1) {
time(&timep);
p=gmtime(&timep);
settd(p,td);
fprintf(fp,"%d-%d-%d %d:%d:%d\n",td[0],td[1],td[2],td[3],td[4],td[5]);

n = recvfrom(sock,buffer,4096,0,NULL,NULL);
fprintf(fp,"length:%d \n",n);

/* Check to see if the packet contains at least
* complete Ethernet (14), IP (20) and TCP/UDP
* (8) headers.
*/
if (n<42) {
perror("recvfrom():");
printf("Incomplete packet (errno is %d)\n",errno);
close(sock);
exit(0
}
/* get the data from buffer[4996] */
iphead = buffer+14; /* Skip Ethernet header */
if (*iphead==0x45) { /* Double check for IPv4
                      * and no options presnt */

fprintf(fp,"Source host : %d.%d.%d.%d\n",
iphead[12],iphead[13],
iphead[14],iphead[15]);
fprintf(fp,"Dest host : %d.%d.%d.%d\n",
iphead[16],iphead[17],
iphead[18],iphead[19]);
fprintf(fp,"Source,Dest ports : %d,%d\n",
(iphead[20]<<8)+iphead[21],
(iphead[22]<<8)+iphead[23]);
fprintf(fp,"Layer-4 protocol : %d\n",iphead[9]);
}
}
fclose(fp);
return 0;
}

void settd(struct tm *p,int *td)  
{
       int i;
       td[0]=p->tm_year+1900;
       td[1]=p->tm_mon+1;
       if(p->tm_hour>15)
       {
              td[2]=p->tm_mday+1;
              td[3]=p->tm_hour-16;
         }
         else
         {
               td[2]=p->tm_mday;
               td[3]=p->tm_hour+8;
         }
        td[4]=p->tm_min;
        td[5]=p->tm_sec;
        td[6]=p->tm_wday+1;
}
 楼主| 发表于 2005-8-24 15:53:16 | 显示全部楼层
曾经使用一次,可以获得其他IP,比如218.193.10.123->218.193.10.56
后来一直都没办法再获得
SNIFFER的条件是要在一个要集线器的局域网内,监听链路层,获得相关信息,
然后我在局域网上运行,仍然是类似结果
不明白为什么,请指教!!!!!
回复 支持 反对

使用道具 举报

发表于 2005-8-24 16:00:31 | 显示全部楼层
组广播的内容,大家都能得到,所以你的机器也能得到。当然,给你的包,你也能得到。

其他的,都已经让交换机转给正确的地址了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-24 16:18:13 | 显示全部楼层
网卡是正常模式的话,没错,是那样

可是我已经把网卡设为混杂模式,它可以接收所有在网络上传播的数据包

不管它的目的地址是不是我的IP
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-25 14:53:34 | 显示全部楼层
自己顶一下,高手help,3x !
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-25 15:26:17 | 显示全部楼层
sorry,原来内部局域网是用交换机连接的

正如暗然销魂兄所说,数据包是一对一发送的,而不是希望中的广播发送

嗯,郁闷之余,想问的是,为什么只可以收到发给我的包,发出去的包怎么截获不到?

还有在另一台机器上(由路由器连到因特网)安装tcpdump,它可以收到其他IP传输的信息,

这是什么原理?还请不吝赐教,谢谢!
回复 支持 反对

使用道具 举报

发表于 2005-8-26 16:23:56 | 显示全部楼层
发出的包,是不是你截取的方式错了?不会截取不到的。

那台机器,是不是本身连接路由器,作为一个网关存在?如果是,那么访问Internet的全部内容都他可以看到的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-29 09:48:15 | 显示全部楼层
Post by tobyforever
sorry,原来内部局域网是用交换机连接的

正如暗然销魂兄所说,数据包是一对一发送的,而不是希望中的广播发送

嗯,郁闷之余,想问的是,为什么只可以收到发给我的包,发出去的包怎么截获不到?

还有在另一台机器上(由路由器连到因特网)安装tcpdump,它可以收到其他IP传输的信息,

这是什么原理?还请不吝赐教,谢谢!


很纳闷,发出去的数据包怎么也接受不到?

我测试的那一台机器不是主机

因为是局域网是用交换机连接的,所以会收不到其他主机的IP包
回复 支持 反对

使用道具 举报

发表于 2005-8-31 16:19:10 | 显示全部楼层

关于网卡的混杂模式

1、要求网卡工作在混杂模式
2、要求网络环境是网卡端口可以接收到所有网络包,具体如下:
a、是hub这种情况最简单直接可以得到所有网络包
b、交换机,在这种环境下可以在网关机器上设置混杂模式,或者是可管理的交换机在交换机上设置mirror模式
回复 支持 反对

使用道具 举报

发表于 2005-9-1 16:02:33 | 显示全部楼层
这个不是你的程序的问题,是因为现在都是交换机连成的网络, 这就决定了数据包不可能以广播的方式在网络里传播(除了广播包以外)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表