clear ip df kernel module

此模块比较简单, 主要目的在使用GRE隧道时强制对数据报文长度>GRE隧道MTU的IPv4 DF标志的报文进行分片. Linux默认丢弃此类报文并根据PMTUD是否响应ICMP报文, 而不是直接进行分片!
加载此模块后会对所有数据ipv4报文强制清除DF标志.
:
未启用PMTUD功能;
Linux GRE 隧道默认MTU 1476, 默认对所有未设置DF标志报文进行分片后再ENCAP;

prepare

yum install gcc makc perl elfutils-libelf-devel kernel-devel kernel-headers

source

#ifdef    MODVERSIONS
#include  <linux/modversions.h>
#endif#include <linux/version.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/skbuff.h>
#include <linux/netdevice.h>
#include <linux/netfilter_ipv4/ip_tables.h>
#include <linux/types.h>
#include <linux/random.h>
#include <linux/vmalloc.h>
#include <linux/init.h>
#include <net/pkt_sched.h>
#include <net/ip.h>
#include <net/tcp.h>
#include <net/udp.h>
#include <net/icmp.h>
#include <linux/inet.h>
#include <linux/list.h>
#include <linux/mm.h>
#include <linux/sysctl.h>
#include <linux/fs.h>
#include <linux/kernel_stat.h>
#include <linux/if_vlan.h>
#include <linux/netfilter_bridge.h>
#include <linux/inetdevice.h>
#include <asm/uaccess.h>        /* for put_user */
#include <asm/atomic.h>        /* for put_user */#include "dbg.h"#define MTU_DST        1400#define MKIPV4(a,b,c,d) \(u32)(((__u8)d & 0xFF) << 24 | ((__u8)c & 0xFF) << 16 | ((__u8)b & 0xFF) << 8 | (a & 0xFF))#if LINUX_VERSION_CODE <= KERNEL_VERSION(4, 13, 0)
/*include/linux/netfilter.h
typedef unsigned int nf_hookfn(const struct nf_hook_ops *ops,struct sk_buff *skb,const struct net_device *in,const struct net_device *out,
#ifndef __GENKSYMS__const struct nf_hook_state *state
#elseint (*okfn)(struct sk_buff *)
#endif);*/
static unsigned int
nf_ip_input(const struct nf_hook_ops *ops,struct sk_buff *skb,const struct net_device *in,const struct net_device *out,
#ifndef __GENKSYMS__const struct nf_hook_state *state
#elseint (*okfn)(struct sk_buff *)
#endif
)
#else
/*typedef unsigned int nf_hookfn(void *priv,struct sk_buff *skb,const struct nf_hook_state *state);
*/static unsigned int
nf_ip_input(void *priv,struct sk_buff *skb,const struct nf_hook_state *state)
#endif
{struct iphdr *iph = NULL;iph = ip_hdr(skb);if (iph->frag_off & __constant_htons(IP_DF)) {iph->frag_off &= ~(__constant_htons(IP_DF));iph->check = 0;iph->check = ip_fast_csum((unsigned char *)iph, iph->ihl);}return NF_ACCEPT;
}static struct nf_hook_ops nf_hook_ops[] __read_mostly = {{.hook       = nf_ip_input,
#if LINUX_VERSION_CODE <= KERNEL_VERSION(3, 10, 0).owner      = THIS_MODULE,
#endif.pf         = PF_INET,.hooknum    = NF_INET_PRE_ROUTING,.priority   = NF_IP_PRI_FIRST,},
};int nf_ip_df_init( void )
{int err = 0;pr_notice( "nf_ip_df_init..\n" );
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,13,0) err = nf_register_net_hook(&init_net, nf_hook_ops);
#elseerr = nf_register_hooks(nf_hook_ops, ARRAY_SIZE(nf_hook_ops));
#endifif (err < 0) {pr_notice("nf_ip_df_init: can't register hooks.\n");}pr_emerg( "INT_MIN = %d\n", INT_MIN );pr_info( "ip_mtu: register hooks success.\n" );return err;
}void nf_ip_df_fini(void)
{pr_notice( "nf_ip_df_fini..\n" );
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,13,0) nf_unregister_net_hook(&init_net, nf_hook_ops);
#elsenf_unregister_hooks(nf_hook_ops, ARRAY_SIZE(nf_hook_ops));
#endif
}module_init(nf_ip_df_init);
module_exit(nf_ip_df_fini);
MODULE_LICENSE( "GPL" );

Makefile

ARCH := x86
KVER := $(shell uname -r)
KSP ?= /lib/modules/$(KVER)/build#EXTRA_CFLAGS +=-DTESTobj-m += ip_df.oall: cleanmake -C $(KSP) M=`pwd` modulesclean:make -C $(KSP) M=`pwd` cleanrm -f Module.symversrm -f modules.ordertest:insmod ip_df.ko

