原始套接字绑定多个接口
本帖最后由 YY_ICECOLD 于 2015-05-16 12:05 编辑我自己写了一个抓包程序,使用原始套接字抓取链路层的报文,绑定的接口是eth0,现在我想同时抓eth1的包,想问一下两个接口绑定在同一个套接字上可以吗?
我自己写了测试程序,发现可以同时抓到eth0和eth1的ICMP包,但是在网上找不到相关资料,不知道这样写是否有问题?
代码如下:if ((sock=socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP)))<0) {
perror("socket");
exit(1);
}
#if 1
//set tpacket hdr version.
if (-1 == setsockopt (sock, SOL_PACKET, PACKET_VERSION, &tpacket_version, sizeof (int)))
{
fprintf (stderr, "set tpacket version failure: %s.\n", strerror (errno));
goto close_sock;
}
#endif
/* bind to device. */
if (-1 == setsockopt (sock, SOL_SOCKET, SO_BINDTODEVICE, dev, strlen(dev) + 1))
{
fprintf (stderr, "bind to %s failure: %s.\n", dev, strerror (errno));
exit(1);
}
/* bind to device. */
if (-1 == setsockopt (sock, SOL_SOCKET, SO_BINDTODEVICE, "eth1", strlen("eth1") + 1))
{
fprintf (stderr, "bind to %s failure: %s.\n", "eth1", strerror (errno));
exit(1);
} tcpdump可以同时抓2个接口的报文吗? 本帖最后由 conjurator 于 2015-05-17 19:33 编辑
回复 1# YY_ICECOLD
从你的代码来看,你没有调用bind,所以你没有绑定任何的interface。相当于wireshark,选择ANY的状态.
SO_BINDTODEVICE不是像你想的那样工作的
如果一定要用一个PACKET SOCKET,可以尝试一下SO_ATTACH_FILTER 3楼说的对,PF_PACKET的接口绑定是通过bind来完成的。
可以看一下net\packet\af_packet.c,它的实现还是比较简单的。
PS,SO_ATTACH_FILTER应该没办法基于接口进行过滤吧?只能基于数据包的内容来过滤。 回复 3# conjurator
确实如此,这2个接口设置没有什么作用,所有接口报文都会被抓到
回复 4# nswcfd
SO_ATTACH_FILTER 好像也不能对两个接口同时抓包,不知道还有什么方法没
tcpdump也是只能抓一个接口的报文
回复 4# nswcfd
no expert in BPF, but it seems to me, 'LD_IFINDEX' instruction could do the trick. {
"LD_IFINDEX",
.u.insns = {
BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
SKF_AD_OFF + SKF_AD_IFINDEX),
BPF_STMT(BPF_RET | BPF_A, 0)
},
CLASSIC,
{ },
{ { 1, SKB_DEV_IFINDEX }, { 10, SKB_DEV_IFINDEX } },
},
回复 7# conjurator
you are right.
in sk_run_filter, SKF_AD_XXX is used to load meta information from skb structure.
BTW, which tcpdump/pcap-filter syntax is used to generate such BPF filter codes?
or have to write raw BPF codes ?
页:
[1]