linux不适合数据传输,【Linux调试经验】局域网内数据传输不经过路由
问题/发现:
本人在为一款路由器写一个统计局域网互传流量的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调试经验】局域网内数据传输不经过路由相关推荐
- Windows共享Linux打印机,在Ubuntu系统中使用局域网内Windows共享打印机的方法
最近有一台HP打印机要使用,它连接一台Windows 7电脑,作为共享的打印机,然后我在Ubuntu系统中配置局域网内Windows共享打印机,阅读了很多教程才成功连接打印机,现在把方法分享出来.可以 ...
- 【Linux】29.扫描本机同一局域网内 某端口开启 的主机
扫描本机同一局域网内 某端口开启 的主机 关于nc的用法可参考博客<nc之netcat端口测试与nmap工具> 链接: https://www.cnblogs.com/chuyiwang/ ...
- 虚拟机linux环境的地址怎么映射给局域网内其他电脑访问
第一步:先把虚拟机linux环境,与windows环境ip和端口调通 参考地址:https://blog.csdn.net/weixin_44639164/article/details/122017 ...
- 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 ...
- linux网络音频播放,通过 PulseAudio 实现局域网音乐播放
PulseAudio 的一大特点就是支持网络音频流.经过几年的发展,现在通过简单的鼠标点击,即可实现局域网内远程音乐播放,甚至支持 Android 手机. PulseAudio 服务器配置 恕我愚钝, ...
- kail linux dns欺骗,Kali Linux渗透测试-Ettercap DNS欺骗攻击-Go语言中文社区
Kali Linux渗透测试-Ettercap DNS欺骗攻击 DNS欺骗攻击基于中间人攻击.攻击者更改受害者从DNS服务器查询的域名解析结果,给受害者发送恶意网页或者钓鱼网页-浏览器依然显示正常的u ...
- Linux下useradd命令与adduser命令的区别(adduser更适合初级使用者,useradd比较适合有些高阶经验的使用者)
文章目录 Linux下useradd命令与adduser命令的区别 man useradd man adduser Linux下useradd命令与adduser命令的区别 Linux下创建用户时会用 ...
- Linux 内核的测试和调试(1)
Linux 内核的测试和调试(1) Linux 内核测试哲学 不管是开源还是闭源,所有软件的开发流程中,测试是一个重要的.不可或缺的环节,Linux 内核也不例外.开发人员自测.系统测试.回归测试.压 ...
- Linux Kernel - Debug Guide (Linux内核调试指南 )
linux内核调试指南 一些前言 作者前言 知识从哪里来 为什么撰写本文档 为什么需要汇编级调试 ***第一部分:基础知识*** 总纲:内核世界的陷阱 源码阅读的陷阱 代码调试的陷阱 原理理解的陷阱 ...
最新文章
- 前端使用fis3开启本地服务器,并实现热加载功能
- 地图区域划分转换成数学模型解决问题
- 路由过滤之 Route-map Distribute-list
- 在系统出现未处理的错误时,在Global的Application_Error记录下错误
- 万字长文教你看懂java G1垃圾回收日志
- 造轮子-AgileConfig一个基于.NetCore开发的轻量级配置中心
- 七、内存、寄存器数据的传送
- 错误记录,找不到sqlite dll
- 基于Android Classic Bluetooth的蓝牙聊天软件
- 记录lombok的使用
- win7开机动画_win7电脑修改开机动画的操作方法
- 前端开发常用又好用的几个软件
- JS的基本概念和语法
- OpenStack in containers
- 赵小楼:《天道》《遥远的救世主》深度解析(22)丁元英为什么不问肖亚文以后有什么打算?
- PS2021 入门使用技巧
- one to one
- MS8006单片机开发IR红外遥控解码原理与程序实现(NEC)
- Memoires 5.0.0 日记本工具
- 钉钉开发系列(九)SaltUI在VS中的开发
热门文章
- MySQL数据库和ACID模型
- Portal-Basic Java Web 应用开发框架:应用篇(十四) —— 异步 Action
- xcode3.2.6升级至4.0.2经验加教训总结(转)
- 第11章 路由器OSPF动态路由配置
- Linux运行可执行文件
- 期待flash三剑客
- 数据科学家 数据工程师_数据科学家实际上赚了多少钱?
- android 字符串特殊字符转义
- sklearn.fit_两个小时后仍在运行吗? 如何控制您的sklearn.fit。
- 去除文件头部的u+feff_关于FEFF的简短故事,一个不可见的UTF-8字符破坏了我们的CSV文件