Linux下使用Netfilter强制清除IPv4 DF标志相关推荐

  1. linux svn配置提交输入备注,linux下svn服务强制添加备注(注释)提交

    标签: linux下svn服务强制添加备注(注释)提交 Linux版本: line-height: 26px; white-space: normal; background-color: rgb(2 ...

  2. iptables命令_理解 Linux 下的 Netfilter/iptables

    Netfilter/iptables 项目由 Rusty Russe 创建于1998年,并于 1999 年建立了 Netfilter Core team,并在此后负责维护此项目,同时也于2000年3月 ...

  3. Linux 下Xorddos的木马清除

    本次实验使用Xorddos的病毒,作为模拟应急响应 ,自己的一次小计. 病毒清理 目录 本次实验使用Xorddos的病毒,作为模拟应急响应 ,自己的一次小计. 病毒清理 看到网上还有拓展知识 还有一种 ...

  4. Linux下使用Netfilter框架编写内核模块(统计协议层ping特定地址丢包数)

    一.linux内核中neitfilter的处理过程 1.5个HOOK点的执行点说明: 数据包从进入系统,进行IP校验以后,首先经过第一个HOOK函数NF_IP_PRE_ROUTING进行处理: 然后就 ...

  5. 洞悉linux下的Netfilteriptables:什么是Netfilter?

    转自:http://blog.chinaunix.net/uid-23069658-id-3160506.html (一)洞悉linux下的Netfilter&iptables:什么是Netf ...

  6. linux下iptables和netfilter详解(4):洞悉实现流程及协议栈分析

    (一)洞悉linux下的Netfilter&iptables:什么是Netfilter? 很多人在接触iptables之后就会这么一种感觉:我通过iptables命令配下去的每一条规则,到底是 ...

  7. 洞悉linux下的Netfilteriptables

    原网址:http://blog.chinaunix.net/uid-23069658-id-3160506.html (一)洞悉linux下的Netfilter&iptables:什么是Net ...

  8. linux idea 权限,Linux下idea由于缺少相关权限导致的tomcat ERROR

    昨天一天都在倒腾两个系统,也是醉了. 不过还好,系统修好了,在ubuntu下重新安装idea后,出现了这个错误: Intellij Idea Tmocat Error running Tomcat: ...

  9. (十)洞悉linux下的Netfilteramp;iptables:网络地址转换原理之SNAT

    源地址转换:SNAT SNAT 主要应用于下列场景: 这种情况下,我们只有一个公网地址A,而又有三台主机需要同时上网,这时就需要SNAT了.它的主要作用是将那些由私网发来的数据包skb的源地址改成防火 ...

  10. Linux_linux基础命令(增删查,权限,Linux下的重要目录,重要命令(. du, df, top, free, pstack, su, sudo).安装gcc/g++, gdb, vim )

    r:表示可读w:表示可写x:表示可执行也可以用数字表示这一点我们会在修改文件权限说明.对于文件夹的rwx表示:r表示可读及可以查看文件夹内容可以ls查看w表示可写及可以向文件夹中传送内容如文件x表示可 ...

最新文章

  1. php pkcs 1格式的公钥,解说--2--微信支付RSA公钥PKCS1格式转化成PKCS8格式的公钥
  2. opengl绘制长方体线框_OpenGL 绘制长方体 计算机图形学
  3. 实战SSM_O2O商铺_10【商铺注册】Service层的实现
  4. pain point
  5. android自带中文字体,Android更换系统默认显示的字体使用自定义字体
  6. Hexo如何绑定个人域名
  7. one-many和many-one的关系中的inverse的详解
  8. 自定义View之组合式
  9. margin-left:10px; 不同浏览器距离为什么不一样?
  10. 验证DG最大性能模式下使用ARCH/LGWR及STANDBY LOG的不同情况
  11. Android开发汇总帖子
  12. lmi克罗内克积 matlab_行正交矩阵的分层克罗内克积扩大法
  13. rest-assured实战
  14. 详解Linux帮助命令——help、--help、man、info
  15. 林书豪055-阿联德比
  16. 推荐王森的关于j2me开发的2本书!
  17. 段式存储、页式存储及段页式存 详解
  18. CPU是如何制造出来的(附高清全程图解)
  19. 2011年1月23日
  20. 数据库设计(ER模型和UML模型及转换为关系模型的公式)

热门文章

  1. java多线程开发--语法糖之synchronized关键字
  2. [Material Design] 教你做一个Material风格、动画的按钮(MaterialButton)
  3. 解决源码安装手册找不到问题
  4. Linux下vsftp服务器原理、安装、配置实战
  5. Linux必须熟记的文件
  6. java多线程小游戏_java控制台贪吃蛇小游戏(多线程版)
  7. python如何处理inp文件_python 之文件操作
  8. js删除数组中的对象_JS中的面向对象
  9. python json提取器_入门python爬虫,10分钟就够了,这可能是我见过最简单的基础教学...
  10. MySQL表中部分字段生成视图_MySQL学习笔记之视图