Linux Netfilter的mangle表的主要功能是根据规则修改数据包的一些标志位,以便其他规则或程序可以利用这种标志对数据包进行过滤或策略路由。
mangle表在五个链的位置都有注册。
注册函数如下:

static int __init iptable_mangle_init(void)
{int ret;/* 通过iptable_mangle_net_init函数调用ipt_register_table函数注册mangle表net->ipv4.iptable_mangle */ret = register_pernet_subsys(&iptable_mangle_net_ops);if (ret < 0)return ret;/* Register hooks *//* 向netfilter注册mangle表 */ret = nf_register_hooks(ipt_ops, ARRAY_SIZE(ipt_ops));if (ret < 0)goto cleanup_table;return ret;cleanup_table:unregister_pernet_subsys(&iptable_mangle_net_ops);return ret;
}

mangle表的hook定义,注册到五个链:

static struct nf_hook_ops ipt_ops[] __read_mostly = {{.hook     = ipt_pre_routing_hook,.owner      = THIS_MODULE,.pf      = PF_INET,.hooknum = NF_INET_PRE_ROUTING,.priority    = NF_IP_PRI_MANGLE,},{.hook        = ipt_local_in_hook,.owner     = THIS_MODULE,.pf      = PF_INET,.hooknum = NF_INET_LOCAL_IN,.priority   = NF_IP_PRI_MANGLE,},{.hook        = ipt_forward_hook,.owner      = THIS_MODULE,.pf      = PF_INET,.hooknum = NF_INET_FORWARD,.priority    = NF_IP_PRI_MANGLE,},{.hook        = ipt_local_hook,.owner        = THIS_MODULE,.pf      = PF_INET,.hooknum = NF_INET_LOCAL_OUT,.priority  = NF_IP_PRI_MANGLE,},{.hook        = ipt_post_routing_hook,.owner     = THIS_MODULE,.pf      = PF_INET,.hooknum = NF_INET_POST_ROUTING,.priority   = NF_IP_PRI_MANGLE,},
};

关于mangle表的hook函数,PREROUTING、LOCAL_IN、FORWORD、POSTROUTING的实现一样,
主要是实现对报文的匹配,遍历mangle表的所有规则,对数据包进行检查及修改报文内容,然后根据返回值作后续动作。

/* The work comes in here from netfilter.c. */
static unsigned int ipt_pre_routing_hook(unsigned int hook,struct sk_buff *skb,const struct net_device *in,const struct net_device *out,int (*okfn)(struct sk_buff *))
{return ipt_do_table(skb, hook, in, out,dev_net(in)->ipv4.iptable_mangle);
}

mangle表的LOCAL_OUT链的hook函数:

static unsigned int ipt_local_hook(unsigned int hook,struct sk_buff *skb,const struct net_device *in,const struct net_device *out,int (*okfn)(struct sk_buff *))
{unsigned int ret;const struct iphdr *iph;u_int8_t tos;__be32 saddr, daddr;u_int32_t mark;/* 增加对数据包长度的判断,如果ip报头不完整,* 则返回NF_ACCEPT,不进行mangle处理 *//* root is playing with raw sockets. */if (skb->len < sizeof(struct iphdr)|| ip_hdrlen(skb) < sizeof(struct iphdr))return NF_ACCEPT;/* 在mangle之前,保存报文中原有的头信息 *//* Save things which could affect route */mark = skb->mark;iph = ip_hdr(skb);saddr = iph->saddr;daddr = iph->daddr;tos = iph->tos;/* 对mangle表的处理 */ret = ipt_do_table(skb, hook, in, out,dev_net(out)->ipv4.iptable_mangle);/* Reroute for ANY change. */if (ret != NF_DROP && ret != NF_STOLEN && ret != NF_QUEUE) {iph = ip_hdr(skb);/* 注意,如果ip头发生改变(比如经过nat转换),则需要调用ip_rout_me_header重新计算路由 */if (iph->saddr != saddr ||iph->daddr != daddr ||skb->mark != mark ||iph->tos != tos)if (ip_route_me_harder(skb, RTN_UNSPEC))ret = NF_DROP;}return ret;
}

