用这种方式可以设置网卡为混杂模式, 代码如下
void
set_promisc (int sockfd, char *interface)
{
int s;
struct ifreq ifr;
strcpy(ifr.ifr_name, interface);
s = ioctl(sockfd, SIOCGIFFLAGS, &ifr);
if (s < 0) {
close(sockfd);
perror("can not get flags");
return;
}
ifr.ifr_flags |= IFF_PROMISC;
s = ioctl(sockfd, SIOCSIFFLAGS, &ifr);
if (s < 0) {
close(sockfd);
perror("can not set flags");
return;
}
}
socketfd 是 socket 函数返回的 fd,interface 是网卡名字, 使用 ifconfig 可以看到 PROMISC
wlp4s0: flags=4419<UP,BROADCAST,RUNNING,PROMISC,MULTICAST> mtu 1500
inet 192.168.212.237 netmask 255.255.252.0 broadcast 192.168.215.255
inet6 fe80::4298:b56b:882c:b27c prefixlen 64 scopeid 0x20<link>
ether e4:a4:71:e4:be:11 txqueuelen 1000 (Ethernet)
RX packets 13617741 bytes 12026115621 (11.2 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 8344313 bytes 1515273567 (1.4 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
然后我看了 libpcap 的接口 pcap_open_live,第三个参数为 true 的时候是设置为混杂模式,我设置了 true,使用 ifconfig 没有看到 PROMISC 阿。。。
混杂模式是不是必须在网卡看到 PROMISC 才算开启了?
1
aip 2017-05-13 19:35:00 +08:00 1
dmesg | tail
进入混杂模式的话,dmesg 应该会有消息的。 |
2
mengyaoss77 2017-05-13 19:42:58 +08:00
貌似不是所有的网卡都能混杂模式吧?
我最近也想用 wireshark 混杂模式抓个包的,结果发现并不能开启混杂,不知道为啥 |
3
linhua 2017-05-13 20:55:38 +08:00
|
4
Halry 2017-05-13 21:29:09 +08:00 via iPhone
@mengyaoss77 网卡一般都支持,看驱动了
|
6
hilyjiang 2017-05-20 12:51:32 +08:00
当然得网卡开了混杂模式才行。
开: ifconfig eth0 promisc 关: ifconfig eth0 -promisc |