Linux网络截包不完全整理

继上一篇VLAN学习笔记大致理清Linux内核的网络收发架构后,我们可以发现,在网络收发的路径上,基本上每一个连接点都可以做网络截包,如果说L1驱动截包和L3netfilter截包是在必经之路上设伏的话,那L2虚拟设备,L3自定义协议等,就是在大路旁开出一条小路来劫道了。

网络截包是一项很有意思的课题,可以有数据过滤,防火墙,流量控制,报文篡改等诸多应用,按照内核分层架构将一些截包方法不完全整理如下,欢迎补充。

1、 L1层驱动截包法

在驱动中下手应该可以说是最贴近底层的,网卡驱动中总有rx接收和xmit发送函数,参数总是sk_buffer,在这里修改很黄很暴力,而且几乎不需要什么linux内核的知识。

xmit函数调用时的参数sk_buffer已经是一个发育健全的成熟体,因此在这里做过滤那真是得心应手美呆了,当然修改的时候还是要下一番功夫,而rx的时候则相反,可怜的sk_buffer在这时候只发育了链路层(L2)头部,一旦涉及到较为复杂的过滤,则需要做一些模拟协议栈的分析,如需要获取udp端口,就要从sk_buffer中先取出L3 IP层的长度,对sk_buffer->data作相应位移。

2、 L2层虚拟设备截包法

与具体网卡设备无关,通过register_netdevice注册一个net_device结构,在驱动层上虚拟一个设备节点(ethx.y),来实现截包,通过设置路由,让需要拦截的报文通过该设备节点发出,从而实现过滤。

正是因为需要结合路由来使用,该方法显得特别优雅,对目的IP的过滤甚至在路由设置中就已经完成,避免其他无关报文不必要的拦截判断。虚拟设备拦截到的sk_buffer也已经基本成熟了,可以方便的过滤。

可惜佛说,优点即缺点,正是因为需要结合路由使用,该法对接收报文的过滤和修改无能为力(如果理解有误欢迎指正)。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwpgfg.html