iptables深入解析-mangle篇

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介:       讲了filter、ct、nat 现在剩下最后一个知名模块mangle,但是自身虽然知道内核支持修改数据包的信息,它主要用在策略路由和qos上.我们就具体分析一下.      mangle表主要用于修改数据包的TOS(Type Of Service,服务类型)、TTL(T...
      讲了filter、ct、nat 现在剩下最后一个知名模块mangle,但是自身虽然知道内核支持修改数据包的信息,它主要用在策略路由和qos上.我们就具体分析一下.
     mangle表主要用于修改数据包的TOS(Type Of Service,服务类型)、TTL(Time To Live,生存周期)指以及为数据包设置Mark标记,以实现Qos(Quality Of Service,服务质量)调整以及策略路由等应用,由于需要相应的路由设备支持,因此应用并不广泛
    关于mangle模块,内核里主要有三个功能模块: mark match、MARK target 、CONNMARK target。
1)CONNMARK target的选项
选项        功能
--set-mark value[/mask]        给链接跟踪记录打标记。
--save-mark [--mask mask]        将数据包上的标记值记录到链接跟踪记录上。
--restore-mark [--mask mask]        重新设置数据包的nfmark值。
2)MARK target 的选项
选项        功能
--set-mark value        设置数据包的nfmark值。
--and-mark value        数据包的nfmark值和value进行按位与运算。
--or-mark  value        数据包的nfmark值和value进行按或与运算。
3)MARK match的选项
选项        功能
[!] --mark value[/mask]        数据包的nfmark值与value进行匹配,其中mask的值为可选的

先说说CONNMARK和MARK的区别:
同样是打标记,但CONNMARK是针对连接的,而MARK是针对单一数据包的
这两种机制一般都要和ip rule中的fwmark联用,实现对满足某一类条件的数据包的策略路由
1.对连接打了标记,只是标记了连接,没有标记连接中的每个数据包。标记单个数据包,也不会对整条连接的标记有影响。二者是相对独立的
2. 路由判定(routing decision)是以单一数据包为单位的。或者说,在netfilter框架之外,并没有连接标记的概念。或者说,ip命令只知道MARK, 而不知道CONNMARK是什么。
3.关键在于:给所有要进行ip rule匹配的单一数据包打上标记。方法一般有二:用MARK直接打,或者用CONNMARK –restore-mark把打在连接上的标记转移到数据包上。
下面就代码分析一下:
      mangle它的模块代码在iptable_mangle.c中它的初始化工作和之前的filter、nat类似.Mangle作用在所有的hook点
1.首先iptable_mangle.c的主要工作就是注册和初始化mangle表
注册mangl钩子函数.
2.其实我们发现除了ct的hook是单独处理外,其他的filter、nat、mangle都是通过hook之后调用ipt_do_table来处理,要么重点在match里,要么重点在target处理中.但是这个基本机制框架没变. 即都是通过rules.
3.首先我们就看看 –j  MARK –set-mark 1 这个target的执行
4.其实应该分析下规则的下发.
先看一条命令:
#iptables -t mangle -A PREROUTING -i eth0 -p tcp  --dport 80 -j MARK --set-mark 1

target  MARK

内核里是这样的

点击(此处)折叠或打开

  1. static unsigned int
  2. mark_tg(struct sk_buff *skb, const struct xt_action_param *par)
  3. {
  4.     const struct xt_mark_tginfo2 *info = par->targinfo;

  5.     skb->mark = (skb->mark & ~info->mask) ^ info->mark;
  6.     return XT_CONTINUE;
  7. }
它就是设置了skb->mark而已,并没有改变报文内容.
我们看看具体命令怎么配置:
mark match:它依赖MARK target 先设置标记
#iptables -A POSTROUTING -t mangle -m mark ! --mark 0 -j ACCEPT
MARK target:
iptables -t mangle -A PREROUTING -i eth0 -p tcp --dport 80 -j MARK --set-mark 1
CONNMARK target:
#iptables -A POSTROUTING -t mangle -j CONNMARK --save-mark
然后我们看看几种应用场景:
1. 策略路由
现要求对内网进行策略路由,所有通过TCP协议访问80端口的数据包都从ChinaNet线路出去,而所有访问UDP协议53号端口的数据包都从Cernet线路出去

打标记:

点击(此处)折叠或打开

  1. iptables -t mangle -A PREROUTING -i eth0 -p tcp --dport 80 -j MARK --set-mark 1 
  2. iptables -t mangle -A PREROUTING -i eth0 -p udp --dprot 53 -j MARK --set-mark 2
建表:

点击(此处)折叠或打开

  1. ip rule add from all fwmark 1 table 10
  2. ip rule add from all fwmark 2 table 20
策略路由:

点击(此处)折叠或打开

  1. ip route add default via 10.10.1.1 dev eth1 table 10
  2. ip route add default via 10.10.2.1 dev eth2 table 20
2. CONNMARK和MARK结合:

点击(此处)折叠或打开

  1. 1.iptables -A POSTROUTING -t mangle -j CONNMARK --restore-mark
  2. 2.iptables -A POSTROUTING -t mangle -m mark ! --mark 0 -j ACCEPT
  3. 3.iptables -A POSTROUTING -m mark --mark 0 -p tcp --dport 21 -t mangle -j MARK --set-mark 1
  4. 4.iptables -A POSTROUTING -m mark --mark 0 -p tcp --dport 80 -t mangle -j MARK --set-mark 2
  5. 5.iptables -A POSTROUTING -m mark --mark 0 -t mangle -p tcp -j MARK --set-mark 3 
  6. 6.iptables -A POSTROUTING -t mangle -j CONNMARK --save-mark
1)第1条规则就是完成了将链接跟踪上的标记记录到该连接上的每一个数据包中;
2)第2条规则判断数据包的标记,如果不为0,则直接ACCEPT。如果数据包上没有被打标记,则交由后面的规则进行匹配并打标记。这里为什么会出现经过了CONNMARK模块,数据包仍未被打标记呢?可以想到,如果一条链接的第1个数据包经过第1条规则处理之后,由于ct->mark为0,所以其数据包的标记skb->nfmark应该仍旧为0,就需要进行后面规则的匹配。
3)第3~5条规则,则按照匹配选项对符合规则的数据包打上不同的标记
4)第6条规则,则是把之前打的标记信息保存到ct里.
3.结合tc的应用:

点击(此处)折叠或打开

  1. #tc fi add dev eth0 parent 1: pref 1000 protocol ip handle 13 fw flowid 1:1
  2.  #iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST ACK -m length --length  40:60 -j MARK --set-mark 13
题外扯点其他东西:
mangle可以 修改 IP 包头的 TTL 值, 修改 ip 报头 dscp 值(QOS)
Iptables下MSS数据调整模块TCPMSS使用
比如说string模块其实挺强大的,本身已经支持过来报文data里特征码,但是功能依然有缺陷所以才有了l7的插件.

点击(此处)折叠或打开

  1. Iptables –A OUTPUT –m string –string “www.baidu.com” –algo bm –j DROP
关于algo参数的查找算法 它在内核里是通过textsearch_register注册的
内核默认注册了名字为fsm、bm 、kmp

简单的就说这么多,具体应用需求还需要我们自己去挖掘和开发.







相关文章
|
5月前
|
网络协议 Linux 网络安全
Iptables深度解析:四表五链与动作参数
Iptables深度解析:四表五链与动作参数
450 0
|
域名解析 网络协议 网络安全
实验:iptables防火墙+DNS分离解析
实验考察知识点: iptables防火墙的规则配置 DNS分离解析的配置
422 0
|
监控 安全 网络协议
iptables深入解析-nat篇
    关于nat,在实际应用中还是很广泛的,snat/dnat/dmz/等等.下面我们就结合代码深入分析下nat的运作.     参考:iptables.1.4.21  kernel 3.8.13    NAT英文全称是“Network Address Translation” 顾名思义,它是一种把内部私有网络地址(IP地址)翻译成合法网络IP地址的技术。
1695 0
|
网络协议 网络安全 算法
iptables深入解析-ct篇
    ct是netfilter非常重要的基础和架构核心.它为状态防火墙,nat等打下基础. 一直觉的它很神秘,所以就下定决心分析一下.     这里依然不从框架开始说,而是从实际代码着手.
2405 0
|
网络协议 Linux
iptables深入解析-filter应用篇
     上一篇文章分析了iptables代码下发运作的流程细节,篇幅有限还有很多需要补充.关于netfilter的框架网上已经被讲烂了,框架很简单,但是实现却不简单.但不论什么都要最终归到实际应用上,才能体现其价值.
1201 0
|
2天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
13 2
|
1月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
66 0

推荐镜像

更多