问题/发现:

本人在为一款路由器写一个统计局域网互传流量的Linux内核模块的时候,发现如下问题:

局域网内的一台设备和该局域网内另一台设备进行通信时,我在路由器的netfilter链表处设下钩子,以捕获数据。后来发现这些数据没有经过netfliter,而是直接投递到对方网卡上的。

设备物理连接图如下:

解释:

看似 个人手机 和 个人PC 这两台设备交换数据时 数据包“经由”了路由器,实际上,数据包如下图所示:

当设备 个人手机 想发送数据到 个人PC时,流程如下:

1. 个人手机 发送数据,数据无线传输到路由器 2.4GWiFi

2. 数据向 个人PC 和 路由器br0网卡 各投递一份

3.1 路由器br0网卡 对比数据包MAC字段,发现该数据包不是发往自己的,丢弃

3.2 个人PC 收到数据包,对比数据包MAC字段,发现和自己MAC匹配,送往内部。

流程如上所述,而我在路由器netfilter链设下“埋伏”想捕获数据的做法无异于海底捞月。

验证:

抓包分析如下图所示,个人手机 数据包目的地址直接是 个人PC 的MAC地址,而不是 路由器br0网卡 的MAC地址,所以在路由器端是捕获不到这些数据包的。

==================================================================================

以下内容为arvik在本篇博客写出几日后追加

更改时间:2016/03/14

作者:arvik

最终解决:

经过几日的思索,arvik最终一步步解决了问题。

解决思路:

局域网设备数据包互传是不经过路由器的,那怎么才能统计这些流量呢? 由上面的解释可知,数据包没有进入路由器br0网卡,所以关键问题就是让这些非本地的数据包能进入网卡。

实际上网卡是有这个功能的!

网卡一般有四种模式:

广播方式:该模式下的网卡能够接收网络中的广播信息。

组播方式:设置在该模式下的网卡能够接收组播数据。

直接方式:在这种模式下,只有目的网卡才能接收该数据。

混杂模式:在这种模式下的网卡能够接收一切通过它的数据,而不管该数据是否

是传给它的。

将网卡设置为混杂模式即可,如下:

将eth0设置成混杂模式

ifconfig br0 promisc

取消混杂命令如下:

ifconfig br0 -promisc

此时,局域网所有数据包都能进入路由器br0网卡。但是我们在netfilter还是不能统计,需将这些数据包引入netfilter结构,此时就需要稍微更改Linux内核代码了。更改如下:

在Linux内核源代码 /net/ipv4/ip_input.c文件中,第383,384行左右,有如下代码:

if (skb->pkt_type == PACKET_OTHERHOST)

goto drop;

注释掉,如下:

//if (skb->pkt_type == PACKET_OTHERHOST) //noted by arvik 20160314// goto drop;

重新编译即可。

此时需要注意了,大量的非本地的数据包也会流经路由器netfilter链,我们只是对这些做一些统计,记住:统计完一定要把这些非本地的数据包丢弃掉,否则会给整个系统增加额外的负担,直接现象就是CPU占用率暴增,网络卡顿!

且你的netfilter的钩子函数一定要尽量靠前,最好在pre_routing节点,且优先级比其他钩子函数优先级都要高,这样才能尽量减少系统的的额外负担。

在做完统计后做如下检测:

if(skb->pkt_type == PACKET_OTHERHOST) //this packet is belong to other host, drop it!

return NF_DROP;

此时在路由器本地也可用netfilter钩子统计局域网其他设备互访的流量了! (^_^)