Linux Netfilter mangle表注册相关推荐

  1. Windows如何读取Linux,Linux下读取Windows注册表

    原本以为Linux下读取Windows的注册表是个异想天开.无法实现的想法,忽然发现了老外写的一段小文章 http://www.linuxidc.com/Linux/2011-04/34100p2.h ...

  2. Linux iptables之mangle表使用案例

    2019独角兽企业重金招聘Python工程师标准>>> mangle表的用途 mangle表的主要功能是根据规则修改数据包的一些标志位,以便其他规则或程序可以利用这种标志对数据包进行 ...

  3. 【转】Linux Netfilter实现机制和扩展技术

    转自https://www.ibm.com/developerworks/cn/linux/l-ntflt/index.html 作者: 杨沙洲 2.4.x的内核相对于2.2.x在IP协议栈部分有比较 ...

  4. Linux Netfilter实现机制和扩展技术

    Linux Netfilter实现机制和扩展技术 杨沙洲 ( pubb@163.net)国防科技大学计算机学院 简介: 本文从Linux网络协议栈中报文的流动过程分析开始,对Linux 2.4.x内核 ...

  5. linux netfilter 分析,Linux Kernel Netfilter Helper 分析

    linux netfilter 与helper相关的hook: 点击(此处)折叠或打开 { .hook = ipv4_conntrack_in, .owner = THIS_MODULE, .pf = ...

  6. Linux netfilter源码分析(6)

    六. 扩展的match 6.1 do_match函数  ip_tables.c do_match通过IPT_MATCH_ITERATE宏来调用, IPT_MATCH_ITERATE是在ipt_do_t ...

  7. Linux netfilter源码分析(4)

    四.nf_hook_ops 钩子的注册 在filter表的初始化函数static int __init init(void)中除了有一个nf_register_hook函数注册一个tables外,还由 ...

  8. linux Netfilter在网络层的实现详细分析(iptables)

    我在之前已经写过两篇关于netfilter的文章: Linux netfilter hook源码分析(基于内核代码版本4.18.0-80)_yg@hunter的博客-CSDN博客 Linux下使用Ne ...

  9. 6、iptables之RAW表和MANGLE表

    文章目录 1.说明 2.raw表 3.Mangle表 1.说明 RAW表 和 MANGLE 表 实事求是的说 在⼯工作中 ⼀一般⽤用到的确实⽐比较少,⽬前更更多的 还是处在⼀一个 探索和实验的阶段 后 ...

最新文章

  1. 【计算机网络】网络层 : IPv6 协议 ( IPv6 数据包格式 | IPv6 地址表示 | IPv6 地址类型 | IPv4 与 IPv6 协议对比 | IPv4 -> IPv6 过渡策略 )
  2. 当深度学习遇上异构并行计算
  3. 【转】中国式管理最有趣的地方,可能就在这些关键词之中
  4. 取表单radio值时
  5. Linux进程里运行新代码,linux调度器源码分析 - 新进程加入(三)
  6. extjs 关于dom操作的几个库
  7. Python的第三方库pandas
  8. 通过pyhive连接hive需要的Python包
  9. 八人抢答器讲解_八人竞赛抢答器需求分析
  10. PMP课程笔记:第12章 项目采购管理
  11. Windows下有关(下载与播放)软件
  12. 还在为满意的渐变色发愁吗?10+个网站帮你解决烦恼
  13. alsa设置默认声卡
  14. Android手机无法上网怎么办,Android手机的WIFI连接上了却不能上网是怎么回事如何解决...
  15. layui表格合并的方法
  16. 谈谈玩游戏遇到的问题(巫师3)
  17. 常用又有趣的网站大合集
  18. 高速电路中电容的选型和应用——详解
  19. 解决Idea Translation插件翻译失败 更新TKK失败 time out 问题
  20. 科普 | 浅谈基因检测

热门文章

  1. 土人健身之初学者的增肌完全攻略
  2. UE4开发HTML5遇到的问题
  3. java 传递字符串数组_将数组中字符串的值传递给java中的方法?
  4. Python+PyQt5实现“灭霸响指”命令 !
  5. 《Crafting A Tiny Open World: A Short Hike Postmortem》独立游戏开发分享
  6. centos7安装zookeeper
  7. 2021年中国基金服务行业相关政策及行业发展规模分析:凭借政策的扶持、出色的业绩以及投资理财需求的激增,基金业发展迅速[图]
  8. Excel中横向的如何快速定位
  9. ubuntu的Upstart启动流程
  10. java输出x的值或无解,你所不知道的Java之Integer