YY_ICECOLD 发表于 2015-05-16 12:05

原始套接字绑定多个接口

本帖最后由 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);
    }

YY_ICECOLD 发表于 2015-05-16 14:39

tcpdump可以同时抓2个接口的报文吗?

conjurator 发表于 2015-05-17 19:20

本帖最后由 conjurator 于 2015-05-17 19:33 编辑

回复 1# YY_ICECOLD

从你的代码来看,你没有调用bind,所以你没有绑定任何的interface。相当于wireshark,选择ANY的状态.
SO_BINDTODEVICE不是像你想的那样工作的
如果一定要用一个PACKET SOCKET,可以尝试一下SO_ATTACH_FILTER

nswcfd 发表于 2015-05-19 10:12

3楼说的对,PF_PACKET的接口绑定是通过bind来完成的。
可以看一下net\packet\af_packet.c,它的实现还是比较简单的。

PS,SO_ATTACH_FILTER应该没办法基于接口进行过滤吧?只能基于数据包的内容来过滤。

YY_ICECOLD 发表于 2015-05-19 15:26

回复 3# conjurator


确实如此,这2个接口设置没有什么作用,所有接口报文都会被抓到

   

YY_ICECOLD 发表于 2015-05-19 15:30

回复 4# nswcfd

SO_ATTACH_FILTER 好像也不能对两个接口同时抓包,不知道还有什么方法没

tcpdump也是只能抓一个接口的报文

   

conjurator 发表于 2015-05-19 17:03

回复 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 } },
      },

nswcfd 发表于 2015-05-19 21:13

回复 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]
查看完整版本: 原始套接字绑定多个接口