linux不适合数据传输,【Linux调试经验】局域网内数据传输不经过路由相关推荐

  1. Windows共享Linux打印机,在Ubuntu系统中使用局域网内Windows共享打印机的方法

    最近有一台HP打印机要使用,它连接一台Windows 7电脑,作为共享的打印机,然后我在Ubuntu系统中配置局域网内Windows共享打印机,阅读了很多教程才成功连接打印机,现在把方法分享出来.可以 ...

  2. 【Linux】29.扫描本机同一局域网内 某端口开启 的主机

    扫描本机同一局域网内 某端口开启 的主机 关于nc的用法可参考博客<nc之netcat端口测试与nmap工具> 链接: https://www.cnblogs.com/chuyiwang/ ...

  3. 虚拟机linux环境的地址怎么映射给局域网内其他电脑访问

    第一步:先把虚拟机linux环境,与windows环境ip和端口调通 参考地址:https://blog.csdn.net/weixin_44639164/article/details/122017 ...

  4. Linux上抓arp包,linux c arp协议分析一 - 捕捉局域网内的arp包

    一.实验步骤: 1.假设监听方IP为192.168.1.33 2.假设arp请求发起方的IP为192.168.250 3.在192.168.1.33中开启catcharppacket 4.在192.1 ...

  5. linux网络音频播放,通过 PulseAudio 实现局域网音乐播放

    PulseAudio 的一大特点就是支持网络音频流.经过几年的发展,现在通过简单的鼠标点击,即可实现局域网内远程音乐播放,甚至支持 Android 手机. PulseAudio 服务器配置 恕我愚钝, ...

  6. kail linux dns欺骗,Kali Linux渗透测试-Ettercap DNS欺骗攻击-Go语言中文社区

    Kali Linux渗透测试-Ettercap DNS欺骗攻击 DNS欺骗攻击基于中间人攻击.攻击者更改受害者从DNS服务器查询的域名解析结果,给受害者发送恶意网页或者钓鱼网页-浏览器依然显示正常的u ...

  7. Linux下useradd命令与adduser命令的区别(adduser更适合初级使用者,useradd比较适合有些高阶经验的使用者)

    文章目录 Linux下useradd命令与adduser命令的区别 man useradd man adduser Linux下useradd命令与adduser命令的区别 Linux下创建用户时会用 ...

  8. Linux 内核的测试和调试(1)

    Linux 内核的测试和调试(1) Linux 内核测试哲学 不管是开源还是闭源,所有软件的开发流程中,测试是一个重要的.不可或缺的环节,Linux 内核也不例外.开发人员自测.系统测试.回归测试.压 ...

  9. Linux Kernel - Debug Guide (Linux内核调试指南 )

    linux内核调试指南 一些前言 作者前言 知识从哪里来 为什么撰写本文档 为什么需要汇编级调试 ***第一部分:基础知识*** 总纲:内核世界的陷阱 源码阅读的陷阱 代码调试的陷阱 原理理解的陷阱 ...

最新文章

  1. 前端使用fis3开启本地服务器,并实现热加载功能
  2. 地图区域划分转换成数学模型解决问题
  3. 路由过滤之 Route-map Distribute-list
  4. 在系统出现未处理的错误时,在Global的Application_Error记录下错误
  5. 万字长文教你看懂java G1垃圾回收日志
  6. 造轮子-AgileConfig一个基于.NetCore开发的轻量级配置中心
  7. 七、内存、寄存器数据的传送
  8. 错误记录,找不到sqlite dll
  9. 基于Android Classic Bluetooth的蓝牙聊天软件
  10. 记录lombok的使用
  11. win7开机动画_win7电脑修改开机动画的操作方法
  12. 前端开发常用又好用的几个软件
  13. JS的基本概念和语法
  14. OpenStack in containers
  15. 赵小楼:《天道》《遥远的救世主》深度解析(22)丁元英为什么不问肖亚文以后有什么打算?
  16. PS2021 入门使用技巧
  17. one to one
  18. MS8006单片机开发IR红外遥控解码原理与程序实现(NEC)
  19. Memoires 5.0.0 日记本工具
  20. 钉钉开发系列(九)SaltUI在VS中的开发

热门文章

  1. MySQL数据库和ACID模型
  2. Portal-Basic Java Web 应用开发框架:应用篇(十四) —— 异步 Action
  3. xcode3.2.6升级至4.0.2经验加教训总结(转)
  4. 第11章 路由器OSPF动态路由配置
  5. Linux运行可执行文件
  6. 期待flash三剑客
  7. 数据科学家 数据工程师_数据科学家实际上赚了多少钱?
  8. android 字符串特殊字符转义
  9. sklearn.fit_两个小时后仍在运行吗? 如何控制您的sklearn.fit。
  10. 去除文件头部的u+feff_关于FEFF的简短故事,一个不可见的UTF-8字符破坏了我们的CSV文件