免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2327 | 回复: 7
打印 上一主题 下一主题

[网络子系统] 原始套接字绑定多个接口 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-05-16 12:05 |只看该作者 |倒序浏览
本帖最后由 YY_ICECOLD 于 2015-05-16 12:05 编辑

我自己写了一个抓包程序,使用原始套接字抓取链路层的报文,绑定的接口是eth0,现在我想同时抓eth1的包,想问一下两个接口绑定在同一个套接字上可以吗?

我自己写了测试程序,发现可以同时抓到eth0和eth1的ICMP包,但是在网上找不到相关资料,不知道这样写是否有问题?


代码如下:
  1. if ((sock=socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP)))<0) {
  2.         perror("socket");
  3.         exit(1);
  4.     }

  5. #if 1
  6.     //set tpacket hdr version.
  7.     if (-1 == setsockopt (sock, SOL_PACKET, PACKET_VERSION, &tpacket_version, sizeof (int)))
  8.     {
  9.         fprintf (stderr, "set tpacket version failure: %s.\n", strerror (errno));
  10.         goto close_sock;  
  11.     }
  12. #endif

  13.     /* bind to device. */
  14.     if (-1 == setsockopt (sock, SOL_SOCKET, SO_BINDTODEVICE, dev, strlen(dev) + 1))
  15.     {
  16.         fprintf (stderr, "bind to %s failure: %s.\n", dev, strerror (errno));
  17.         exit(1);
  18.     }

  19.    /* bind to device. */
  20.     if (-1 == setsockopt (sock, SOL_SOCKET, SO_BINDTODEVICE, "eth1", strlen("eth1") + 1))
  21.     {
  22.         fprintf (stderr, "bind to %s failure: %s.\n", "eth1", strerror (errno));
  23.         exit(1);
  24.     }
复制代码

论坛徽章:
0
2 [报告]
发表于 2015-05-16 14:39 |只看该作者
tcpdump可以同时抓2个接口的报文吗?

论坛徽章:
0
3 [报告]
发表于 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

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
4 [报告]
发表于 2015-05-19 10:12 |只看该作者
3楼说的对,PF_PACKET的接口绑定是通过bind来完成的。
可以看一下net\packet\af_packet.c,它的实现还是比较简单的。

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

论坛徽章:
0
5 [报告]
发表于 2015-05-19 15:26 |只看该作者
回复 3# conjurator


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

   

论坛徽章:
0
6 [报告]
发表于 2015-05-19 15:30 |只看该作者
回复 4# nswcfd

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

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

   

论坛徽章:
0
7 [报告]
发表于 2015-05-19 17:03 |只看该作者
回复 4# nswcfd


no expert in BPF, but it seems to me, 'LD_IFINDEX' instruction could do the trick.
  1.         {
  2.                 "LD_IFINDEX",
  3.                 .u.insns = {
  4.                         BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  5.                                  SKF_AD_OFF + SKF_AD_IFINDEX),
  6.                         BPF_STMT(BPF_RET | BPF_A, 0)
  7.                 },
  8.                 CLASSIC,
  9.                 { },
  10.                 { { 1, SKB_DEV_IFINDEX }, { 10, SKB_DEV_IFINDEX } },
  11.         },
复制代码

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
8 [报告]
发表于 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 ?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP