non*_*237 5 c linux security raw-sockets promiscuous-mode
我有一个使用 创建的套接字socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)),并使用以下命令将其设置为混杂模式:
struct ifreq ifr;
strncpy((char*)ifr.ifr_name, interface, IF_NAMESIZE);
if(ioctl(sock, SIOCGIFINDEX, &ifr)<0) fail(2);
struct packet_mreq mr;
memset(&mr, 0, sizeof(mr));
mr.mr_ifindex = ifr.ifr_ifindex;
mr.mr_type = PACKET_MR_PROMISC;
if(setsockopt(sock, SOL_PACKET, PACKET_ADD_MEMBERSHIP, &mr, sizeof(mr)) < 0) fail(2);
Run Code Online (Sandbox Code Playgroud)
问题是,当我read()从套接字执行 a 时,它只返回来自或传入我的计算机的数据。
我怎样才能让它读取和处理网络上的所有数据包?
Wireshark 可以正常显示所有数据包,因此我知道这不是我的计算机或网卡。ifconfig报告说它PROMISC正在运行。
根据 Rob Jones 的建议,尝试使用Wireshark等工具,以确保您在接口处收到预期的数据包。至少这会确认(或否认)您的代码有问题。
还需要确保接口本身设置为混杂模式。如果没有,那么您可以使用 ioctl() 来设置它:
ifr.ifr_flags |= IFF_PROMISC;
if( ioctl(sock, SIOCSIFFLAGS, &ifr) != 0 )
{
// handle error here
}
Run Code Online (Sandbox Code Playgroud)
当您的应用程序运行时,请确保 ifconfig 报告该接口的 PROMISC 标志。
请注意,这需要以特权用户身份执行。
尝试了所提供的代码。对我有用。当然(由于第 102 行的测试)这只会打印 TCP 流量的详细信息。
| 归档时间: |
|
| 查看次数: |
14600 次 |
| 最近记录: |