我在同一局域网中连接了3台笔记本电脑。
第1圈:192.168.1.2我将lap-1作为服务器并在9333端口上进行侦听。第2圈担任客户。使用netcat我将数据从第2圈发送到第1圈。我能够在第1圈使用pcap捕获数据包。我使用sudo ifconfig eth0 promisc
启用了混杂模式。同样在pcap_live_open
方法中,我设置了混杂模式标志。
然后我关闭了混杂模式以及pcap_live_open
函数。我仍然可以捕获数据包。
我搜索了混杂模式,我可以推断的是,如果设备在混杂模式下打开一个接口,它将能够捕获连接到该网络的所有数据包。
所以考虑到这一点,我把第3圈作为服务器,第2圈仍然是客户端。我按照与上面相同的程序进行操作。我在第1圈运行pcap可执行文件,希望我能够捕获在第3圈和第2圈之间传输的数据包,但在第1圈运行的pcap无法在混杂模式下运行。所有3圈都连接到同一网络。
任何人都可以通过简单的场景启发我使用混杂模式吗?
这是我的pcap代码: 29988是9333的反向(交换),我只是在寻找它。
#include <pcap/pcap.h>
#include <stdint.h>
const u_char *packet;
int main()
{
char *dev = "eth0";
pcap_t *handle;
int j=0;
char errbuf[PCAP_ERRBUF_SIZE];
struct bpf_program fp;
bpf_u_int32 mask;
bpf_u_int32 net;
struct pcap_pkthdr header;
uint8_t *ip_header_len;
uint16_t ip_header_len_val;
uint16_t *port;
/* Find the properties for the device */
while (pcap_lookupnet(dev, &net, &mask, errbuf) == -1) {
printf("Couldn't get netmask for device %s: %s\n", dev, errbuf);
net = 0;
mask = 0;
}
printf("lookedup pcap device: %s\n", dev);
/* Open the session in promiscuous mode */
handle = pcap_open_live(dev, BUFSIZ,1,0, errbuf);
if (handle == NULL) {
printf("Couldn't open device %s: %s\n", dev, errbuf);
}
/* Compile and apply the filter */
if (pcap_compile(handle, &fp, filter_exp, 0, net) == -1) {
printf("Couldn't parse filter %s: %s\n", filter_exp, pcap_geterr(handle));
pcap_close(handle);
}
/* if (pcap_setfilter(handle, &fp) == -1) {
printf("Couldn't install filter %s: %s", filter_exp, pcap_geterr(handle));
return(-1);
}
*/
/* Grab a packet */
while ((packet = pcap_next(handle, &header)) != NULL)
{
uint16_t *data_size;
uint16_t size,total_len_val,tcp_header_len_val;
char tdata[128];
uint8_t *data,*tcp_header_len;
uint16_t *total_len;
//ip_proto = (uint8_t *)&packet[9];
ip_header_len = (uint8_t *)&packet[14];
ip_header_len_val = (*ip_header_len) & 0x0F;
ip_header_len_val = ip_header_len_val*4;
// printf("IP header len val:%d\n",ip_header_len_val);
port = (uint16_t *)&packet[14+ip_header_len_val+2];
//printf("port:%d\n",*port);
total_len = (uint16_t *)&packet[14+2];
total_len_val = ((*total_len) >> 8) & 0x00FF;
total_len_val = total_len_val + (((*total_len) << 8) & 0xFF00);
//total_len_val=*total_len;
// printf("tot len val:%d\n",total_len_val);
tcp_header_len = (uint8_t *)&packet[14+ip_header_len_val+12];
tcp_header_len_val = (*tcp_header_len) & 0xF0;
tcp_header_len_val = tcp_header_len_val>>4;
tcp_header_len_val = tcp_header_len_val * 4;
// printf("tcp header len val:%d\n",tcp_header_len_val);
size = (total_len_val- ip_header_len_val) - tcp_header_len_val;
data = (uint8_t *)&packet[14+ip_header_len_val+tcp_header_len_val];
memset(tdata,0,128);
mempcpy(tdata,data,size);
tdata[size]='\0';
if((*port)==29988)
{
printf("Data Packet:%s\n",tdata);
}
}
}
答案 0 :(得分:4)
我希望当你说他们都在同一个网络上时,你的意思是他们连接到同一个以太网交换机。该开关只会将数据发送到发往laptop1的laptop1。在过去常常使用以太网集线器的情况下,所有流量都流向所有连接的设备,但现在交换机非常便宜,集线器不再常见。如果你能找到一个集线器,那么你可以尝试一下,但除此之外你只能看到发往你设备的流量。
答案 1 :(得分:0)
正如Brad所说,路由器知道目标设备连接到哪个端口,因此它只在那里发送数据包。如果您想尝试这一点,可以使用VirtualBox或VMware,并连接虚拟网络中的计算机。